/*
Copyright (C) 2026  Cloudbase Solutions SRL
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

import type { InstanceScript, UserScriptTarget } from "@src/@types/Instance";

export type UserScriptsState = {
  uploadedScripts: InstanceScript[];
  removedScripts: InstanceScript[];
};

const matchesTarget = (script: InstanceScript, target: UserScriptTarget) =>
  target.global
    ? script.global === target.global
    : script.instanceId === target.instanceId;

export const applyUserScriptsChange = (
  prev: UserScriptsState,
  target: UserScriptTarget,
  scripts: InstanceScript[],
  hadExisting: boolean,
): UserScriptsState => {
  const uploadedScripts = [
    ...prev.uploadedScripts.filter(s => !matchesTarget(s, target)),
    ...scripts,
  ];
  let removedScripts = prev.removedScripts.filter(
    s => !matchesTarget(s, target),
  );
  if (scripts.length === 0 && hadExisting) {
    removedScripts = [
      ...removedScripts,
      {
        global: target.global,
        instanceId: target.instanceId,
        scriptContent: null,
        fileName: null,
      },
    ];
  }
  return { uploadedScripts, removedScripts };
};
