import { Body, Controller, Get, Patch, Req, UseGuards } from '@nestjs/common';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { Request } from 'express';
import { setAuditChanges } from '../audit/audit-detail';
import { AdminRequest } from '../auth/admin/admin-identity';
import { AdminJwtAuthGuard } from '../auth/admin/jwt.guard';
import { Roles } from '../auth/admin/roles.decorator';
import { RolesGuard } from '../auth/admin/roles.guard';
import { SuperAdminGuard } from '../auth/admin/super-admin.guard';
import { JwtAuthGuard } from '../auth/user/jwt.guard';
import { ApplyReleaseDto } from './release.dto';
import { ReleaseService } from './release.service';

@ApiTags('메뉴 노출')
@Controller('release')
export class ReleaseController {
  constructor(private readonly release: ReleaseService) {}

  @ApiOperation({
    summary: '사이트 메뉴 노출 값 일괄 조회 (표 실패에도 기본값으로 채운다)',
  })
  @Get('visible')
  @UseGuards(JwtAuthGuard)
  async visible(@Req() req: Request) {
    return { flags: await this.release.siteFlags(req) };
  }
}

@ApiTags('[관리자] 메뉴 노출')
@UseGuards(AdminJwtAuthGuard, RolesGuard)
@Roles('admin')
@Controller('admin/release')
export class AdminReleaseController {
  constructor(private readonly release: ReleaseService) {}

  @ApiOperation({ summary: '노출 키 목록 (등록부 × 저장값)' })
  @Get()
  @UseGuards(SuperAdminGuard)
  list() {
    return this.release.list();
  }

  @ApiOperation({ summary: '바뀐 노출 키 일괄 저장 (한 트랜잭션)' })
  @Patch()
  @UseGuards(SuperAdminGuard)
  async apply(@Req() req: AdminRequest, @Body() body: ApplyReleaseDto) {
    const changes = await this.release.apply(body.changes, req.admin!.admId!);
    //* 회원 · 관리자 번호는 싣지 않고 개수만. 칸 이름은 감사 거부 어휘 key 를 피해 flag.
    setAuditChanges(req, {
      count: changes.length,
      flags: changes.map((c) => ({
        flag: c.key,
        from: c.from,
        to: c.to,
        memIdCount: c.memIdCount,
        admIdCount: c.admIdCount,
      })),
    });
    return { updated: changes.length, changes };
  }
}
