import { AdminJwtAuthGuard } from '@api/modules/auth/admin/jwt.guard';
import {
  Body,
  Controller,
  Get,
  Header,
  Post,
  Query,
  Req,
  Res,
  UseGuards,
} from '@nestjs/common';
import { ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger';
import { plainToInstance } from 'class-transformer';
import { Request, Response } from 'express';
import {
  GetSubscribeFailedListDto,
  GetSubscribeFailedListResponseDto,
  ReSubscribeDto,
} from './subscribe-failed.dto';
import { SubscribeFailedService } from './subscribe-failed.service';
import { RolesGuard } from '@api/modules/auth/admin/roles.guard';
import { Roles } from '@api/modules/auth/admin/roles.decorator';

@ApiTags('[관리자] 구독실패')
@UseGuards(AdminJwtAuthGuard, RolesGuard)
@Controller('admin/subscribe-failed')
export class SubscribeFailedAdminController {
  constructor(private subscribeFailedService: SubscribeFailedService) {}

  @ApiOperation({
    summary: `구독 목록/검색`,
  })
  @Get()
  @ApiOkResponse({ type: GetSubscribeFailedListResponseDto })
  @Roles('admin', 'sales')
  async getSubscribeFailedList(@Query() query: GetSubscribeFailedListDto) {
    const data = await this.subscribeFailedService.getList(query);
    return plainToInstance(GetSubscribeFailedListResponseDto, data, {
      excludeExtraneousValues: true,
    });
  }

  @Get('download')
  @ApiOperation({
    summary: '엑셀다운로드',
    description: '모든 구독 목록을 다운로드합니다.',
  })
  @Header(
    'Content-Type',
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  )
  @Header(
    'Content-Disposition',
    `attachment;filename*=utf-8''${encodeURIComponent('구독실패목록')}.xlsx`,
  )
  @Roles('admin')
  async downloadSubscribeList(
    @Query() query: GetSubscribeFailedListDto,
    @Res({ passthrough: true }) res: Response,
  ) {
    await this.subscribeFailedService.downloadSubscribeList(query, res);
    return;
  }

  @Post('resubscribe')
  @Roles('admin')
  @ApiOperation({ summary: '재구독처리' })
  async resign(@Body() body: ReSubscribeDto, @Req() req: Request) {
    const admin = req['admin'];
    await this.subscribeFailedService.resubscribe(body, admin.admId);
    return;
  }
}
