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 { 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 { AdvertisementService } from './advertisement.services';
import { AdvertisementListQueryDto } from './dtos/advertisement-list-query.dto';
import { AdvertisementIdParamDto } from './dtos/advertisement-id-param.dto';
import { AdvertisementCreateDto } from './dtos/advertisement-create.dto';
import { AdvertisementUpdateDto } from './dtos/advertisement-update.dto';

@ApiTags('advertisement')
@Controller('advertisement')
export class AdvertisementController {
    constructor(private advertisementService: AdvertisementService) { }

    @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: AdvertisementListQueryDto,@Request() req,@Res() response:any)
    {
        try {
            const data = await this.advertisementService.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 : 'advertisement_id', required : true })
    @UseGuards(AdminGuard)
    @Get(':advertisement_id')
    async detail(@Param() param: AdvertisementIdParamDto,@Res() response:any)
    {
        try {
            const data = await this.advertisementService.detail(param);
            response.status(200).json(data);
        }catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status,error.message));
        }

    }

    @ApiBody({ type : AdvertisementCreateDto })
    @UseGuards(AdminGuard)
    @Post()
    async create(@Body() request: AdvertisementCreateDto,@Req() req:any,@Res() response:any) {
        try {
            await this.advertisementService.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 : 'advertisement_id', required : true })
    @ApiBody({ type : AdvertisementUpdateDto })
    @UseGuards(AdminGuard)
    @Put(':advertisement_id')
    async update(@Param() params: AdvertisementIdParamDto, @Req() req: any, @Body() request: AdvertisementUpdateDto,@Res() response:any) {
        try {
            await this.advertisementService.update(request, params, req.user);
            response.status(201).json();
        }catch (error) {
            response.status(error.status).json(toJsonResponse(error.status,error.message));
        }
    }

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

    }

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

}
