'use server';

import { revalidatePath } from 'next/cache';
import { verifySession } from '@/lib/auth/dal';
import { updateStudentMemberUseYn } from '@/lib/data/repositories/student-member-repository';
import { STUDENT_MEMBERS_PATH } from '@/lib/domain/student-member-query';

export type UpdateStudentActiveStatusState =
  | { status: 'idle' }
  | { status: 'error'; error: string }
  | { status: 'success' };

const INVALID_INPUT_ERROR = '요청 값이 올바르지 않습니다.';

/**
 * 학생 회원 사용여부 변경 Server Action.
 *
 *   PUT /api/v1/mngr/user/{userId}/{useYn}
 *
 * 백엔드에 값도 변경 API도 없어 한동안 막아 두었던 경로다. edupay-backend develop 4d98756에서
 * 목록 응답에 `useYn`이 실리고 변경 API가 생기면서 되살렸다.
 *
 * 인증 확인을 본문 맨 앞에 둔다 — Server Action은 UI를 거치지 않고 직접 POST될 수 있어 이
 * 확인이 유일한 최종 방어선이다. 실패 사유는 일반화된 문구만 화면으로 보낸다(백엔드 message
 * 원문에는 내부 정보가 실릴 수 있다).
 */
export async function updateStudentActiveStatus(
  _prevState: UpdateStudentActiveStatusState,
  formData: FormData
): Promise<UpdateStudentActiveStatusState> {
  await verifySession();

  const id = formData.get('id');
  if (typeof id !== 'string' || id.trim() === '') {
    return { status: 'error', error: INVALID_INPUT_ERROR };
  }

  // 체크박스는 켜졌을 때만 값이 실린다 — 없으면 꺼진 것이다.
  const isActive = formData.get('isActive') !== null;

  const result = await updateStudentMemberUseYn(id, isActive);
  if (!result.ok) {
    return { status: 'error', error: result.message };
  }

  // 목록의 사용여부 열이 방금 바꾼 값을 반영해야 한다.
  revalidatePath(STUDENT_MEMBERS_PATH);
  return { status: 'success' };
}
