import { Controller, Request, Post, Body, Get, Res, UseGuards,Param, Put, Query, Delete, Patch, Req } from '@nestjs/common';
import { ApiParam, ApiQuery, ApiTags, ApiBody, ApiConsumes } from '@nestjs/swagger';
import { FaqsService } from './faqs.services';
import { toJsonResponse } from '../../common/response';

import { AdminGuard } from 'src/modules/auth/guards/admin.guard';
import { CommonGuard } from 'src/modules/auth/guards/common.guard';

// DTO Files
import { FaqsListQueryDto } from "./dtos/faqs-list-query.dto";
import { FaqsCreateDto } from './dtos/faqs-create.dto';
import { FaqsUpdateDto } from './dtos/faqs-update.dto';
import { FaqsIdParamDto } from './dtos/faqs-id-param.dto';

@ApiTags('faqs')
@Controller('faqs')
export class FaqsController {
    constructor(private faqsService: FaqsService) { }

    @ApiQuery({ name: 'page', required : false, example : 1 })
    @ApiQuery({ name: 'sort_by', required: false, type : 'string' })
    @ApiQuery({ name: 'sort', required: false, type : 'string' })
    @ApiQuery({ name: 'search', required: false, type : 'string' })
    @UseGuards(CommonGuard)
    @Get()
    async list(@Query() queryParam: FaqsListQueryDto,@Request() req,@Res() response:any)
    {
        try {
            const data = await this.faqsService.list(queryParam,req.user);
            response.status(200).json(data);
        }catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status,error.message));
        }
    }

    @ApiParam({ name : 'faq_id', required : true })
    @UseGuards(AdminGuard)
    @Get(':faq_id')
    async faqDetail(@Param() param: FaqsIdParamDto,@Res() response:any)
    {
        try {
            const data = await this.faqsService.faqDetail(param);
            response.status(200).json(data);
        }catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status,error.message));
        }

    }

    @ApiBody({ type : FaqsCreateDto })
    @UseGuards(AdminGuard)
    @Post()
    async create(@Body() request: FaqsCreateDto,@Req() req:any,@Res() response:any) {
        try {
            await this.faqsService.create(request, req.user);
            response.status(201).json();
        }catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status,error.message));
        }
    }

    @ApiParam({ name : 'faq_id', required : true })
    @ApiBody({ type : FaqsUpdateDto })
    @UseGuards(AdminGuard)
    @Put(':faq_id')
    async update(@Param() params: FaqsIdParamDto, @Req() req: any, @Body() request: FaqsUpdateDto,@Res() response:any) {
        try {
            await this.faqsService.update(request, params, req.user);
            response.status(201).json();
        }catch (error) {
            response.status(error.status).json(toJsonResponse(error.status,error.message));
        }
    }

    @ApiParam({ name : 'faq_id', required : true })
    @UseGuards(AdminGuard)
    @Delete(':faq_id')
    async delete(@Param() params: FaqsIdParamDto,@Res() response:any)
    {
        try {
            await this.faqsService.delete(params);
            response.status(204).json();
        }catch (error) {
            response.status(error.status).json(toJsonResponse(error.status,error.message));
        }

    }

   
   @ApiParam({ name : 'faq_id', required : true })
   @UseGuards(AdminGuard)
   @Patch('change-status/:faq_id')
   async changeStatus(@Param() params: FaqsIdParamDto, @Res() response: any) {
       try {
           await this.faqsService.changeStatus(params);
           response.status(200).json();
       } catch (error) {
           response.status(error.status).json(toJsonResponse(error.status, error.message));
       }
   }

}
