"use server";

import prisma from "@/lib/prisma";
import bcrypt from "bcryptjs";
import { revalidatePath } from "next/cache";

export type UserActionState = {
  success?: boolean;
  message?: string;
} | null;

export async function getUsers() {
  return await prisma.user.findMany({
    select: {
      id: true,
      username: true,
      createdAt: true,
      updatedAt: true,
    },
    orderBy: {
      createdAt: 'desc'
    }
  });
}

export async function createUser(prevState: UserActionState, formData: FormData): Promise<UserActionState> {
  const username = formData.get("username") as string;
  const password = formData.get("password") as string;

  if (!username || !password) {
    return { success: false, message: "Kullanıcı adı ve şifre gereklidir." };
  }

  try {
    const existingUser = await prisma.user.findUnique({
      where: { username }
    });

    if (existingUser) {
      return { success: false, message: "Bu kullanıcı adı zaten kullanılıyor." };
    }

    const hashedPassword = await bcrypt.hash(password, 10);

    await prisma.user.create({
      data: {
        username,
        password: hashedPassword,
      }
    });

    revalidatePath("/admin/users");
    return { success: true, message: "Kullanıcı başarıyla oluşturuldu." };
  } catch (error) {
    return { success: false, message: "Kullanıcı oluşturulurken bir hata oluştu." };
  }
}

export async function updateUser(prevState: UserActionState, formData: FormData): Promise<UserActionState> {
  const idStr = formData.get("id") as string;
  const username = formData.get("username") as string;
  const password = formData.get("password") as string; // Optional during update

  if (!idStr || !username) {
    return { success: false, message: "Kullanıcı adı gereklidir." };
  }

  const id = parseInt(idStr, 10);

  try {
    const existingUser = await prisma.user.findUnique({
      where: { username }
    });

    if (existingUser && existingUser.id !== id) {
      return { success: false, message: "Bu kullanıcı adı zaten kullanılıyor." };
    }

    const dataToUpdate: any = { username };

    if (password) {
      dataToUpdate.password = await bcrypt.hash(password, 10);
    }

    await prisma.user.update({
      where: { id },
      data: dataToUpdate,
    });

    revalidatePath("/admin/users");
    return { success: true, message: "Kullanıcı başarıyla güncellendi." };
  } catch (error) {
    return { success: false, message: "Kullanıcı güncellenirken bir hata oluştu." };
  }
}

export async function deleteUser(id: number) {
  try {
    const userCount = await prisma.user.count();
    
    if (userCount <= 1) {
      return { success: false, message: "Sistemde en az bir yönetici bulunmalıdır. Bu kullanıcıyı silemezsiniz." };
    }

    await prisma.user.delete({
      where: { id }
    });

    revalidatePath("/admin/users");
    return { success: true, message: "Kullanıcı başarıyla silindi." };
  } catch (error) {
    return { success: false, message: "Kullanıcı silinirken bir hata oluştu." };
  }
}
