import { Table } from "../../classes/Table";
import { IConfig } from "../../../interfaces/config";
import utils from "../../../utils/general-utils";

export function get(table: Table, config: IConfig) {
    const pkLower = config.ORM_GENERATE.pkIdentifier;
    const pkUpper = utils.capitalizeFirstLetter(pkLower);
    const upperCaseTableName = utils.capitalizeFirstLetter(table.tableName);
    const pluralizedLowerCaseTableName = utils.pluralize(table.tableName);
    const pluralizedUpperCaseTableName = utils.capitalizeFirstLetter(utils.pluralize(upperCaseTableName));

    return (`
    
    // GET ALL
    public getAll${pluralizedUpperCaseTableName} = async (req: Request, res: Response): Promise<any> => {
        try {
            const ${pluralizedLowerCaseTableName} = <${upperCaseTableName}[]>await this._${table.tableName}Service.findAll${pluralizedUpperCaseTableName}();
            respond(res, { data: { ${pluralizedLowerCaseTableName} } });  
        } catch (err) {
            console.log("err: ", err);
            respond(res, { err });
        }
    }

    // GET ALL BY PRIMARY KEY
    public getAll${pluralizedUpperCaseTableName}By${pkUpper} = async (req: Request, res: Response): Promise<any> => {
        try {
            const ${table.tableName} = await this._${table.tableName}Service.findAll${pluralizedUpperCaseTableName}By${pkUpper}(req.params.${pkLower});
            respond(res, { data: { ${table.tableName} } });
        } catch (err) {
            console.log("err: ", err);
            respond(res, { err });
        }
    }

    // GET ONE BY PRIMARY KEY
    public get${upperCaseTableName}By${pkUpper} = async (req: Request, res: Response): Promise<any> => {
        try {
            const ${table.tableName} = await this._${table.tableName}Service.findOne${upperCaseTableName}By${pkUpper}(req.params.${pkLower});
            respond(res, { data: { ${table.tableName} } });
        } catch (err) {
            console.log("err: ", err);
            respond(res, { err });
        }
    }

    // PUT
    public update${upperCaseTableName} = async (req: Request, res: Response): Promise<any> => {
        try {
            const reqBody: {${table.tableName}: ${upperCaseTableName}} = req.body;
            const updates: any = await this._${table.tableName}Service.update${upperCaseTableName}(reqBody.${table.tableName});
            respond(res, { data: { updates } });
        } catch (err) {
            console.log("err: ", err);
            respond(res, { err });
        }
    }

    // POST ONE
    public save${upperCaseTableName} = async (req: Request, res: Response): Promise<any> => {
        try {
            const reqBody: {${table.tableName}: ${upperCaseTableName}} = req.body;
            const saved${upperCaseTableName}: ${upperCaseTableName} = <${upperCaseTableName}>await this._${table.tableName}Service.save${upperCaseTableName}(reqBody.${table.tableName});
            respond(res, { data: { saved${upperCaseTableName} } });
        } catch (err) {
            console.log("err: ", err);
            respond(res, { err });
        }
    }

    // POST BATCH
    public batchSave${pluralizedUpperCaseTableName} = async (req: Request, res: Response): Promise<any> => {
        try {
            const reqBody: {${pluralizedUpperCaseTableName}: ${upperCaseTableName}[]} = req.body;
            const saved${pluralizedUpperCaseTableName}: any = await this._${table.tableName}Service.batchSave${pluralizedUpperCaseTableName}(reqBody.${pluralizedUpperCaseTableName});
            respond(res, { data: { saved${pluralizedUpperCaseTableName} } });
        } catch (err) {
            console.log("err: ", err);
            respond(res, { err });
        }
    }

    // DELETE
    public delete${upperCaseTableName}By${pkUpper} = async (req: Request, res: Response): Promise<any> => {
        try {
            const deletes: any = await this._${table.tableName}Service.delete${upperCaseTableName}By${pkUpper}(req.body.${pkLower} || req.params.${pkLower});
            respond(res, { data: { deletes } });
        } catch (err) {
            console.log("err: ", err);
            respond(res, { err });
        }
    }
    `)
}