import { getSessionUser } from "@/lib/auth";
import { saveAutoSendSettingsByOwnerEmail } from "@/lib/mail-auto-send";

export const runtime = "nodejs";
export const dynamic = "force-dynamic";

type AutoSendSettingsPayload = {
  dailySendLimit?: unknown;
  enabled?: unknown;
  maxSendCount?: unknown;
  nextRunAt?: unknown;
  phrases?: unknown;
  randomEnabled?: unknown;
  recipientDuplicateScope?: unknown;
  recipients?: unknown;
  sendIntervalMinutes?: unknown;
  sendIntervalPreset?: unknown;
  sendBatchSize?: unknown;
};

function normalizePayloadArray(value: unknown) {
  if (!Array.isArray(value)) {
    throw new Error("auto-send-invalid-payload");
  }

  return value;
}

function autoSendSettingsErrorMessage(error: unknown) {
  const message = error instanceof Error ? error.message : "";

  if (message === "auto-send-invalid-email") {
    return "자동발송 수신자 이메일 형식이 올바르지 않습니다.";
  }

  if (
    message === "auto-send-subject-required" ||
    message === "auto-send-recipient-required" ||
    message === "auto-send-phrase-required" ||
    message === "auto-send-random-phrase-required"
  ) {
    return "자동발송을 활성화하려면 받는 사람과 보낼 내용을 먼저 채워주세요.";
  }

  if (message === "auto-send-plan-required") {
    return "자동발송 예약은 성장 플랜에서 사용할 수 있습니다.";
  }

  return "자동발송 예약 설정 저장에 실패했습니다.";
}

function autoSendSettingsErrorStatus(error: unknown) {
  const message = error instanceof Error ? error.message : "";

  if (message === "auto-send-plan-required") {
    return 403;
  }

  if (message.startsWith("auto-send-")) {
    return 400;
  }

  return 500;
}

export async function POST(request: Request) {
  const user = await getSessionUser();

  if (!user) {
    return Response.json({ error: "unauthorized", ok: false }, { status: 401 });
  }

  let payload: AutoSendSettingsPayload | null = null;

  try {
    payload = (await request.json()) as AutoSendSettingsPayload;
  } catch {
    return Response.json(
      {
        error: "invalid-json",
        message: "자동발송 예약 설정 값이 올바르지 않습니다.",
        ok: false,
      },
      { status: 400 },
    );
  }

  try {
    const recipientsPayload = normalizePayloadArray(payload?.recipients);
    const phrasesPayload = normalizePayloadArray(payload?.phrases);
    const nextRunAtPayload = payload?.nextRunAt;

    const savedSettings = await saveAutoSendSettingsByOwnerEmail(user.email, {
      dailySendLimit: Number(payload?.dailySendLimit ?? payload?.maxSendCount ?? ""),
      enabled: payload?.enabled === true,
      nextRunAt: typeof nextRunAtPayload === "string" ? nextRunAtPayload : null,
      phrases: phrasesPayload.map((item) => {
        const row = item as {
          active?: unknown;
          bodyText?: unknown;
          selected?: unknown;
          subjectText?: unknown;
        };

        return {
          active: row.active !== false,
          bodyText: String(row.bodyText ?? ""),
          selected: row.selected !== false,
          subjectText: String(row.subjectText ?? ""),
        };
      }),
      randomEnabled: payload?.randomEnabled === true,
      recipientDuplicateScope: String(payload?.recipientDuplicateScope ?? ""),
      recipients: recipientsPayload.map((item) => {
        const row = item as {
          active?: unknown;
          displayName?: unknown;
          email?: unknown;
        };

        return {
          active: row.active !== false,
          displayName: String(row.displayName ?? ""),
          email: String(row.email ?? ""),
        };
      }),
      sendIntervalMinutes: Number(payload?.sendIntervalMinutes ?? ""),
      sendIntervalPreset: String(payload?.sendIntervalPreset ?? ""),
      sendBatchSize: Number(payload?.sendBatchSize ?? ""),
    });

    return Response.json({
      nextRunAt: savedSettings.nextRunAt,
      ok: true,
    });
  } catch (error) {
    return Response.json(
      {
        error: error instanceof Error ? error.message : "auto-send-save-failed",
        message: autoSendSettingsErrorMessage(error),
        ok: false,
      },
      { status: autoSendSettingsErrorStatus(error) },
    );
  }
}
