"use server";

import { revalidatePath } from "next/cache";
import { AppwriteException } from "node-appwrite";

import { logAudit } from "./audit";
import { createSessionClient } from "./server";
import { getActiveTenantId } from "./tenant";
import type { ProfileState } from "./profile-types";

function appwriteError(e: unknown): string {
  if (e instanceof AppwriteException) {
    if (e.type === "user_invalid_credentials") return "Şifre hatalı.";
    if (e.type === "user_password_mismatch") return "Şifreler eşleşmiyor.";
    if (e.type === "user_email_already_exists")
      return "Bu email zaten başka bir hesapta kullanımda.";
    if (e.type === "user_password_recently_used")
      return "Bu şifreyi yakın zamanda kullandınız, başka bir şifre seçin.";
    if (e.type === "general_rate_limit_exceeded")
      return "Çok fazla deneme. Birkaç dakika sonra tekrar deneyin.";
    return e.message || "Beklenmeyen hata.";
  }
  return "Bağlantı hatası. Tekrar deneyin.";
}

async function audit(action: "update", entityType: string, changes: Record<string, unknown>) {
  try {
    const session = await createSessionClient();
    const user = await session.account.get();
    const tenantId = (await getActiveTenantId()) ?? "global";
    await logAudit({
      tenantId,
      userId: user.$id,
      action,
      entityType,
      entityId: user.$id,
      changes,
    });
  } catch {
    /* ignore */
  }
}

export async function updateNameAction(
  _prev: ProfileState,
  formData: FormData,
): Promise<ProfileState> {
  const name = String(formData.get("name") ?? "").trim();
  if (!name) {
    return { ok: false, error: "İsim boş olamaz.", fieldErrors: { name: "Zorunlu" } };
  }
  if (name.length > 128) {
    return { ok: false, error: "İsim çok uzun." };
  }

  try {
    const { account } = await createSessionClient();
    await account.updateName(name);
    await audit("update", "user_name", { name });
  } catch (e) {
    return { ok: false, error: appwriteError(e) };
  }

  revalidatePath("/", "layout");
  return { ok: true };
}

export async function updateEmailAction(
  _prev: ProfileState,
  formData: FormData,
): Promise<ProfileState> {
  const email = String(formData.get("email") ?? "").trim().toLowerCase();
  const password = String(formData.get("password") ?? "");

  if (!email || !/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email)) {
    return {
      ok: false,
      error: "Geçerli bir email girin.",
      fieldErrors: { email: "Geçersiz" },
    };
  }
  if (!password) {
    return {
      ok: false,
      error: "Doğrulama için şifrenizi girin.",
      fieldErrors: { password: "Zorunlu" },
    };
  }

  try {
    const { account } = await createSessionClient();
    await account.updateEmail(email, password);
    await audit("update", "user_email", { email });
  } catch (e) {
    return { ok: false, error: appwriteError(e) };
  }

  revalidatePath("/", "layout");
  return { ok: true };
}

export async function updatePasswordAction(
  _prev: ProfileState,
  formData: FormData,
): Promise<ProfileState> {
  const oldPassword = String(formData.get("oldPassword") ?? "");
  const newPassword = String(formData.get("newPassword") ?? "");
  const confirmPassword = String(formData.get("confirmPassword") ?? "");

  if (!oldPassword) {
    return {
      ok: false,
      error: "Mevcut şifrenizi girin.",
      fieldErrors: { oldPassword: "Zorunlu" },
    };
  }
  if (newPassword.length < 8) {
    return {
      ok: false,
      error: "Yeni şifre en az 8 karakter olmalı.",
      fieldErrors: { newPassword: "En az 8 karakter" },
    };
  }
  if (newPassword !== confirmPassword) {
    return {
      ok: false,
      error: "Şifreler eşleşmiyor.",
      fieldErrors: { confirmPassword: "Eşleşmiyor" },
    };
  }

  try {
    const { account } = await createSessionClient();
    await account.updatePassword(newPassword, oldPassword);
    await audit("update", "user_password", { changed: true });
  } catch (e) {
    return { ok: false, error: appwriteError(e) };
  }

  return { ok: true };
}
