import * as plugins from './mod.plugins.js';
import * as paths from '../paths.js';
import * as gulpFunction from '@push.rocks/gulp-function';
import { Project } from '../classes.project.js';

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

/**
 * ensures a certain dependency
 */
const ensureDependency = async (
  packageJsonObjectArg: any,
  position: 'dep' | 'devDep' | 'everywhere',
  constraint: 'exclude' | 'include' | 'latest',
  dependencyArg: string,
) => {};

export const run = async (projectArg: Project) => {
  const formatStreamWrapper = new plugins.smartstream.StreamWrapper([
    plugins.smartgulp.src([`package.json`]),
    gulpFunction.forEach(async (fileArg: plugins.smartfile.SmartFile) => {
      const npmextraConfig = new plugins.npmextra.Npmextra(paths.cwd);
      const gitzoneData: any = npmextraConfig.dataFor('gitzone', {});
      const fileString = fileArg.contents.toString();
      const packageJson = JSON.parse(fileString);

      // metadata
      packageJson.repository = {
        type: 'git',
        url: `git+https://${gitzoneData.module.githost}/${gitzoneData.module.gitscope}/${gitzoneData.module.gitrepo}.git`,
      };
      (packageJson.bugs = {
        url: `https://${gitzoneData.module.githost}/${gitzoneData.module.gitscope}/${gitzoneData.module.gitrepo}/issues`,
      }),
        (packageJson.homepage = `https://${gitzoneData.module.githost}/${gitzoneData.module.gitscope}/${gitzoneData.module.gitrepo}#readme`);

      // Check for module type
      if (!packageJson.type) {
        logger.log('info', `setting packageJson.type to "module"`);
        packageJson.type = 'module';
      }

      // Check for private or public
      if (packageJson.private !== undefined) {
        logger.log('info', 'Success -> found private/public info in package.json!');
      } else {
        logger.log('error', 'found no private boolean! Setting it to private for now!');
        packageJson.private = true;
      }

      // Check for license
      if (packageJson.license) {
        logger.log('info', 'Success -> found license in package.json!');
      } else {
        logger.log('error', 'found no license! Setting it to UNLICENSED for now!');
        packageJson.license = 'UNLICENSED';
      }

      // Check for build script
      if (packageJson.scripts.build) {
        logger.log('info', 'Success -> found build script in package.json!');
      } else {
        logger.log('error', 'found no build script! Putting a placeholder there for now!');
        packageJson.scripts.build = `echo "Not needed for now"`;
      }

      // Check for buildDocs script
      if (!packageJson.scripts.buildDocs) {
        logger.log('info', 'found no buildDocs script! Putting tsdoc script there now.');
        packageJson.scripts.buildDocs = `tsdoc`;
      }

      // check for files
      packageJson.files = [
        'ts/**/*',
        'ts_web/**/*',
        'dist/**/*',
        'dist_*/**/*',
        'dist_ts/**/*',
        'dist_ts_web/**/*',
        'assets/**/*',
        'cli.js',
        'npmextra.json',
        'readme.md',
      ];

      // check for dependencies
      await ensureDependency(packageJson, 'devDep', 'latest', '@push.rocks/tapbundle');
      await ensureDependency(packageJson, 'devDep', 'latest', '@git.zone/tstest');
      await ensureDependency(packageJson, 'devDep', 'latest', '@git.zone/tsbuild');

      // exclude
      // TODO

      fileArg.setContentsFromString(JSON.stringify(packageJson, null, 2));
    }),
    plugins.smartgulp.replace(),
  ]);
  await formatStreamWrapper.run().catch((error) => {
    console.log(error);
  });
};