import { TreatErrorCategory as C } from './treat-error-category';

//* (vendor, native코드) → category 매핑. 출처: server/docs/treat-vendor-error-handling.md (3장)
//*   미수록 코드는 resolve에서 UNKNOWN으로 폴백.
export type TreatVendor = 'codef' | 'coocon' | 'octover' | 'hyphen' | 'inhouse';

//* ---- codef (3-1): result.code가 곧 CF-* ----
const CODEF: Record<string, C> = {
  'CF-00000': C.OK,
  'CF-03002': C.OK, //* 추가인증 필요 — 실패 아님(2차 OTP 오입력 특수처리는 호출부)
  'CF-00016': C.DUPLICATE,
  'CF-00025': C.AUTH_EXPIRED,
  'CF-01004': C.AUTH_TIMEOUT,
  'CF-12001': C.AUTH_TIMEOUT,
  'CF-12003': C.VENDOR_ERROR,
  'CF-12050': C.VENDOR_ERROR,
  'CF-12100': C.VENDOR_ERROR,
  'CF-12701': C.VENDOR_ERROR,
  'CF-12702': C.VENDOR_ERROR,
  'CF-12051': C.AGE_RESTRICTED,
  'CF-12200': C.NETWORK_ERROR,
  'CF-12804': C.INPUT_INVALID,
  'CF-12835': C.INPUT_INVALID,
  'CF-12837': C.INPUT_INVALID,
  'CF-13000': C.INPUT_INVALID,
  'CF-12871': C.AUTH_APP_MISSING,
  'CF-13002': C.REQUEST_INVALID,
  'CF-13300': C.AUTH_CODE_WRONG,
  'CF-12872': C.UNKNOWN,
};

//* ---- coocon (3-2): Output.ErrorCode / Common.Result_cd (8자리 hex 계열) ----
const COOCON: Record<string, C> = {
  '00000000': C.OK,
  // INPUT_INVALID
  '80002230': C.INPUT_INVALID, '80002231': C.INPUT_INVALID, '80002234': C.INPUT_INVALID,
  '8000B001': C.INPUT_INVALID, '8000B122': C.INPUT_INVALID,
  '80007810': C.INPUT_INVALID, '80007811': C.INPUT_INVALID,
  '800033E0': C.INPUT_INVALID, '800033E2': C.INPUT_INVALID,
  '80002310': C.INPUT_INVALID, '80002311': C.INPUT_INVALID, '80002312': C.INPUT_INVALID,
  '80002313': C.INPUT_INVALID, '80002320': C.INPUT_INVALID, '80002321': C.INPUT_INVALID,
  // AUTH_CERT
  '80004000': C.AUTH_CERT, '80004040': C.AUTH_CERT, '80004041': C.AUTH_CERT,
  '80004100': C.AUTH_CERT, '80004101': C.AUTH_CERT, '80004102': C.AUTH_CERT,
  '80004104': C.AUTH_CERT, '80004107': C.AUTH_CERT, '80004111': C.AUTH_CERT,
  '80004113': C.AUTH_CERT, '80004114': C.AUTH_CERT, '80004115': C.AUTH_CERT, '80004016': C.AUTH_CERT,
  // AUTH_NOT_APPROVED
  '80004132': C.AUTH_NOT_APPROVED, '80004128': C.AUTH_NOT_APPROVED,
  // AUTH_EXPIRED / AUTH_CODE_WRONG
  '80004133': C.AUTH_EXPIRED,
  '80004126': C.AUTH_CODE_WRONG,
  // REQUEST_INVALID
  '80004200': C.REQUEST_INVALID, '80004201': C.REQUEST_INVALID,
  '80007010': C.REQUEST_INVALID, '80007011': C.REQUEST_INVALID,
  // VENDOR_ERROR
  '8000E200': C.VENDOR_ERROR, '8000F101': C.VENDOR_ERROR,
  '80002F10': C.VENDOR_ERROR, '80002F20': C.VENDOR_ERROR, '80002F30': C.VENDOR_ERROR,
  '80002F31': C.VENDOR_ERROR, '80002E40': C.VENDOR_ERROR, '8000FFFF': C.VENDOR_ERROR,
  '80002123': C.VENDOR_ERROR, '80002470': C.VENDOR_ERROR,
  // NO_DATA
  '42110000': C.NO_DATA,
  // SYSTEM_ERROR
  '8000A000': C.SYSTEM_ERROR, '80007220': C.SYSTEM_ERROR,
  '80002E34': C.SYSTEM_ERROR, '80003391': C.SYSTEM_ERROR,
  GWSM0001: C.SYSTEM_ERROR, GWSM0002: C.SYSTEM_ERROR, GWSM0003: C.SYSTEM_ERROR,
  GWSM0004: C.SYSTEM_ERROR, GWSM0005: C.SYSTEM_ERROR, GWSM0006: C.SYSTEM_ERROR,
  GWSM0007: C.SYSTEM_ERROR, GWSM0008: C.SYSTEM_ERROR, GWSM0009: C.SYSTEM_ERROR,
  GWSM0010: C.SYSTEM_ERROR, GWSM0011: C.SYSTEM_ERROR,
  //* ---- prod 실측 현행화(2026-06-29) ----
  '80002E25': C.RATE_LIMIT, //* 비정상 접속 → 사이트 보안정책 차단
  '8000D825': C.INPUT_INVALID, //* 잘못된 생년월일
  APP00005: C.REQUEST_INVALID, //* 잘못된 SAS_SessionID(세션 선행처리 누락)
  LBS00009: C.UNKNOWN, //* 정의되지 않은 오류(쿠콘 게이트웨이)
  E0304: C.NETWORK_ERROR, //* 우리측 axios 300초 타임아웃/통신 끊김(공통 래퍼코드)
};

//* ---- octover (3-3): out.data[method].code / out.code (7자리 숫자, DOZN 공통 오류코드) ----
//*   출처: octover 오류코드 구글시트(공통 오류코드 탭). HIRA(HR1000N) 본인인증+조회만 호출하므로
//*   공통 1000/1001/1010 체계만 매핑. GOVM 1500xxx(자동차/출입국/부동산 등)는 진료수집 무관이라 제외.
const OCTOVER: Record<string, C> = {
  //* 성공/정상
  '1000200': C.OK, '1000204': C.OK, '1000206': C.OK, '1000210': C.OK,
  //* 입력값/조건
  '1000010': C.INPUT_INVALID, '1001010': C.INPUT_INVALID,
  '1000014': C.INPUT_INVALID, '1000015': C.INPUT_INVALID, '1000016': C.INPUT_INVALID,
  '1000017': C.INPUT_INVALID, '1000018': C.INPUT_INVALID, '1000019': C.INPUT_INVALID,
  '1000020': C.INPUT_INVALID, '1000026': C.INPUT_INVALID, '1000027': C.INPUT_INVALID,
  '1000028': C.INPUT_INVALID, '1000029': C.INPUT_INVALID, '1000033': C.INPUT_INVALID,
  '1000103': C.INPUT_INVALID, '1000300': C.INPUT_INVALID, '1000009': C.INPUT_INVALID,
  '1000004': C.INPUT_INVALID, '1000012': C.INPUT_INVALID,
  '1000409': C.INPUT_INVALID, '1000410': C.INPUT_INVALID, '1000411': C.INPUT_INVALID,
  '1000412': C.INPUT_INVALID, '1000413': C.INPUT_INVALID,
  '1000470': C.INPUT_INVALID, '1000471': C.INPUT_INVALID, '1000472': C.INPUT_INVALID,
  '1000473': C.INPUT_INVALID, '1000474': C.INPUT_INVALID, '1000475': C.INPUT_INVALID,
  '1000478': C.INPUT_INVALID, '1000479': C.INPUT_INVALID,
  '1000481': C.INPUT_INVALID, '1000483': C.INPUT_INVALID, '1000486': C.INPUT_INVALID,
  //* 요청/세션
  '1000100': C.REQUEST_INVALID, '1000101': C.REQUEST_INVALID,
  '1000487': C.REQUEST_INVALID, '1000701': C.REQUEST_INVALID, '1000900': C.REQUEST_INVALID,
  '1010470': C.REQUEST_INVALID,
  '1000104': C.AUTH_EXPIRED,
  //* 인증서
  '1000001': C.AUTH_CERT, '1000002': C.AUTH_CERT, '1000005': C.AUTH_CERT,
  '1000006': C.AUTH_CERT, '1000007': C.AUTH_CERT, '1000008': C.AUTH_CERT,
  '1000102': C.AUTH_CERT, '1000494': C.AUTH_CERT, '1000496': C.AUTH_CERT, '1000700': C.AUTH_CERT,
  //* 본인/간편인증
  '1000480': C.AUTH_NOT_APPROVED, '1010473': C.AUTH_NOT_APPROVED,
  '1000482': C.AUTH_EXPIRED, '1010471': C.AUTH_EXPIRED, '1010472': C.AUTH_EXPIRED,
  '1000011': C.AUTH_EXPIRED,
  '1000484': C.AUTH_CODE_WRONG, '1000488': C.AUTH_CODE_WRONG,
  //* 한도/혼잡 (IP 차단 포함)
  '1000702': C.RATE_LIMIT, '1000111': C.RATE_LIMIT, '1000112': C.RATE_LIMIT,
  //* 타임아웃
  '1000110': C.AUTH_TIMEOUT, '1000408': C.AUTH_TIMEOUT,
  //* 외부(기관/사이트)
  '1000013': C.VENDOR_ERROR, '1000021': C.VENDOR_ERROR, '1000022': C.VENDOR_ERROR,
  '1000023': C.VENDOR_ERROR, '1000025': C.VENDOR_ERROR, '1000030': C.VENDOR_ERROR,
  '1000031': C.VENDOR_ERROR, '1000032': C.VENDOR_ERROR, '1000034': C.VENDOR_ERROR,
  '1000036': C.VENDOR_ERROR, '1000037': C.VENDOR_ERROR, '1000485': C.VENDOR_ERROR,
  '1000460': C.VENDOR_ERROR, '1000461': C.VENDOR_ERROR, '1000462': C.VENDOR_ERROR,
  //* 네트워크
  '1000024': C.NETWORK_ERROR,
  //* 조회 없음
  '1000035': C.NO_DATA,
  //* 미분류(사이트 직접 전달 오류메시지)
  '1999999': C.UNKNOWN,
  //* ---- prod 실측 현행화(2026-06-29) ----
  '1000906': C.VENDOR_ERROR, //* 기관 응답이 정상적이지 않음(사이트 확인)
  E0304: C.NETWORK_ERROR, //* 우리측 타임아웃/ECONNRESET(공통 래퍼코드)
};

//* ---- hyphen (3-4): 업무코드(errMsg [코드]) + 통신코드(resCd). 형식이 겹치지 않아 한 맵 ----
const HYPHEN: Record<string, C> = {
  '0000': C.OK,
  // 업무코드
  'VALID-001': C.INPUT_INVALID, 'VALID-002': C.INPUT_INVALID,
  'LOGIN-V04': C.INPUT_INVALID, 'I0001-001': C.INPUT_INVALID,
  'I0001-004': C.INPUT_INVALID, //* 보안문자 불일치 — prod 실측(2026-06-08) errMsg '[I0001-004] 보안문자가 일치하지 않습니다'
  'LOGIN-001': C.AUTH_NOT_APPROVED, 'I0001-002': C.AUTH_NOT_APPROVED,
  'LOGIN-002': C.VENDOR_ERROR, 'LOGIN-003': C.VENDOR_ERROR,
  'LOGIN-004': C.VENDOR_ERROR, 'LOGIN-005': C.VENDOR_ERROR,
  'I0001-005': C.VENDOR_ERROR, 'I0001-201': C.VENDOR_ERROR,
  'B0001-L01': C.NO_DATA, 'B0002-L01': C.NO_DATA,
  'I0001-010': C.AUTH_EXPIRED, //* 메시지별 의미 갈림 — 실측 확정 필요(문서 155)
  //* 동적 변형코드 — InfoTech 문서 미정의, prod 실측(2026-06-11)으로 분류
  'B0002-999': C.VENDOR_ERROR, 'I0001-999': C.VENDOR_ERROR, //* '처리중 오류가 발생하였습니다'
  'I0001-V01': C.AUTH_CODE_WRONG, //* '인증번호가 올바르지 않습니다 (남은 횟수 n/3)'
  'I0001-N01': C.NETWORK_ERROR, //* '네트워크 연결에 실패하였습니다'
  // 통신 resCd
  E101: C.NO_DATA, E102: C.NO_DATA, V101: C.NO_DATA, V102: C.NO_DATA,
  E201: C.DUPLICATE, E202: C.DUPLICATE, V201: C.DUPLICATE, V202: C.DUPLICATE,
  E203: C.RATE_LIMIT, V203: C.RATE_LIMIT, V007: C.RATE_LIMIT,
  E901: C.VENDOR_ERROR, E902: C.VENDOR_ERROR, E903: C.VENDOR_ERROR,
  V901: C.VENDOR_ERROR, V902: C.VENDOR_ERROR, V903: C.VENDOR_ERROR, C021: C.VENDOR_ERROR,
  E999: C.UNKNOWN,
  K001: C.SYSTEM_ERROR, K002: C.SYSTEM_ERROR, V008: C.SYSTEM_ERROR,
  V001: C.REQUEST_INVALID, V002: C.REQUEST_INVALID, V003: C.REQUEST_INVALID,
  V005: C.REQUEST_INVALID, V006: C.REQUEST_INVALID,
  //* ---- prod 실측 현행화(2026-06-29) ----
  E0304: C.NETWORK_ERROR, //* timeout of 300000ms exceeded(공통 래퍼코드)
  //* CF-99999: 어댑터가 업무코드 추출 실패 시 폴백. 실제 코드는 메시지에 [I0001-*]로 들어있음
  //*  (예 [I0001-V01] 인증번호 오류 / [I0001-N01] 네트워크). 빈도 높음(30일 677건) → unwrap 점검 필요.
  'CF-99999': C.UNKNOWN,
};

//* ---- inhouse (자체 스크래퍼 엔진): result.code = INH-* (엔진 result-codes.ts 미러) ----
const INHOUSE: Record<string, C> = {
  'INH-0000': C.OK, 'INH-0001': C.OK,
  'INH-1001': C.INPUT_INVALID, 'INH-1002': C.REQUEST_INVALID,
  'INH-2001': C.AUTH_EXPIRED, 'INH-2002': C.AUTH_CODE_WRONG, 'INH-2003': C.AUTH_TIMEOUT,
  'INH-3001': C.NO_DATA,
  'INH-4001': C.VENDOR_ERROR, 'INH-4002': C.NETWORK_ERROR,
  'INH-9001': C.SYSTEM_ERROR, 'INH-9002': C.BUSY, 'INH-9999': C.UNKNOWN,
  //* ---- prod 실측 현행화(2026-06-29) ----
  E0304: C.NETWORK_ERROR, //* 엔진 504/통신 타임아웃(공통 래퍼코드)
};

export const VENDOR_MAP: Record<TreatVendor, Record<string, C>> = {
  codef: CODEF,
  coocon: COOCON,
  octover: OCTOVER,
  hyphen: HYPHEN,
  inhouse: INHOUSE,
};
