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 { DisputeService } from './dispute.services';
import { toJsonResponse } from '../../common/response';
import { CommonGuard } from '../auth/guards/common.guard';
import { CreateDisputeDto } from './dtos/dispute-create.dto';
import { DisputeListQueryDto } from './dtos/dispute-list-query.dto';
import { DisputeSlugParamDto } from './dtos/dispute-slug-param.dto';
import { DisputeIdParamDto } from './dtos/dispute-id-param.dto';

@ApiTags('dispute')
@Controller('dispute')
export class DisputeController {
    constructor(private disputeService: DisputeService) { }
    @ApiBody({ type: CreateDisputeDto })
    @UseGuards(CommonGuard)
    @Post()
    async create(@Body() request: CreateDisputeDto, @Req() req: any, @Res() response: any) {
        try {
            await this.disputeService.create(request, req.user);
            response.status(201).json();
        } catch (error: any) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @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: DisputeListQueryDto, @Request() req, @Res() response: any) {
        try {
            const data = await this.disputeService.list(queryParam);
            response.status(200).json(data);
        } catch (error: any) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @UseGuards(CommonGuard)
    @Patch('solved/:dispute_id')
    async solved(@Param() params: DisputeIdParamDto, @Body() request: any, @Req() req: any, @Res() response: any) {
        try {
            await this.disputeService.solved(params, request, req.user);
            response.status(201).json();
        } catch (error: any) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @ApiParam({ name: 'slug', required: true })
    @UseGuards(CommonGuard)
    @Get(':slug')
    async campaignDetail(@Param() param: DisputeSlugParamDto, @Res() response: any) {
        try {
            const data = await this.disputeService.details(param);
            response.status(200).json(data);
        } catch (error: any) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

}
