import {
  Body,
  Controller,
  Get,
  Param,
  Post,
  Req,
  UseGuards,
} from '@nestjs/common';
import { ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger';
import { Request } from 'express';
import { JwtAuthGuard } from '../auth/user/jwt.guard';
import { GetAlimtalkUserResponseDto, SendAlimtalkDto } from './alimtalk.dto';
import { AlimtalkType } from './alimtalk.entity';
import { AlimtalkService } from './alimtalk.service';
import { plainToInstance } from 'class-transformer';

@ApiTags('알림톡')
@Controller('alimtalk')
export class AlimtalkController {
  constructor(private alimtalkService: AlimtalkService) {}

  @ApiOperation({
    summary: '카카오 알림톡으로 초대하기',
    description: `알림톡 수신에러시 문자로 자동발송`,
  })
  @UseGuards(JwtAuthGuard)
  @Post('send')
  async sendAlimtalk(@Req() req: Request, @Body() body: SendAlimtalkDto) {
    return await this.alimtalkService.sendAnalyze(
      body,
      AlimtalkType.분석,
      { ownerMemId: Number(req['user']?.memId ?? -1) },
    );
  }

  @ApiOperation({
    summary: '발송된 알림톡 분석 사용여부 유효성 검사',
  })
  @Get('check/:altCode')
  async alimtalkCheck(@Param('altCode') altCode: string) {
    const detail = await this.alimtalkService.checkAlimtalkEntry(altCode);
    const resumeInProgress =
      (detail as { resumeInProgress?: boolean })?.resumeInProgress === true;
    //* 진입 시점 만료 판별(구독종료/건수/탈퇴/기업차단) — 프론트가 즉시 '접근 기간 만료' 화면 노출
    const inviteExpired = detail?.order?.ordId
      ? await this.alimtalkService.isInviteExpired(detail.order.ordId, {
          ignoreQuantity: resumeInProgress,
        })
      : false;
    return { ...detail, inviteExpired };
  }

  @ApiOperation({
    summary: '알림톡 수신 유저 정보 조회',
  })
  @ApiOkResponse({ type: GetAlimtalkUserResponseDto })
  @Get('user/:altCode')
  async getAlimtalkUser(@Param('altCode') altCode: string) {
    const data = await this.alimtalkService.getUser(altCode);
    return plainToInstance(GetAlimtalkUserResponseDto, data, {
      excludeExtraneousValues: true,
    });
  }
}
