import { and, eq } from "drizzle-orm";
import { getDb } from "../../../../../db";
import {
  applicationActivities,
  applicationDocuments,
  applications,
} from "../../../../../db/schema";
import {
  ADMIN_EMAIL,
  isApplicationStatus,
  statusMeta,
} from "../../../../../lib/workflow";

function adminEmail(request: Request) {
  return (request.headers.get("oai-authenticated-user-email") ?? "").toLowerCase();
}

export async function PATCH(
  request: Request,
  context: { params: Promise<{ id: string }> },
) {
  if (adminEmail(request) !== ADMIN_EMAIL) {
    return Response.json({ error: "غير مسموح." }, { status: 403 });
  }

  const { id } = await context.params;
  const applicationId = Number(id);
  if (!Number.isInteger(applicationId)) {
    return Response.json({ error: "رقم الملف غير صحيح." }, { status: 400 });
  }

  try {
    const payload = (await request.json()) as {
      status?: unknown;
      advisor?: unknown;
      nextAction?: unknown;
      internalNote?: unknown;
      document?: { id?: unknown; status?: unknown; note?: unknown };
    };
    const db = getDb();
    const now = new Date().toISOString();

    if (payload.document) {
      const documentId = Number(payload.document.id);
      const documentStatus = String(payload.document.status ?? "");
      if (
        !Number.isInteger(documentId) ||
        !["missing", "received", "validated"].includes(documentStatus)
      ) {
        return Response.json({ error: "حالة الوثيقة غير صحيحة." }, { status: 400 });
      }
      const [document] = await db
        .update(applicationDocuments)
        .set({
          status: documentStatus,
          note: String(payload.document.note ?? "").trim().slice(0, 500),
          updatedAt: now,
        })
        .where(
          and(
            eq(applicationDocuments.id, documentId),
            eq(applicationDocuments.applicationId, applicationId),
          ),
        )
        .returning();
      if (!document) return Response.json({ error: "الوثيقة غير موجودة." }, { status: 404 });
      return Response.json({ document });
    }

    const status = String(payload.status ?? "");
    if (!isApplicationStatus(status)) {
      return Response.json({ error: "حالة الملف غير صحيحة." }, { status: 400 });
    }
    const [before] = await db
      .select({ status: applications.status })
      .from(applications)
      .where(eq(applications.id, applicationId))
      .limit(1);
    if (!before) return Response.json({ error: "الملف غير موجود." }, { status: 404 });

    const [application] = await db
      .update(applications)
      .set({
        status,
        advisor: String(payload.advisor ?? "غير معيّن").trim().slice(0, 120),
        nextAction:
          String(payload.nextAction ?? "").trim().slice(0, 500) || statusMeta[status].next,
        internalNote: String(payload.internalNote ?? "").trim().slice(0, 1500),
        updatedAt: now,
      })
      .where(eq(applications.id, applicationId))
      .returning();

    if (before.status !== status) {
      await db.insert(applicationActivities).values({
        applicationId,
        type: "status",
        title: `تحديث الحالة: ${statusMeta[status].label}`,
        detail: application.nextAction,
        actor: ADMIN_EMAIL,
      });
    }

    return Response.json({ application });
  } catch {
    return Response.json({ error: "تعذر تحديث الملف حالياً." }, { status: 500 });
  }
}
