"use server";
import { prisma } from "@/lib/prisma";
import { revalidatePath } from "next/cache";
import bcrypt from "bcryptjs";

export async function getUsers() {
  try {
    const users = await prisma.staff.findMany({
      orderBy: { createdAt: 'desc' }
    });
    return { success: true, users };
  } catch (error: any) {
    return { success: false, error: "خطا در دریافت لیست پرسنل." };
  }
}

export async function createUser(data: any) {
  try {
    const existing = await prisma.staff.findFirst({
      where: { OR: [{ username: data.username }, { phone: data.phone }] }
    });
    
    if (existing) {
      if (existing.username === data.username) return { success: false, error: "نام کاربری (کد پرسنلی) قبلاً ثبت شده است." };
      if (existing.phone && existing.phone === data.phone) return { success: false, error: "شماره موبایل قبلاً ثبت شده است." };
    }

    const salt = await bcrypt.genSalt(10);
    const hash = await bcrypt.hash(data.password?.trim() || "123456", salt); // Default password for new staff

    const user = await prisma.staff.create({
      data: {
        username: data.username,
        passwordHash: hash,
        fullName: data.fullName || null,
        phone: data.phone || null,
        role: data.role,
        isActive: data.isActive !== undefined ? data.isActive : true,
        nationalCode: data.nationalCode || null,
        birthDate: data.birthDate ? new Date(data.birthDate) : null,
        syncStatus: 1,
      } as any
    });

    revalidatePath("/admin/users");
    revalidatePath("/admin/payroll");
    return { success: true, user };
  } catch (error: any) {
    return { success: false, error: "خطا در ایجاد پرسنل جدید." };
  }
}

export async function updateUser(id: string, data: any) {
  try {
    if (data.username || data.phone) {
       const existing = await prisma.staff.findFirst({
          where: {
             id: { not: id },
             OR: [
                ...(data.username ? [{ username: data.username }] : []),
                ...(data.phone ? [{ phone: data.phone }] : [])
             ]
          }
       });
       if (existing) return { success: false, error: "نام کاربری یا شماره موبایل در سیستم تکراری است." };
    }

    const updateData: any = {
      username: data.username,
      fullName: data.fullName || null,
      phone: data.phone || null,
      role: data.role,
      isActive: data.isActive,
      nationalCode: data.nationalCode || null,
      birthDate: data.birthDate ? new Date(data.birthDate) : null,
      syncStatus: 1,
      ...(data.avatarUrl !== undefined && { avatarUrl: data.avatarUrl }),
    } satisfies Record<string, any>;
    
    // Optional password reset
    if (data.password && data.password.trim() !== "") {
       const salt = await bcrypt.genSalt(10);
       updateData.passwordHash = await bcrypt.hash(data.password.trim(), salt);
    }

    const updated = await prisma.staff.update({
      where: { id },
      data: updateData
    });

    revalidatePath("/admin/users");
    revalidatePath("/admin/payroll");
    return { success: true, user: updated };
  } catch (error: any) {
    return { success: false, error: "خطا در ویرایش پرسنل." };
  }
}

export async function deleteUser(id: string) {
  try {
    // Check if staff has orders
    const orders = await prisma.order.count({ where: { staffId: id } });
    if (orders > 0) {
       // Cannot delete if they have financial footprints, so we softly disable them instead
       await prisma.staff.update({ where: { id }, data: { isActive: false } });
       revalidatePath("/admin/users");
       revalidatePath("/admin/payroll");
       return { success: true, message: "به دلیل ثبت اطلاعات مالی توسط این پرسنل، تنها اکانت ایشان غیرفعال شد." };
    }
    
    await prisma.staff.delete({ where: { id } });
    revalidatePath("/admin/users");
    revalidatePath("/admin/payroll");
    return { success: true, message: "پرسنل با موفقیت حذف شد." };
  } catch (error: any) {
    return { success: false, error: "خطا در حذف پرسنل." };
  }
}

export async function changeUserPassword(id: string, oldPass: string, newPass: string) {
  try {
    const user = await prisma.staff.findUnique({ where: { id } });
    if (!user || !user.passwordHash) return { success: false, error: "حساب کاربری یافت نشد." };

    const isValid = await bcrypt.compare(oldPass, user.passwordHash);
    if (!isValid) return { success: false, error: "رمز عبور فعلی اشتباه است." };

    const salt = await bcrypt.genSalt(10);
    const hash = await bcrypt.hash(newPass, salt);
    
    await prisma.staff.update({
      where: { id },
      data: { passwordHash: hash }
    });
    
    return { success: true, message: "رمز عبور با موفقیت تغییر یافت." };
  } catch (err: any) {
    return { success: false, error: "خطا در تغییر رمز عبور." };
  }
}

