"use server";
import { prisma } from "@/lib/prisma";
import { revalidatePath } from "next/cache";

// --- Bank Accounts ---

export async function getBankAccounts() {
  try {
    const accounts = await prisma.bankAccount.findMany({
      where: { deletedAt: null },
      orderBy: { createdAt: "desc" },
    });
    return { success: true, accounts };
  } catch (err: any) {
    return { success: false, error: err.message };
  }
}

export async function createBankAccount(data: { name: string; bankName?: string; type: string; balance?: number; accountNumber?: string; shabaNumber?: string; cardNumber?: string }) {
  try {
    const account = await prisma.bankAccount.create({
      data: {
        name: data.name,
        bankName: data.bankName,
        type: data.type,
        balance: data.balance || 0,
        accountNumber: data.accountNumber,
        shabaNumber: data.shabaNumber,
        cardNumber: data.cardNumber,
      },
    });
    revalidatePath("/admin/accounting/accounts");
    return { success: true, account };
  } catch (err: any) {
    return { success: false, error: err.message };
  }
}

export async function updateBankAccount(id: string, data: any) {
  try {
    const account = await prisma.bankAccount.update({
      where: { id },
      data,
    });
    revalidatePath("/admin/accounting/accounts");
    return { success: true, account };
  } catch (err: any) {
    return { success: false, error: err.message };
  }
}

export async function deleteBankAccount(id: string) {
  try {
    await prisma.bankAccount.update({
      where: { id },
      data: { deletedAt: new Date() },
    });
    revalidatePath("/admin/accounting/accounts");
    return { success: true };
  } catch (err: any) {
    return { success: false, error: err.message };
  }
}

// --- Transactions ---

export async function getTransactions() {
  try {
    const transactions = await prisma.transaction.findMany({
      where: { deletedAt: null },
      include: {
        account: true,
        customer: true,
        supplier: true,
      },
      orderBy: { createdAt: "desc" },
    });
    return { success: true, transactions };
  } catch (err: any) {
    return { success: false, error: err.message };
  }
}

export async function createTransaction(data: { accountId: string; amount: number; type: string; description?: string; customerId?: string; supplierId?: string }) {
  try {
    const transaction = await prisma.transaction.create({
      data: {
        accountId: data.accountId,
        amount: data.amount,
        type: data.type, // 'IN' or 'OUT'
        description: data.description,
        customerId: data.customerId || null,
        supplierId: data.supplierId || null,
      },
    });

    // Update account balance
    await prisma.bankAccount.update({
      where: { id: data.accountId },
      data: {
        balance: data.type === 'IN' 
          ? { increment: data.amount } 
          : { decrement: data.amount }
      }
    });

    // Remove customer balance update as the field is not in schema
    if (data.supplierId) {
      await prisma.supplier.update({
        where: { id: data.supplierId },
        data: {
          balance: data.type === 'OUT' 
            ? { decrement: data.amount } // We paid supplier
            : { increment: data.amount } // Supplier refunded us
        }
      });
    }

    revalidatePath("/admin/accounting/transactions");
    revalidatePath("/admin/accounting/accounts");
    return { success: true, transaction };
  } catch (err: any) {
    return { success: false, error: err.message };
  }
}

// --- Cheques ---

export async function getCheques() {
  try {
    const cheques = await prisma.cheque.findMany({
      where: { deletedAt: null },
      include: {
        customer: true,
        supplier: true,
      },
      orderBy: { dueDate: "desc" },
    });
    return { success: true, cheques };
  } catch (err: any) {
    return { success: false, error: err.message };
  }
}

export async function createCheque(data: any) {
  try {
    const cheque = await prisma.cheque.create({
      data,
    });
    revalidatePath("/admin/accounting/cheques");
    return { success: true, cheque };
  } catch (err: any) {
    return { success: false, error: err.message };
  }
}

export async function updateChequeStatus(id: string, status: string) {
  try {
    const cheque = await prisma.cheque.update({
      where: { id },
      data: { status },
    });
    revalidatePath("/admin/accounting/cheques");
    return { success: true, cheque };
  } catch (err: any) {
    return { success: false, error: err.message };
  }
}
