import { NextRequest, NextResponse } from "next/server";
import { db } from "@/lib/db";
import { requirePageRole, resolveSchoolId, ApiError } from "@/lib/auth";
import { logAudit } from "@/lib/audit";
import { handleApiError } from "@/lib/api-helpers";
import { nextExpenseVoucherNumber } from "@/lib/voucher";

/** صرف أجر محاضرات (v8.1) — يُسجل مصروفاً تلقائياً (أجور المحاضرات) مع رقم وصل صرف */
export async function POST(req: NextRequest, ctx: { params: Promise<{ id: string }> }) {
  try {
    const user = await requirePageRole("finance", "ADMIN", "ACCOUNTANT", "SUPER_ADMIN");
    const schoolId = await resolveSchoolId(user, req.nextUrl.searchParams.get("schoolId"));
    const { id } = await ctx.params;
    const body = (await req.json().catch(() => ({}))) as Record<string, unknown>;
    const paidAt = body.paidAt ? new Date(String(body.paidAt)) : new Date();
    const manualVoucher = body.voucherNumber ? String(body.voucherNumber).trim() : "";

    const wage = await db.lectureWage.findFirst({
      where: { id, schoolId },
      include: { employee: { select: { name: true } } },
    });
    if (!wage) throw new ApiError("سجل الأجر غير موجود", 404);
    if (wage.paidAt) throw new ApiError("هذا الأجر مصروف مسبقاً", 400);
    if (isNaN(paidAt.getTime())) throw new ApiError("تاريخ الصرف غير صالح", 400);

    const voucherNumber = manualVoucher || (await nextExpenseVoucherNumber(schoolId, paidAt));

    const updated = await db.$transaction(async (tx) => {
      const expense = await tx.expense.create({
        data: {
          category: "أجور المحاضرات",
          kind: "LECTURE_WAGE",
          description: `أجر محاضرات: ${wage.employee.name} — شهر ${wage.month} (${wage.lectureCount} محاضرة × ${wage.lecturePrice})`,
          amount: wage.total,
          spentAt: paidAt,
          voucherNumber,
          createdById: user.id,
          schoolId,
        },
      });
      return tx.lectureWage.update({
        where: { id: wage.id },
        data: { paidAt, voucherNumber, expenseId: expense.id },
      });
    });

    await logAudit(user, {
      action: "PAY",
      entity: "LectureWage",
      entityId: wage.id,
      details: `صرف أجر محاضرات ${wage.employee.name} (شهر ${wage.month}) — مبلغ: ${wage.total} — وصل صرف: ${voucherNumber}`,
    });
    return NextResponse.json({ wage: updated });
  } catch (err) {
    return handleApiError(err);
  }
}
