'use server';

import { revalidatePath } from 'next/cache';
import { verifySession } from '@/lib/auth/dal';
import { fetchCommonCodes } from '@/lib/data/repositories/common-code-repository';
import {
  createPointStandard,
  deletePointStandard,
  updatePointStandard,
} from '@/lib/data/repositories/point-standard-repository';
import { CODE_GROUP } from '@/lib/domain/common-code';
import {
  validatePointStandard,
  type PointStandardFormState,
} from '@/lib/domain/point-standard-form';
import { POINT_STANDARDS_PATH } from '@/lib/domain/point-standard-query';

const SAVE_FAILED_MESSAGE = '저장하지 못했습니다. 잠시 후 다시 시도해 주세요.';
const DELETE_FAILED_MESSAGE = '삭제하지 못했습니다. 잠시 후 다시 시도해 주세요.';

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

function parseFormNumber(formData: FormData, key: string): number {
  const trimmed = readString(formData, key).trim();
  return trimmed === '' ? NaN : Number(trimmed);
}

function readFormValues(formData: FormData) {
  return {
    id: readString(formData, 'id'),
    eventCode: readString(formData, 'eventCode'),
    point: parseFormNumber(formData, 'point'),
    limitPoint: parseFormNumber(formData, 'limitPoint'),
    isDuplicable: readString(formData, 'isDuplicable') === 'Y',
    description: readString(formData, 'description'),
    isActive: readString(formData, 'isActive') === 'Y',
  };
}

/** 기획 PTS10100002_p(등록) — 이벤트는 등록된 코드 중에서 고른다. */
export async function createPointStandardAction(
  _prevState: PointStandardFormState,
  formData: FormData
): Promise<PointStandardFormState> {
  await verifySession();

  const validation = validatePointStandard(readFormValues(formData), {
    isCreate: true,
    // 화면이 보낸 코드를 그대로 믿지 않는다 — 저장 직전에 코드표를 다시 조회해 대조한다.
    allowedEventCodes: (
      await fetchCommonCodes(CODE_GROUP.pointEvent)
    ).map((code) => code.code),
  });
  if (!validation.ok) {
    return { status: 'error', errors: validation.errors };
  }

  try {
    await createPointStandard(validation.values);
  } catch {
    return { status: 'error', message: SAVE_FAILED_MESSAGE };
  }

  revalidatePath(POINT_STANDARDS_PATH);
  return { status: 'success' };
}

/** 기획 PTS10100002_p(수정) — 이벤트는 읽기 전용이라 hidden으로 실려 온다. */
export async function updatePointStandardAction(
  _prevState: PointStandardFormState,
  formData: FormData
): Promise<PointStandardFormState> {
  await verifySession();

  const validation = validatePointStandard(readFormValues(formData), {
    isCreate: false,
  });
  if (!validation.ok) {
    return { status: 'error', errors: validation.errors };
  }

  try {
    await updatePointStandard(validation.values);
  } catch {
    return { status: 'error', message: SAVE_FAILED_MESSAGE };
  }

  revalidatePath(POINT_STANDARDS_PATH);
  return { status: 'success' };
}

export async function deletePointStandardAction(
  id: string
): Promise<{ status: 'success' } | { status: 'error'; message: string }> {
  await verifySession();

  try {
    await deletePointStandard(id);
  } catch {
    return { status: 'error', message: DELETE_FAILED_MESSAGE };
  }

  revalidatePath(POINT_STANDARDS_PATH);
  return { status: 'success' };
}
