import { notFound } from "next/navigation";
import { and, eq } from "drizzle-orm";
import { requireSession } from "@/lib/auth";
import { db } from "@/db";
import { orders, orderLines } from "@/db/schema";
import { canViewOrder } from "@/lib/rbac";
import { today } from "@/lib/period";
import { PageHeader, EmptyState } from "@/components/ui";
import { OrderForm } from "../../moi/order-form";
import { loadOrderFormOptions } from "../../form-options";
import { idOr404 } from "@/lib/route-params";

export const dynamic = "force-dynamic";

export default async function EditOrderPage({ params }: { params: Promise<{ id: string }> }) {
  const session = await requireSession();
  const id = idOr404((await params).id);

  const [order] = await db
    .select({
      id: orders.id,
      code: orders.code,
      customerId: orders.customerId,
      orderDate: orders.orderDate,
      dueDate: orders.dueDate,
      note: orders.note,
      status: orders.status,
      salesUserId: orders.salesUserId,
      territoryId: orders.territoryId,
      vatRequired: orders.vatRequired,
      receiverName: orders.receiverName,
      receiverPhone: orders.receiverPhone,
      receiverAddress: orders.receiverAddress,
      carrierName: orders.carrierName,
      carrierPhone: orders.carrierPhone,
      carrierAddress: orders.carrierAddress,
      surchargeAmount: orders.surchargeAmount,
    })
    .from(orders)
    .where(and(eq(orders.tenantId, session.tenantId), eq(orders.id, id)))
    .limit(1);

  if (!order) notFound();
  if (!(await canViewOrder(session, { salesUserId: order.salesUserId, territoryId: order.territoryId }))) notFound();
  if (order.status === "CANCELLED") notFound();
  // Đơn đã duyệt không sửa được, trừ Ban giám đốc.
  if (order.status === "CONFIRMED" && session.role !== "DIRECTOR") {
    return (
      <>
        <PageHeader title={`Đơn hàng ${order.code}`} />
        <EmptyState
          message="Đơn này đã được duyệt nên không sửa được."
          hint="Thông tin đã duyệt được khoá. Liên hệ Ban giám đốc nếu cần điều chỉnh."
        />
      </>
    );
  }

  const [lines, options] = await Promise.all([
    db
      .select({
        productId: orderLines.productId,
        qtySold: orderLines.qtySold,
        qtyPromo: orderLines.qtyPromo,
        unitPrice: orderLines.unitPrice,
      })
      .from(orderLines)
      .where(eq(orderLines.orderId, id)),
    loadOrderFormOptions(session, order.customerId),
  ]);

  return (
    <>
      <PageHeader
        title={`Sửa đơn ${order.code}`}
        subtitle="Sửa xong, toàn bộ số liệu báo cáo và phân hạng liên quan sẽ được tính lại trong lần chạy job kế tiếp."
      />
      <OrderForm
        customers={options.customers}
        products={options.products}
        today={today()}
        order={{
          id: order.id,
          code: order.code,
          customerId: order.customerId,
          orderDate: order.orderDate,
          dueDate: order.dueDate,
          note: order.note,
          vatRequired: order.vatRequired,
          receiverName: order.receiverName,
          receiverPhone: order.receiverPhone,
          receiverAddress: order.receiverAddress,
          carrierName: order.carrierName,
          carrierPhone: order.carrierPhone,
          carrierAddress: order.carrierAddress,
          surchargeAmount: Number(order.surchargeAmount),
          lines: lines.map((line) => ({
            productId: line.productId,
            qtySold: line.qtySold,
            qtyPromo: line.qtyPromo,
            unitPrice: Number(line.unitPrice),
          })),
        }}
      />
    </>
  );
}
