import { FrameworkSetting, UserInput } from '../../../types/types.js';
import { updateApi } from '../../update/api.js';
import {
  defaultFrameworkSetting,
  defaultNewApiSetting,
} from '../../../types/default-type-values.js';
import { ArgumentsCamelCase } from 'yargs';
import { createConfigFile, loadJSON } from '../../../utils/json.js';
import { configBlockExists, createConfigMessages, executeTask } from '../../../utils/constants.js';
import { getApiInputs } from '../../user-inputs.js';
import { BoykaError } from '../../../utils/boyka-error.js';

export const createApiSetting = (inputs: UserInput) => {
  const frameworkSetting: FrameworkSetting = {
    ...defaultFrameworkSetting,
    api: {
      ...defaultNewApiSetting(inputs.config_name),
    },
  };
  const api = frameworkSetting.api;
  if (api) updateApi(inputs, api[inputs.config_name]);
  return frameworkSetting;
};

export const handleAddApiConfig = async (argv: ArgumentsCamelCase) => {
  const name = argv.name as string;
  const path = argv.path as string;
  const configPath = path === '.' ? process.cwd() : path;

  const inputs = {
    platform: 'api',
    config_name: name,
  } satisfies UserInput;
  await getApiInputs(inputs);

  const settings = loadJSON(configPath) as FrameworkSetting;
  const apiSetting = settings.api;
  if (apiSetting?.[name]) {
    throw new BoykaError(configBlockExists('API', name));
  }
  const newApiSetting = defaultNewApiSetting(name);
  updateApi(inputs, newApiSetting[name]);
  settings.api = {
    ...apiSetting,
    ...newApiSetting,
  };
  await executeTask(
    createConfigFile(configPath, settings),
    createConfigMessages(configPath, 'updated'),
  );
};
