import * as plugins from './mod.plugins.js';
import * as paths from '../paths.js';

import { logger } from '../gitzone.logging.js';
import { Project } from '../classes.project.js';

/**
 * takes care of updating files from templates
 */
export const run = async (project: Project) => {
  const templateModule = await import('../mod_template/index.js');

  // update tslint
  // getting template
  const tslintTemplate = await templateModule.getTemplate('tslint');
  await tslintTemplate.writeToDisk(paths.cwd);
  logger.log('info', 'Updated tslint.json!');

  // update vscode
  const vscodeTemplate = await templateModule.getTemplate('vscode');
  await vscodeTemplate.writeToDisk(paths.cwd);
  logger.log('info', `Updated vscode template!`);

  // update gitlab ci and Dockerfile
  switch (project.gitzoneConfig.data.projectType) {
    case 'npm':
    case 'wcc':
      if (project.gitzoneConfig.data.npmciOptions.npmAccessLevel === 'public') {
        const ciTemplateDefault = await templateModule.getTemplate('ci_default');
        ciTemplateDefault.writeToDisk(paths.cwd);
      } else {
        const ciTemplateDefault = await templateModule.getTemplate('ci_default_private');
        ciTemplateDefault.writeToDisk(paths.cwd);
      }
      logger.log('info', 'Updated .gitlabci.yml!');
      break;
    case 'service':
    case 'website':
      const ciTemplateDocker = await templateModule.getTemplate('ci_docker');
      await ciTemplateDocker.writeToDisk(paths.cwd);
      logger.log('info', 'Updated CI/CD config files!');

      // lets care about docker
      const dockerTemplate = await templateModule.getTemplate('dockerfile_service');
      dockerTemplate.writeToDisk(paths.cwd);
      logger.log('info', 'Updated Dockerfile!');

      // lets care about cli
      const cliTemplate = await templateModule.getTemplate('cli');
      await cliTemplate.writeToDisk(paths.cwd);
      logger.log('info', 'Updated cli.ts.js and cli.js!');
      break;
    default:
      break;
  }

  // update html
  if (project.gitzoneConfig.data.projectType === 'website') {
    const websiteUpdateTemplate = await templateModule.getTemplate('website_update');
    await websiteUpdateTemplate.supplyVariables({
      assetbrokerUrl: project.gitzoneConfig.data.module.assetbrokerUrl,
      legalUrl: project.gitzoneConfig.data.module.legalUrl,
    })
    await websiteUpdateTemplate.writeToDisk(paths.cwd);
    logger.log('info', `Updated html for website!`);
  } else if (project.gitzoneConfig.data.projectType === 'service') {
    const websiteUpdateTemplate = await templateModule.getTemplate('service_update');
    await websiteUpdateTemplate.writeToDisk(paths.cwd);
    logger.log('info', `Updated html for element template!`);
  } else if (project.gitzoneConfig.data.projectType === 'wcc') {
    const wccUpdateTemplate = await templateModule.getTemplate('wcc_update');
    await wccUpdateTemplate.writeToDisk(paths.cwd);
    logger.log('info', `Updated html for wcc template!`);
  }
};