using System;
namespace Infrastructure.Kyc.Nice;
///
/// NICE 통합인증 API 설정. appsettings.{env}.json 의 "Nice:Auth" 섹션 + Secret File 로 주입.
///
/// ClientId / ClientSecret 가 비어 있으면 가
/// "Nice.NotConfigured" 에러를 반환. dev 환경에서 vendor 미연동 상태로 진행 가능 (Developers:SkipKyc=true 와 짝).
///
public sealed class NiceAuthOptions
{
/// NICE API base URL. 예: https://svc.niceapi.co.kr:22001
public string BaseUrl { get; set; } = string.Empty;
/// NICE 발급 client_id.
public string ClientId { get; set; } = string.Empty;
/// NICE 발급 client_secret. Secret File 에만 보관.
public string ClientSecret { get; set; } = string.Empty;
/// NICE 발급 사이트코드 (SITECODE). 휴대폰 본인확인 신청서 식별자. 일부 보조 API 에 필요.
public string SiteCode { get; set; } = string.Empty;
///
/// 인증 후 NICE → 가맹점 callback URL 의 base 부분 (sessionToken 은 Backend 가 path segment 로 append).
/// 예: https://api.dpot.live/api/developers/profile/kyc/callback
///
public string ReturnUrl { get; set; } = string.Empty;
/// 표준창 닫기 버튼 클릭 시 이동 URL (Frontend 의 onboarding/kyc 페이지 권장).
public string CloseUrl { get; set; } = string.Empty;
///
/// Backend callback 결과를 사용자에게 보여줄 Frontend 페이지 URL.
/// 예: https://developers.dpot.live/onboarding/kyc/callback
/// (Backend 가 ?ok=1 또는 ?ok=0&message=... 으로 query 추가해 302 redirect)
///
public string FrontendCallbackUrl { get; set; } = string.Empty;
/// 기본 인증수단. "M" 휴대폰 / "F" 금융인증서 / "U" 공동인증서 / "I" 아이핀.
public string[] DefaultSvcTypes { get; set; } = ["M"];
/// 표준창 method_type. 기본 "GET" (가이드에 POST field 명세 없어 안전 선택).
public string MethodType { get; set; } = "GET";
/// Redis 토큰 캐시 키 prefix. e.g. "Nice:Auth:Token"
public string TokenCacheKeyPrefix { get; set; } = "Nice:Auth:Token";
/// 토큰 캐시 TTL (초). NICE 토큰이 24h 라 safety margin 1h 빼고 23h = 82800 권장.
public int TokenCacheTtlSeconds { get; set; } = 82800;
/// HTTP 호출 timeout (초).
public int HttpTimeoutSeconds { get; set; } = 15;
/// Secret File 미주입 시 배포 config 에 남는 미치환 placeholder 접두사.
private const string PlaceholderPrefix = "__INJECT_";
///
/// 설정 완료(=vendor 연동 가능) 여부. BaseUrl/ClientId/ClientSecret 가 모두 채워져야 함.
/// Secret File 미주입으로 남은 미치환 placeholder(__INJECT_...) 는 미설정으로 간주 —
/// NICE 에 가짜 client_id 를 보내 "권한 오류(1006)" 가 나는 대신 "준비 중(NotConfigured)" 으로 안전 처리.
///
public bool IsConfigured =>
!string.IsNullOrWhiteSpace(BaseUrl) &&
!string.IsNullOrWhiteSpace(ClientId) &&
!string.IsNullOrWhiteSpace(ClientSecret) &&
!ClientId.StartsWith(PlaceholderPrefix, StringComparison.Ordinal) &&
!ClientSecret.StartsWith(PlaceholderPrefix, StringComparison.Ordinal);
///
/// 배포 config 에 치환 안 된 placeholder(__INJECT_...) 가 남아있는지.
/// true 면 "설정한 듯 보이나 실제론 미주입" 상태 → 부팅 시 운영자 경고 대상.
///
public bool HasUnsubstitutedPlaceholder =>
ClientId.StartsWith(PlaceholderPrefix, StringComparison.Ordinal) ||
ClientSecret.StartsWith(PlaceholderPrefix, StringComparison.Ordinal);
}