import {
  CanActivate,
  ExecutionContext,
  ForbiddenException,
  Injectable,
} from '@nestjs/common';

export function canViewCar(
  admin:
    | {
        role?: string;
        admId?: number;
        carView?: boolean;
        adminViewToken?: boolean;
      }
    | undefined,
) {
  if (!admin?.role) return false;

  //* admin-view v2 토큰 경유 요청은 발급 시 서명된 carView claim을 그대로 따른다.
  const tokenOk = admin.adminViewToken !== true || admin.carView === true;

  //* 기획(2026-07): 기업/조직관리자도 자동차분석 열람 허용.
  //*  corp의 admin-view 토큰은 발급 시 자기 기업 스코프(isOddInCorpScope)가 검증되므로 타 기업
  //*  분석 건은 토큰 자체가 발급되지 않는다. (admin-view 경로의 req.admin은 토큰으로만 복원되어
  //*  쿠키 신원만으로는 이 가드를 통과할 수 없고, 쿠키 경로(원본다운로드)는 guardCorp가 스코프 검증)
  if (admin.role === 'corp') return tokenOk;

  const allowed = new Set(
    (process.env.CAR_VIEW_ADMIN_IDS ?? '')
      .split(',')
      .map((id) => id.trim())
      .filter(Boolean),
  );
  return (
    admin.role === 'admin' && allowed.has(String(admin.admId)) && tokenOk
  );
}

/** 자동차 분석 원문: allowlist 최고관리자 + 자기 기업 스코프의 기업/조직관리자만 조회. 빈 allowlist는 admin에 대해 fail-closed. */
@Injectable()
export class CarViewAdminGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const admin = context.switchToHttp().getRequest().admin;
    if (canViewCar(admin)) return true;
    throw new ForbiddenException('자동차 분석 조회 권한이 없습니다');
  }
}
