import { getSessionUser } from "@/lib/auth";
import {
  deleteMailboxCustomSpamRulesByEmail,
  getMailboxSpamRuleSettingsByEmail,
  saveMailboxCustomSpamRuleByEmail,
  setMailboxSenderDispositionByEmail,
  updateMailboxSpamGeneralSettingsByEmail,
  updateMailboxCustomSpamRuleEnabledByEmail,
  type MailboxCustomSpamRuleField,
  type MailboxSpamGeneralSettings,
  type MailboxSpamRuleAction
} from "@/lib/official-mail";

function spamRuleError(error: unknown) {
  const code = error instanceof Error ? error.message : "spam-rule-failed";
  const message =
    code === "sender-address-required"
      ? "올바른 발신자 이메일을 입력해주세요."
      : code === "spam-rule-value-required"
        ? "규칙에 사용할 값을 입력해주세요."
        : code === "spam-rule-limit"
          ? "사용자 스팸 규칙은 최대 1,000개까지 등록할 수 있습니다."
          : code === "spam-rule-not-found"
            ? "스팸 규칙을 찾지 못했습니다."
            : "스팸 설정을 처리하지 못했습니다. 잠시 후 다시 시도해주세요.";
  return Response.json({ error: code, message, ok: false }, { status: code === "spam-rule-not-found" ? 404 : 400 });
}

export async function GET() {
  const user = await getSessionUser();
  if (!user) return Response.json({ error: "unauthorized", ok: false }, { status: 401 });
  try {
    return Response.json({ ok: true, settings: await getMailboxSpamRuleSettingsByEmail(user.email) });
  } catch (error) {
    return spamRuleError(error);
  }
}

export async function POST(request: Request) {
  const user = await getSessionUser();
  if (!user) return Response.json({ error: "unauthorized", ok: false }, { status: 401 });
  const payload = (await request.json().catch(() => null)) as Record<string, unknown> | null;

  try {
    if (payload?.kind === "sender") {
      const rawAction = payload.action;
      const action: MailboxSpamRuleAction | null = rawAction === "spam" || rawAction === "allow" ? rawAction : null;
      const result = await setMailboxSenderDispositionByEmail(
        user.email,
        String(payload.senderAddress ?? ""),
        action,
        {
          moveExistingMessages: Boolean(payload.moveExistingMessages),
          targetFolder: String(payload.targetFolder ?? "inbox")
        }
      );
      return Response.json({ ok: true, result });
    }

    const settings = await saveMailboxCustomSpamRuleByEmail(user.email, {
      action: payload?.action === "allow" ? "allow" : "spam",
      enabled: payload?.enabled !== false,
      field: String(payload?.field ?? "sender") as MailboxCustomSpamRuleField,
      priority: Number(payload?.priority ?? 0),
      ruleId: Number(payload?.ruleId ?? 0) || null,
      value: String(payload?.value ?? "")
    });
    return Response.json({ ok: true, settings });
  } catch (error) {
    return spamRuleError(error);
  }
}

export async function PUT(request: Request) {
  const user = await getSessionUser();
  if (!user) return Response.json({ error: "unauthorized", ok: false }, { status: 401 });
  const payload = (await request.json().catch(() => null)) as Partial<MailboxSpamGeneralSettings> | null;
  try {
    const settings = await updateMailboxSpamGeneralSettingsByEmail(user.email, payload ?? {});
    return Response.json({ ok: true, settings });
  } catch (error) {
    return spamRuleError(error);
  }
}

export async function PATCH(request: Request) {
  const user = await getSessionUser();
  if (!user) return Response.json({ error: "unauthorized", ok: false }, { status: 401 });
  const payload = (await request.json().catch(() => null)) as { enabled?: boolean; ruleId?: number | string } | null;
  try {
    const enabled = await updateMailboxCustomSpamRuleEnabledByEmail(
      user.email,
      payload?.ruleId ?? 0,
      Boolean(payload?.enabled)
    );
    return Response.json({ enabled, ok: true });
  } catch (error) {
    return spamRuleError(error);
  }
}

export async function DELETE(request: Request) {
  const user = await getSessionUser();
  if (!user) return Response.json({ error: "unauthorized", ok: false }, { status: 401 });
  const payload = (await request.json().catch(() => null)) as {
    kind?: "custom" | "sender";
    ruleIds?: Array<number | string>;
    senderAddresses?: string[];
  } | null;
  try {
    if (payload?.kind === "sender") {
      let deletedCount = 0;
      for (const sender of payload.senderAddresses ?? []) {
        await setMailboxSenderDispositionByEmail(user.email, sender, null);
        deletedCount += 1;
      }
      return Response.json({ deletedCount, ok: true });
    }
    const deletedCount = await deleteMailboxCustomSpamRulesByEmail(user.email, payload?.ruleIds ?? []);
    return Response.json({ deletedCount, ok: true });
  } catch (error) {
    return spamRuleError(error);
  }
}
