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 { CommonGuard } from 'src/modules/auth/guards/common.guard';
import { BrandGuard } from 'src/modules/auth/guards/brand.guard';
import { toJsonResponse } from 'src/common/response';
import { CampaignListQueryDto } from 'src/modules/campaign/dtos/campaign-list-query.dto';
import { AdminGuard } from 'src/modules/auth/guards/admin.guard';
import { CampaignSlugParamDto } from 'src/modules/campaign/dtos/campaign-slug-param.dto';
import { CampaignIdParamDto } from 'src/modules/campaign/dtos/campaign-id-param.dto';
import { PaymentBodyDto } from './dto/payment.dto';
import { PaymentIdParamDto } from './dto/payment-id-param.dto';
import { PaymentExportDto } from './dto/export-payment.dto';
import { QueryCommonGuard } from 'src/modules/auth/guards/common-query.guard';
import { MarketingCampaignService } from './marketing-campaign.services';

// DTO Files

@ApiTags('admin/marketing-campaign')
@Controller('admin/marketing-campaign')
export class MarketingCampaignController {
    constructor(private markingCampaignService: MarketingCampaignService) { }

    @UseGuards(AdminGuard)
    @Post()
    async createCampaign(@Body() body: any, @Request() req, @Res() response: any) {
        try {
            const data = await this.markingCampaignService.createCampaign(body);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @UseGuards(AdminGuard)
    @Put('schedule/:id')
    async scheduleCampaign(@Param() param: any, @Body() body: any, @Request() req, @Res() response: any) {
        try {
            const data = await this.markingCampaignService.scheduleCampaign(body, param);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @UseGuards(AdminGuard)
    @Post('test-mail')
    async testMail(@Body() body: any, @Request() req, @Res() response: any) {
        try {
            const data = await this.markingCampaignService.testMail(body);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }


    @UseGuards(AdminGuard)
    @Post('list')
    async getCampaigns(@Body() body: any, @Request() req, @Res() response: any) {
        try {
            const data = await this.markingCampaignService.getCampaigns(body);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @UseGuards(AdminGuard)
    @Get('details/:id')
    async getCampaignDetails(@Param() param: any, @Request() req, @Res() response: any) {
        try {
            const data = await this.markingCampaignService.getCampaignDetails(param);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }




    @UseGuards(AdminGuard)
    @Post('upload/contacts')
    async crateListing(@Body() body: any, @Request() req, @Res() response: any) {
        try {
            const data = await this.markingCampaignService.crateListing(body);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @UseGuards(AdminGuard)
    @Put('group')
    async updateGroup(@Body() body: any, @Request() req, @Res() response: any) {
        try {
            const data = await this.markingCampaignService.updateGroup(body);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @UseGuards(AdminGuard)
    @Get('group')
    async getGroup(@Query() query: any, @Request() req, @Res() response: any) {
        try {
            const data = await this.markingCampaignService.getGroup(query);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @UseGuards(AdminGuard)
    @Delete('group/:id')
    async deleteGroup(@Param() param: any, @Query() queryParam: any, @Request() req, @Res() response: any) {
        try {
            const data = await this.markingCampaignService.deleteGroup(param, queryParam);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @UseGuards(AdminGuard)
    @Post('contacts')
    async addContacts(@Body() body: any, @Request() req, @Res() response: any) {
        try {
            const data = await this.markingCampaignService.addContactsToGroup(body.contacts, body.groupId);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @UseGuards(AdminGuard)
    @Get('contacts')
    async getContacts(@Query() query: any, @Request() req, @Res() response: any) {
        try {
            const data = await this.markingCampaignService.getContacts(query);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @UseGuards(AdminGuard)
    @Get('contacts/search')
    async searchContacts(@Query() query: any, @Request() req, @Res() response: any) {
        try {
            const data = await this.markingCampaignService.searchContacts(query);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @UseGuards(AdminGuard)
    @Delete('contacts')
    async deleteContacts(@Body() query: any, @Request() req, @Res() response: any) {
        try {
            const data = await this.markingCampaignService.deleteContacts(query);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }

    @UseGuards(AdminGuard)
    @Delete(':id')
    async deleteCampaign(@Param() param: any, @Request() req, @Res() response: any) {
        try {
            const data = await this.markingCampaignService.deleteCampaign(param);
            response.status(200).json(data);
        } catch (error) {
            console.log(error);
            response.status(error.status).json(toJsonResponse(error.status, error.message));
        }
    }


}
