import { Table } from "../../classes/Table";
import { IConfig } from "../../../interfaces/config";
import * as path from "path";
import * as fse from "fs-extra";
import { CONSTANT } from "../../../utils/constants";
import utils from "../../../utils/general-utils";
import * as ctrlCrudMethodsWriter from "./write-controller-crud-methods";


export function generate(tables: Array<Table>, config: IConfig) {
    let controllerPath = config.ORM_GENERATE.path.controllers;

    for (let x of tables) {
        if (config.CRUD_GENERATE.ignoreTables.indexOf(x.tableName) > -1) {
            continue;
        }

        const upperCaseTableName = utils.capitalizeFirstLetter(x.tableName);
        let sFile = "";

        if (controllerPath && fse.pathExistsSync(`${controllerPath}/${upperCaseTableName}/${upperCaseTableName}.controller.ts`)) {
            console.log(upperCaseTableName + ".controller.ts encountered. Skipping... no overwrite occurred");
        } else {
 
            console.log("writing: ", `${controllerPath}/${upperCaseTableName} Controller`);
            sFile = `import { Request, Response } from "express" \n` +
                    `import { respond } from "../../classes/respond" \n` +
                    `import ${upperCaseTableName}Service from "../../services/${upperCaseTableName}.service"; \n` +
                    `import { ${upperCaseTableName} } from "../../daos/${upperCaseTableName}" \n\n` +
                    `class ${upperCaseTableName}Controller { \n ` +
                    `\t_${x.tableName}Service = ${upperCaseTableName}Service` +
                    `\n\n\t${CONSTANT.GENERATED_CONTROLLER_METHODS}` +

                    `${ctrlCrudMethodsWriter.get(x, config)}` +

                    `\n} \n\n` +
                    `\n\n export default new ${upperCaseTableName}Controller()`;
    
            fse.outputFileSync(`${controllerPath}/${upperCaseTableName}/${upperCaseTableName}.controller.ts`, sFile, "utf8");
    
            sFile = "";
        } 
    }
}

