"use server";

/** مدیریت سفارش‌ها: تغییر وضعیت با قواعد مجاز، کد رهگیری و پیامک اطلاع‌رسانی */
import { revalidatePath } from "next/cache";
import { redirect } from "next/navigation";
import { z } from "zod";
import { db } from "@/lib/db";
import { env } from "@/lib/env";
import { sms } from "@/integrations/sms";
import type { OrderStatus } from "@/generated/prisma/client";
import { requireStaff } from "./guard";

/** گذارهای مجاز وضعیت سفارش */
const transitions: Record<OrderStatus, OrderStatus[]> = {
  PENDING_PAYMENT: ["CANCELED"],
  PAID: ["PROCESSING", "CANCELED"],
  PROCESSING: ["SHIPPED", "CANCELED"],
  SHIPPED: ["DELIVERED"],
  DELIVERED: [],
  CANCELED: [],
};

export async function allowedNextStatuses(status: OrderStatus) {
  return transitions[status];
}

const schema = z.object({
  code: z.string().regex(/^ZH-[\d-]{4,20}$/),
  status: z.enum(["PENDING_PAYMENT", "PAID", "PROCESSING", "SHIPPED", "DELIVERED", "CANCELED"]),
  trackingCode: z.string().trim().max(60).optional(),
  note: z.string().trim().max(300).optional(),
});

export async function changeOrderStatusAction(formData: FormData) {
  await requireStaff("orders");
  const input = schema.parse({
    code: formData.get("code"),
    status: formData.get("status"),
    trackingCode: formData.get("trackingCode") || undefined,
    note: formData.get("note") || undefined,
  });
  const order = await db.order.findUnique({ where: { code: input.code }, include: { items: true, user: { select: { phone: true } } } });
  if (!order) throw new Error("سفارش پیدا نشد");
  if (!transitions[order.status].includes(input.status)) throw new Error("این تغییر وضعیت مجاز نیست");
  if (input.status === "SHIPPED" && !input.trackingCode && !order.trackingCode) {
    redirect(`/admin/orders/${order.code}?error=tracking`);
  }

  await db.$transaction(async (tx) => {
    const changed = await tx.order.updateMany({
      where: { id: order.id, status: order.status }, // جلوگیری از تغییر هم‌زمان توسط دو نفر
      data: { status: input.status, ...(input.trackingCode ? { trackingCode: input.trackingCode } : {}) },
    });
    if (changed.count === 0) throw new Error("وضعیت سفارش هم‌زمان تغییر کرده است؛ صفحه را تازه کنید");
    await tx.orderStatusHistory.create({ data: { orderId: order.id, status: input.status, note: input.note } });
    // لغو سفارش: برگرداندن موجودی (بازپرداخت وجه به‌صورت دستی از پنل درگاه انجام می‌شود)
    if (input.status === "CANCELED") {
      for (const i of order.items) await tx.productVariant.update({ where: { id: i.variantId }, data: { stock: { increment: i.qty } } });
    }
  });

  const tracking = input.trackingCode ?? order.trackingCode;
  const messages: Partial<Record<OrderStatus, string>> = {
    SHIPPED: `زهورا: سفارش ${order.code} ارسال شد.${tracking ? ` کد رهگیری: ${tracking}` : ""}`,
    DELIVERED: `زهورا: سفارش ${order.code} تحویل شد. از خرید شما سپاسگزاریم.`,
    CANCELED: `زهورا: سفارش ${order.code} لغو شد. برای پیگیری با پشتیبانی تماس بگیرید.`,
  };
  const msg = messages[input.status];
  if (msg) sms().send(order.user.phone, `${msg} ${env().NEXT_PUBLIC_SITE_URL}/track`).catch((e) => console.error("[sms]", e));

  revalidatePath(`/admin/orders/${order.code}`);
  revalidatePath("/admin/orders");
  redirect(`/admin/orders/${order.code}?saved=1`);
}
