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


// IMPORT CUSTOM
import { ConfigurationService } from './../../services/ConfigurationService';
import { VerificationJWT } from '../../middleware/auth/VerificationJWT';
import { Validator } from '../../middleware/validator/Validator';
import { Configuration, ConfigurationParams } from '../../entity/Configuration';


@Controller("/admin/configuration")
@Docs("docs_admin")
export class ConfigurationController {
    constructor(private configurationService: ConfigurationService) { }


    // =====================GET LIST=====================
    @Get('')
    @UseAuth(VerificationJWT)
    @Validator({})
    async findAll(
        @HeaderParams("token") token: string,
        @Req() req: Request,
        @Res() res: Response
    ) {
        const configurations = await Configuration.find()
        return res.sendOK(configurations)
    }


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


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


    // =====================INIT=====================
    @Post('/init')
    @UseAuth(VerificationJWT)
    @Validator({})
    async init(
        @Req() req: Request,
        @Res() res: Response,
        @HeaderParams("token") token: string,
    ) {
        this.configurationService.initParam(1, ConfigurationParams.MinPrice, '10000')
        return res.sendOK({}, "Init success")
    }


} // END FILE
