'use server';

import { verifySession } from '@/lib/auth/dal';
import {
  validateMerchant,
  type MerchantFormState,
} from '@/lib/domain/merchant-form';

/**
 * TODO(백엔드): 등록이 자체 저장에서 BizPlay 외부 가맹점 등록 API 위임으로 바뀌었다 —
 *   `POST /api/v1/mngr/voc`가 @RequestBody(JSON)가 되고 `bizPlayVocApiService.insertVoc`를
 *   부른다. 예금주명·입금은행코드·입금계좌번호·업태코드가 새로 필수인데 이 폼은 받지 않는다.
 *   항목이 정해질 때까지 등록을 막는다.
 *
 *   화면의 [등록] 버튼만 비활성화하면 막은 것이 아니다 — Server Action은 UI를 거치지 않고도
 *   직접 호출된다. 그래서 저장 직전에서 끊는다.
 */
const DISABLED_MESSAGE =
  '가맹점 등록은 현재 사용할 수 없습니다. 등록 항목이 확정되면 다시 열립니다.';

function readString(formData: FormData, key: string): string {
  const value = formData.get(key);
  return typeof value === 'string' ? value : '';
}

export async function saveMerchantAction(
  _prevState: MerchantFormState,
  formData: FormData
): Promise<MerchantFormState> {
  await verifySession();

  const validation = validateMerchant({
    id: readString(formData, 'id'),
    brandName: readString(formData, 'brandName'),
    memo: readString(formData, 'memo'),
    name: readString(formData, 'name'),
    categoryCode: readString(formData, 'categoryCode'),
    businessNumber: readString(formData, 'businessNumber'),
    ownerName: readString(formData, 'ownerName'),
    phoneNumber: readString(formData, 'phoneNumber'),
    address: readString(formData, 'address'),
    addressDetail: readString(formData, 'addressDetail'),
    postalCode: readString(formData, 'postalCode'),
    latitude: readString(formData, 'latitude'),
    longitude: readString(formData, 'longitude'),
    isVisible: readString(formData, 'isVisible') === 'Y',
  });
  if (!validation.ok) {
    return { status: 'error', errors: validation.errors };
  }

  return { status: 'error', message: DISABLED_MESSAGE };
}
