import { formatCommonCode, type CommonCode } from '@/lib/domain/common-code';
/**
 * 백엔드 `TB_COM_VOUCHER`(`/api/v1/mngr/voc/**`) 한 행. 필드 이름이 화면 용어와 달라
 * Repository가 옮긴다 — `frcsNo`=코드, `frcsNm`=가맹점명, `brno`=사업자번호,
 * `rprsvNm`=대표자명, `rprsvTelno`=전화번호, `frcsPostAddr`/`frcsDaddr`=주소/상세주소.
 */
export interface Merchant {
  id: string;
  /** `frcsNo` — 서버가 만든다. 수정 불가(기획 MCH_003_p ①). */
  code: string;
  /**
   * 아래 넷은 백엔드 `TB_COM_VOUCHER`에 컬럼이 없어 **항상 빈 값**이다. 기획 시안에 있는
   * 항목이라 화면에서는 지우지 않고 값이 없을 때 `-`로 보여준다(사용자 확정).
   */
  brandName: string;
  memo: string;
  createdAt: string;
  updatedAt: string;
  name: string;
  categoryCode: string;
  businessNumber: string;
  ownerName: string;
  phoneNumber: string;
  address: string;
  addressDetail: string;
  postalCode: string;
  latitude: string;
  longitude: string;
  /** 백엔드 `frcsBzstatCd` — 업태 코드(`FRCS_BZSTAT_CD`). */
  businessStatusCode: string;
  /** 백엔드 `frcsDvCd` — 가맹점 구분(`FRCS_DV_CD`). */
  divisionCode: string;
  /** 백엔드 `useYn`. develop 목록엔 없어 `null`(모름)이고 feature/voc부터 온다. */
  isVisible: boolean | null;
}

/** 가맹몰 등록·수정 폼이 쓰는 코드표 넷 — 화면이 한 번에 받아 모달까지 내려보낸다. */
export type MerchantCodeTables = {
  /** 업종 이름 찾기용(`FRCS_TPBIZ_CD` 다음 `FRCS_CD`) — 옛 행의 4자리 값까지 이름을 낸다. */
  business: CommonCode[];
  /** 업종 선택지 — `FRCS_TPBIZ_CD`(2자리)만. 4자리 `FRCS_CD`는 업종+업태를 이어 붙인 것이라 저장값이 아니다. */
  businessOptions: CommonCode[];
  businessStatus: CommonCode[];
  division: CommonCode[];
  bank: CommonCode[];
};

/** 가맹점 구분 기본값 — 관리자가 만드는 가맹점은 일반가맹점이다. */
export const DEFAULT_MERCHANT_DIVISION_CODE = '62';

export const EMPTY_FIELD_PLACEHOLDER = '-';

export function formatOptionalValue(
  value: string | number | null | undefined
): string {
  return value === null || value === undefined || value === ''
    ? EMPTY_FIELD_PLACEHOLDER
    : String(value);
}

/** 업종 이름 — 공통코드 `FRCS_TPBIZ_CD`에서 먼저, 없으면 `FRCS_CD`(4자리)에서 찾고, 그래도 없으면 코드를 그대로 보인다. */
export function formatCategoryLabel(codes: readonly CommonCode[], code: string): string {
  if (!code) {
    return EMPTY_FIELD_PLACEHOLDER;
  }
  return formatCommonCode(codes, code);
}

export function formatVisibilityLabel(isVisible: boolean | null): string {
  if (isVisible === null) {
    return EMPTY_FIELD_PLACEHOLDER;
  }
  return isVisible ? '노출' : '미노출';
}

/** 목록의 주소 칸 — 상세주소까지 붙이면 한 줄을 넘겨 표가 밀린다. */
export function formatAddressSummary(merchant: Merchant): string {
  return formatOptionalValue(merchant.address);
}

/**
 * 업종 코드 ↔ 백엔드 필드 — 조회·저장 모두 `FRCS_TPBIZ_CD`(BizPlay 업종코드)다.
 * `FRCS_DV_CD`는 가맹점 구분(온라인/일반)이라 업종이 아니다.
 *
 * 이슈: 목록 검색만 `searchFrcsTpbizCd`를 `FRCS_DV_CD`와 비교한다(보고함).
 */
export const MERCHANT_CATEGORY_READ_FIELD = 'frcsTpbizCd';
export const MERCHANT_CATEGORY_WRITE_FIELD = 'frcsTpbizCd';
