import { Controller, Get, Req, UseGuards } from '@nestjs/common';
import { ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger';
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 { SuperAdminService } from './super-admin.service';

/**
 * 최고관리자 **판정** 엔드포인트 하나 (hardening M5 DD3 · UI4).
 *
 * 기능마다 따로 묻던 두 자리(`GET /admin/samsung-intake/session` 의 200/403 ·
 * `GET /admin/alert/permission` 의 `{canManage}`)를 여기로 모았다. 화면이 "나는 여기 들어갈 수
 * 있는가" 를 묻는 단 하나의 자리다.
 *
 * **판정 가드를 일부러 달지 않는다.** 클래스 가드는 인증과 역할 둘뿐이다. 판정을 가드로 달면
 * "아니오" 라는 답 자체가 403 이 되어 화면이 **차단**과 **장애**를 가르지 못한다.
 * 둘은 사람이 서로 다른 곳으로 가야 하는 상태다(차단 → 담당자 지정 요청 · 장애 → 재시도·운영팀).
 *
 * **인증 가드는 반드시 남는다.** `AdminJwtAuthGuard` 가 `request.admin` 을 채우지 않으면 판정이
 * 최고관리자에게도 거짓을 내고 진입이 전원에게 닫힌다(우회가 아니라 파손).
 *
 * 판정 본문은 복제하지 않는다 — `isSuperAdminStrict` 한 자리를 그대로 부른다. `Strict` 인 이유가
 * 이 컨트롤러의 계약이다: 조회 실패와 표시 칸 부재는 삼키지 않고 던져 **비-200** 이 된다. 가드가
 * 쓰는 `isSuperAdmin` 은 같은 본문을 fail-closed 로 감싼 짝이다(DD4).
 */
@ApiTags('[관리자] 최고관리자 판정')
@UseGuards(AdminJwtAuthGuard, RolesGuard)
@Roles('admin')
@Controller('admin/super-admin')
export class SuperAdminPermissionController {
  constructor(private readonly superAdmin: SuperAdminService) {}

  @ApiOperation({
    summary: '최고관리자 여부 판정 (헤더 콘솔 진입·콘솔 화면용)',
    description:
      '최고관리자가 아닌 내부 관리자에게도 200 으로 { isSuper: false } 를 돌려준다. 판정을 내지 못하면 비-200 이다 — 403 으로 답하면 화면이 차단과 장애를 구별할 수 없다.',
  })
  @ApiOkResponse({ schema: { properties: { isSuper: { type: 'boolean' } } } })
  @Get('permission')
  async getPermission(@Req() req: AdminRequest): Promise<{ isSuper: boolean }> {
    return { isSuper: await this.superAdmin.isSuperAdminStrict(req.admin) };
  }
}
