import fs from 'fs';
import path from 'path';
import { configFileName, danger, executeTask, info, success, warn } from '../utils/constants.js';
import check from '../data/check-messages.json' with { type: 'json' };
import { Message } from '../types/types.js';

const printIntroMessage = () => {
  console.info(info(check.intro));
};

const pomMessage = {
  success: success(check.messages.pom.success.replace('{0}', process.cwd())),
  error: danger(check.messages.pom.error.replace('{0}', process.cwd())),
  loading: warn(check.messages.pom.loading.replace('{0}', process.cwd())),
  suggestion: warn(check.messages.pom.suggestion),
} satisfies Message;

const checkPomFile = () => {
  return fs.existsSync(path.join(process.cwd(), 'pom.xml'));
};

const resourceMessage = {
  success: success(check.messages.resources.success.replace('{0}', process.cwd())),
  error: danger(check.messages.resources.error.replace('{0}', process.cwd())),
  loading: warn(check.messages.resources.loading.replace('{0}', process.cwd())),
  suggestion: warn(check.messages.resources.suggestion),
} satisfies Message;

const checkResourcesFolder = () => {
  return fs.existsSync(path.join(process.cwd(), 'src/test/resources'));
};

const configMessage = {
  success: success(check.messages.config.success.replace('{0}', process.cwd())),
  error: danger(check.messages.config.error.replace('{0}', process.cwd())),
  loading: warn(check.messages.config.loading.replace('{0}', process.cwd())),
  suggestion: warn(check.messages.config.suggestion),
} satisfies Message;

const checkConfigFile = () => {
  return fs.existsSync(path.join(process.cwd(), 'src/test/resources', configFileName));
};

export const handleDoctor = async () => {
  printIntroMessage();
  await executeTask(checkPomFile(), pomMessage);
  await executeTask(checkResourcesFolder(), resourceMessage);
  await executeTask(checkConfigFile(), configMessage);
};
