import * as plugins from './mod.plugins.js';
import prettier from 'prettier';
import { Project } from '../classes.project.js';

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

const prettierDefaultTypeScriptConfig: prettier.Options = {
  printWidth: 100,
  parser: 'typescript',
  singleQuote: true,
};

const prettierDefaultMarkdownConfig: prettier.Options = {
  singleQuote: true,
  printWidth: 100,
  parser: 'markdown',
};

const filesToFormat = [`ts/**/*.ts`, `test/**/*.ts`, `readme.md`, `docs/**/*.md`];

const choosePrettierConfig = (fileArg: plugins.smartfile.SmartFile) => {
  switch (fileArg.parsedPath.ext) {
    case '.ts':
      return prettierDefaultTypeScriptConfig;
    case '.md':
      return prettierDefaultMarkdownConfig;
    default:
      return {};
  }
};

const prettierTypeScriptPipestop = plugins.through2.obj(
  async (fileArg: plugins.smartfile.SmartFile, enc, cb) => {
    const fileString = fileArg.contentBuffer.toString();
    const chosenConfig = choosePrettierConfig(fileArg);
    const filePasses = await prettier.check(fileString, chosenConfig);
    if (filePasses) {
      logger.log('info', `OK! -> ${fileArg.path} passes!`);
      cb(null);
    } else {
      logger.log('info', `${fileArg.path} is being reformated!`);
      const formatedFileString = await prettier.format(fileString, chosenConfig);
      fileArg.setContentsFromString(formatedFileString);
      cb(null, fileArg);
    }
  },
);

export const run = async (projectArg: Project) => {
  const formatStreamWrapper = new plugins.smartstream.StreamWrapper([
    plugins.smartgulp.src(filesToFormat),
    prettierTypeScriptPipestop,
    plugins.smartgulp.replace(),
  ]);
  await formatStreamWrapper.run().catch((error) => {
    console.log(error);
  });
};