"use server";

import { redirect } from "next/navigation";
import { revalidatePath } from "next/cache";
import { createAdminSupabaseClient } from "@/lib/supabase/admin";
import { createServerSupabaseClient } from "@/lib/supabase/server";
import { isSupabaseConfigured } from "@/lib/supabase/config";
import { loginSchema } from "@/lib/validation";
import { writeAuditLog } from "@/lib/audit";

export type AuthState = { error?: string; success?: string };

const INVALID_CREDENTIALS = "البريد الإلكتروني أو اسم المستخدم أو كلمة المرور غير صحيحة";

export async function loginAction(_state: AuthState, formData: FormData): Promise<AuthState> {
  if (!isSupabaseConfigured()) {
    return {
      error:
        "تسجيل الدخول غير متاح حتى تتم إضافة مفتاح Supabase العام إلى إعدادات الخادم."
    };
  }

  const parsed = loginSchema.safeParse({
    identifier: formData.get("identifier"),
    password: formData.get("password")
  });
  if (!parsed.success) return { error: parsed.error.issues[0]?.message ?? "بيانات الدخول غير صحيحة" };

  let supabase: Awaited<ReturnType<typeof createServerSupabaseClient>>;
  try {
    supabase = await createServerSupabaseClient();
  } catch {
    return { error: "إعدادات الاتصال بقاعدة البيانات غير مكتملة." };
  }
  let credentials:
    | { email: string; password: string }
    | { phone: string; password: string };
  if (parsed.data.identifier.type === "email") {
    credentials = {
      email: parsed.data.identifier.value,
      password: parsed.data.password
    };
  } else if (parsed.data.identifier.type === "phone") {
    credentials = {
      phone: parsed.data.identifier.value,
      password: parsed.data.password
    };
  } else {
    try {
      const admin = createAdminSupabaseClient();
      const { data: account, error: lookupError } = await admin
        .from("profiles")
        .select("phone")
        .eq("role", "donor")
        .eq("login_username", parsed.data.identifier.value)
        .maybeSingle();
      if (lookupError || !account?.phone) return { error: INVALID_CREDENTIALS };
      credentials = {
        phone: account.phone,
        password: parsed.data.password
      };
    } catch {
      return { error: INVALID_CREDENTIALS };
    }
  }
  const { data, error } = await supabase.auth.signInWithPassword(credentials);
  if (error || !data.user) return { error: "البريد الإلكتروني أو رقم الهاتف أو كلمة المرور غير صحيحة" };

  const { data: profile, error: profileError } = await supabase
    .from("profiles")
    .select("role, is_active, must_change_password")
    .eq("id", data.user.id)
    .single();

  if (profileError || !profile || !["admin", "donor"].includes(profile.role)) {
    await supabase.auth.signOut();
    return { error: "هذا الحساب غير مصرح له بالدخول." };
  }
  if (!profile.is_active) {
    await supabase.auth.signOut();
    return { error: "هذا الحساب غير نشط. تواصل مع الإدارة." };
  }

  await writeAuditLog({
    actorId: data.user.id,
    action: "auth.login",
    entityType: "profile",
    entityId: data.user.id,
    metadata: {
      role: profile.role,
      identifierType: parsed.data.identifier.type
    }
  });
  revalidatePath("/", "layout");
  redirect(
    profile.role === "admin"
      ? "/admin"
      : profile.must_change_password
        ? "/donor/security?required=1"
        : "/donor"
  );
}

export async function logoutAction() {
  const supabase = await createServerSupabaseClient();
  const {
    data: { user }
  } = await supabase.auth.getUser();
  await supabase.auth.signOut();
  await writeAuditLog({
    actorId: user?.id,
    action: "auth.logout",
    entityType: "profile",
    entityId: user?.id
  });
  revalidatePath("/", "layout");
  redirect("/login");
}

export async function changePasswordAction(_state: AuthState, formData: FormData): Promise<AuthState> {
  const password = String(formData.get("password") ?? "");
  const confirmation = String(formData.get("confirmation") ?? "");
  if (password.length < 6) return { error: "يجب ألا تقل كلمة المرور عن 6 أحرف." };
  if (password !== confirmation) return { error: "تأكيد كلمة المرور غير مطابق" };

  const supabase = await createServerSupabaseClient();
  const {
    data: { user }
  } = await supabase.auth.getUser();
  if (!user) return { error: "تعذر التحقق من الحساب الحالي" };

  const admin = createAdminSupabaseClient();
  const { data: currentProfile, error: currentProfileError } = await admin
    .from("profiles")
    .select("login_username,must_change_password")
    .eq("id", user.id)
    .maybeSingle();
  if (currentProfileError || !currentProfile) {
    return { error: "تعذر التحقق من حالة الحساب" };
  }
  if (
    currentProfile.must_change_password &&
    currentProfile.login_username === password
  ) {
    return { error: "اختر كلمة مرور جديدة تختلف عن كلمة المرور الأولية" };
  }

  const { error } = await supabase.auth.updateUser({ password });
  if (error) return { error: "تعذر تحديث كلمة المرور" };

  const { error: profileError } = await admin
    .from("profiles")
    .update({ must_change_password: false })
    .eq("id", user.id);
  if (profileError) {
    return { error: "تم تغيير كلمة المرور، لكن تعذر إكمال تحديث الحساب. أعد المحاولة بكلمة المرور الجديدة." };
  }

  await writeAuditLog({
    actorId: user.id,
    action: "auth.password_changed",
    entityType: "profile",
    entityId: user.id
  });
  revalidatePath("/donor", "layout");
  return { success: "تم تحديث كلمة المرور" };
}
