// IMPORT LIBRARY
import { Controller, Post, UseAuth, Req, Request, Res, Response, HeaderParams, BodyParams, Get, PathParams, QueryParams } from '@tsed/common';
import { Docs } from '@tsed/swagger';
import Joi from '@hapi/joi';
import { Like } from 'typeorm';


// IMPORT CUSTOM
import { VerificationJWT } from '../../middleware/auth/VerificationJWT';
import { Validator } from '../../middleware/validator/Validator';
import { {{classify}} } from '../../entity/{{classify}}';


@Controller("{{controller}}")
@Docs("docs_{{docs}}")
export class {{classify}}Controller {
    constructor() { }


    // =====================GET LIST=====================
    @Get('')
    @UseAuth(VerificationJWT)
    @Validator({
        page: Joi.number().min(0),
        limit: Joi.number().min(0)
    })
    async findAll(
        @HeaderParams("token") token: string,
        @QueryParams("page") page: number,
        @QueryParams("limit") limit: number,
        @QueryParams("search") search: string = "",
        @Req() req: Request,
        @Res() res: Response
    ) {
        const [{{camel}}, total] = await {{classify}}.findAndCount({
            skip: (page - 1) * limit,
            take: limit,
            where: {
                name: Like(`%${search}%`),
                // name: Raw(alias => `concat( ${alias}, " ",  phone) LIKE "%${search}%"`),
            },
            order: { id: "DESC" },
        })
        return res.sendOK({ data: {{camel}}, total })
    }


    // =====================GET ITEM=====================
    @Get('/:{{camel}}Id')
    @UseAuth(VerificationJWT)
    @Validator({
        {{camel}}Id: Joi.number().required(),
    })
    async findOne(
        @HeaderParams("token") token: string,
        @Req() req: Request,
        @Res() res: Response,
        @PathParams("{{camel}}Id"){{camel}}Id: number,
    ) {
        const {{camel}} = await {{classify}}.findOneOrThrowId({{camel}}Id)
        return res.sendOK({{camel}})
    }


    // =====================CREATE ITEM=====================
    @Post('')
    @UseAuth(VerificationJWT)
    @Validator({
        {{camel}}: Joi.required(),
    })
    async create(
        @HeaderParams("token") token: string,
        @Req() req: Request,
        @Res() res: Response,
        @BodyParams("{{camel}}") {{camel}}: {{classify}},
    ) {
        await {{camel}}.save()
        return res.sendOK({{camel}})
    }
    

    // =====================UPDATE ITEM=====================
    @Post('/:{{camel}}Id/update')
    @UseAuth(VerificationJWT)
    @Validator({
        {{camel}}: Joi.required(),
        {{camel}}Id: Joi.number().required()
    })
    async update(
        @HeaderParams("token") token: string,
        @Req() req: Request,
        @Res() res: Response,
        @BodyParams("{{camel}}") {{camel}}: {{classify}},
        @PathParams("{{camel}}Id") {{camel}}Id: number,
    ) {
        // This will check and throw error if not exist 
        await {{classify}}.findOneOrThrowId({{camel}}Id)
        {{camel}}.id = +{{camel}}Id
        await {{camel}}.save()
        return res.sendOK({{camel}})
    }

} // END FILE
