import { Controller, Request, Post, Body, Get, Res, UseGuards, UseInterceptors, UploadedFile, Patch, Query, Put, Delete, Param } from '@nestjs/common';
import { ApiParam, ApiQuery, ApiTags, ApiBody, ApiConsumes, ApiBearerAuth } from '@nestjs/swagger';
import { BrowseInfluencerService } from './browse-influencer.services';
import { toJsonResponse } from '../../common/response';
import { AdminInfluencerGuard } from '../auth/guards/admin-influencer.guard';

// DTO Files

import { InfluencerQueryDto } from './dtos/influencer-query-search.dto';
import { BrandGuard } from '../auth/guards/brand.guard';
import { InfluencePostDto } from './dtos/influencer-post-search.dto';
import { FavoriteInfluencerDto } from './dtos/favorite-influencer.dto';
import { FavoriteList } from './dtos/favorite-influencer-list.dto';
import { CampaignInfluenceDto } from './dtos/campaign-influencer-search.dto';
import { QueryCommonGuard } from '../auth/guards/common-query.guard';

@ApiTags('browse-influencer')
@Controller('browse-influencer')
export class BrowseInfluencerController {
    constructor(
        private browseInfluencerService: BrowseInfluencerService,
    ) { }


    @ApiBearerAuth('access-token')
    @UseGuards(BrandGuard)
    @Get()
    async getInfluencer(@Query() query: any, @Request() req, @Res() response: any) {
        try {
            const data = await this.browseInfluencerService.getInfluencer(query, req.user);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @ApiBearerAuth('access-token')
    @UseGuards(BrandGuard)
    @Get('rising-fast')
    async risingFast(@Query() query: any, @Request() req, @Res() response: any) {
        try {
            const data = await this.browseInfluencerService.risingFast(query, req.user);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @ApiBearerAuth('access-token')
    @UseGuards(BrandGuard)
    @Get('search-by-name')
    async getInfluencerSearchBar(@Query() query: InfluencerQueryDto, @Request() req, @Res() response: any) {
        try {
            const data = await this.browseInfluencerService.getInfluencerSearchBar(query, req.user);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @ApiBearerAuth('access-token')
    @UseGuards(BrandGuard)
    @Post('search')
    async search(@Body() body: InfluencePostDto, @Request() req: any, @Res() response: any) {
        try {
            const data = await this.browseInfluencerService.search(body, req.user);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @ApiBearerAuth('access-token')
    @UseGuards(BrandGuard)
    @Post('campaign')
    async campaign(@Body() body: CampaignInfluenceDto, @Request() req: any, @Res() response: any) {
        try {
            const data = await this.browseInfluencerService.campaign(body, req.user);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @ApiBearerAuth('access-token')
    @UseGuards(BrandGuard)
    @Post('favorite')
    async favorite(@Body() body: FavoriteInfluencerDto, @Request() req: any, @Res() response: any) {
        try {
            const data = await this.browseInfluencerService.favorite(body, req.user);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @ApiBearerAuth('access-token')
    @UseGuards(BrandGuard)
    @Get('favorite')
    async getFavorite(@Query() params: FavoriteList, @Request() req: any, @Res() response: any) {
        try {
            const data = await this.browseInfluencerService.getFavorite(params, req.user);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @UseGuards(QueryCommonGuard)
    @ApiBearerAuth('access-token')
    @Get('favorite/export')
    async exportUsers(@Request() req, @Res() response: any) {
        try {
            const data = await this.browseInfluencerService.exportFavorite(req.user, response);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }
}
