import type { ReactElement } from 'react'
import type { Code, CodeMap } from '../api/client'
import { CodeProvider } from './CodeProvider'

/**
 * 테스트용 코드표. V13~V15 시드와 같은 값이라 화면 테스트가 실제 선택지로 돌아간다.
 *
 * 서버 응답을 흉내 내는 것이므로 비활성 코드는 들어 있지 않다(서버가 활성만 내려준다).
 * 시드가 바뀌면 여기도 같이 고쳐야 한다 - 어긋나면 화면 테스트가 실제와 다른 선택지로
 * 통과해버린다.
 */
function code(c: string, label: string, sortOrder: number, attrs: Record<string, unknown> = {}): Code {
  return { code: c, label, sortOrder, attrs }
}

export const TEST_CODES: CodeMap = {
  STAGE: [
    code('1', '신청', 1, { groupKey: 'intake', progress: 'applied' }),
    code('2', '목록접수', 2, { groupKey: 'intake', progress: 'active', kpiFrom: 'docSubmitted' }),
    code('3', '예비검토', 3, { groupKey: 'intake', progress: 'active' }),
    code('4', '변호사 배당', 4, { groupKey: 'assign', progress: 'active' }),
    code('5', '법률검토(권리확인)', 5, { groupKey: 'check', progress: 'active' }),
    code('6', 'RE:확인', 6, { groupKey: 'check', progress: 'active' }),
    code('7', '법률검토(권리확인) 완료', 7, { groupKey: 'check', progress: 'active' }),
    code('8', '법률검토(권리처리)', 8, { groupKey: 'process', progress: 'active' }),
    code('9', 'RE:처리', 9, { groupKey: 'process', progress: 'active' }),
    code('10', '법률검토(권리처리) 완료', 10, { groupKey: 'process', progress: 'active' }),
    code('11', '법률검토 최종완료', 11, { groupKey: 'closing', progress: 'active' }),
    code('12', '보고서 작성', 12, { groupKey: 'closing', progress: 'active', kpiFrom: 'reportWriting' }),
    code('13', '보고서 제출 완료', 13, { groupKey: 'closing', progress: 'done', kpiFrom: 'completed' }),
  ],
  STAGE_GROUP: [
    code('intake', '접수', 1, { tone: 'slate' }),
    code('assign', '배당', 2, { tone: 'indigo' }),
    code('check', '권리확인', 3, { tone: 'emerald' }),
    code('process', '권리처리', 4, { tone: 'amber' }),
    code('closing', '마감', 5, { tone: 'violet' }),
  ],
  REVIEW_MAJOR: [
    code('만료 저작물', '만료 저작물', 1, { suggest: '신유형 개방', hasMinor: false }),
    code('업무상 저작물', '업무상 저작물', 2, { suggest: '신유형 개방', hasMinor: false }),
    code('제3자 권리', '제3자 권리', 3, { hasMinor: true }),
    code('개인정보 포함', '개인정보 포함', 4, { suggest: '개방불가', hasMinor: false }),
  ],
  REVIEW_MINOR: [
    code('1. 원시적 권리 전부 보유', '1. 원시적 권리 전부 보유', 1, { suggest: '신유형 개방' }),
    code('2. 후천적 권리 전부 보유(계약서 확인 필요)', '2. 후천적 권리 전부 보유', 2, {
      note: '(계약에 의한 전부 양수)',
      suggest: '계약서 등 재확인',
    }),
    code('3. 권리 일부(공동) 보유', '3. 권리 일부(공동) 보유', 3, {
      note: '(보도자료·제3자저작물, 계약에 의한 전부/공동 보유 등)',
      suggest: '권리처리 추진',
      allowed: ['권리처리 추진', '권리처리 추진 미희망'],
    }),
    code('4. 권리 미보유', '4. 권리 미보유', 4, {
      note: '(공모전 수상작 등)',
      suggest: '권리처리 추진',
      allowed: ['권리처리 추진', '권리처리 추진 미희망'],
    }),
    code('초상권 포함', '초상권 포함', 5, {
      suggest: '권리처리 추진',
      allowed: ['권리처리 추진', '권리처리 추진 미희망', '개방불가'],
    }),
  ],
  REVIEW_RESULT: [
    code('신유형 개방', '신유형 개방', 1, { tone: 'emerald', openable: 'Y' }),
    code('계약서 등 재확인', '계약서 등 재확인', 2, { tone: 'amber' }),
    code('권리처리 추진', '권리처리 추진', 3, { tone: 'blue', needsProcessing: true, koglSet: '보류' }),
    code('개방불가', '개방불가', 4, { tone: 'red', needsProcessing: false, koglSet: '개방불가' }),
    code('권리처리 추진 미희망', '권리처리 추진 미희망', 5, {
      tone: 'slate',
      needsProcessing: false,
      koglCopiesPrior: true,
    }),
  ],
  KOGL_TYPE: [
    code('0유형', '0유형', 1, { scopes: ['review', 'process', 'prior'], firstRow: ['review', 'process'] }),
    code('1유형', '1유형', 2, { scopes: ['review', 'process', 'prior'], firstRow: [] }),
    code('2유형', '2유형', 3, { scopes: ['review', 'process', 'prior'], firstRow: [] }),
    code('3유형', '3유형', 4, { scopes: ['review', 'process', 'prior'], firstRow: [] }),
    code('4유형', '4유형', 5, { scopes: ['review', 'process', 'prior'], firstRow: [] }),
    code('개방불가', '개방불가', 6, { scopes: ['review', 'process'], firstRow: ['review', 'process'] }),
    code('보류', '보류', 7, { scopes: ['review'], firstRow: ['review'] }),
    code('유형 확인 필요', '유형 확인 필요', 8, { scopes: ['prior'], firstRow: [], surveyOnly: true }),
    code('제4유형', '제4유형', 9, { scopes: ['prior'], firstRow: [], surveyOnly: true, sameAs: '4유형' }),
  ],
  PROCESS_STATUS: [
    code('미처리', '미처리', 1, { done: false }),
    code('처리완료', '처리완료', 2, { done: true, stampsProcessedAt: true }),
  ],
  CONTRACT_DOC: [
    code('양도계약서', '양도계약서', 1),
    code('제안요청서', '제안요청서', 2),
    code('초상이용동의서', '초상이용동의서', 3),
    code('공공누리동의서', '공공누리동의서', 4),
    code('공문', '공문', 5),
    code('기타', '기타', 6, { freeText: true }),
  ],
  CONTACT_METHOD: [
    code('전화', '전화', 1),
    code('메일', '메일', 2),
    code('방문', '방문', 3),
    code('기타', '기타', 4),
  ],
  CONTACT_CATEGORY: [
    code('APPLICANT', '신청기관', 1, { tone: 'blue', importAlias: '신청기관' }),
    code('MJ', '문정원', 2, { tone: 'emerald', importAlias: '주관기관' }),
    code('LAWYER', '변호사', 3, { tone: 'violet', importAlias: '변호사' }),
    code('OPERATOR', '수행기관', 4, { tone: 'sky', importAlias: '수행기관' }),
    code('ITN', '아이티앤 담당자', 5, { tone: 'orange', importAlias: '아이티앤 담당자' }),
  ],
  ATTACHMENT_YN: [code('있음', '있음', 1), code('없음', '없음', 2)],
  KOGL_ATTACHED: [code('부착', '부착', 1), code('미부착', '미부착', 2)],
}

/** 화면 하나를 코드표와 함께 그린다. 서버를 부르지 않는다. */
export function withCodes(ui: ReactElement, codes: CodeMap = TEST_CODES): ReactElement {
  return <CodeProvider codes={codes}>{ui}</CodeProvider>
}
