"use server";

import {auth} from "@/auth";
import {prisma} from "@/lib/db/prisma";
import {getTenantDb} from "@/lib/db/tenant";
import {revalidatePath} from "next/cache";
import {z} from "zod";

export type CouponActionResult = {success: boolean; error?: string; id?: string};

const couponSchema = z.object({
  tenantSlug: z.string().min(1),
  code: z.string().min(2, "Code is required").toUpperCase(),
  type: z.enum(["PERCENTAGE", "FIXED_AMOUNT"]),
  value: z.coerce.number().min(0.01, "Value must be positive"),
  usageLimit: z.coerce.number().optional(),
  minimumAmount: z.coerce.number().optional(),
  startsAt: z.string().optional(),
  endsAt: z.string().optional()
});

// ─────────────────────────────────────────────────────────
// Create Coupon
// ─────────────────────────────────────────────────────────
export async function createCoupon(formData: FormData): Promise<CouponActionResult> {
  const session = await auth();
  if (!session?.user?.id) return {success: false, error: "Unauthorized"};

  const raw = Object.fromEntries(formData.entries());
  const parsed = couponSchema.safeParse(raw);
  if (!parsed.success) {
    return {success: false, error: parsed.error.issues[0]?.message ?? "Validation error"};
  }

  const d = parsed.data;
  const tenant = await prisma.tenant.findUnique({where: {slug: d.tenantSlug}});
  if (!tenant) return {success: false, error: "Tenant not found"};

  try {
    const db = getTenantDb(tenant.id);

    // Check code uniqueness
    const existing = await db.coupon.findFirst({where: {code: d.code}});
    if (existing) return {success: false, error: "Coupon code already exists"};

    const coupon = await db.coupon.create({
      data: {
        tenantId: tenant.id,
        code: d.code,
        type: d.type,
        value: d.value,
        usageLimit: d.usageLimit ?? null,
        minimumAmount: d.minimumAmount ?? null,
        startsAt: d.startsAt ? new Date(d.startsAt) : null,
        endsAt: d.endsAt ? new Date(d.endsAt) : null,
        isActive: true
      }
    });

    revalidatePath(`/company/${d.tenantSlug}/coupons`);
    return {success: true, id: coupon.id};
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : "Unknown error";
    return {success: false, error: "Failed to create coupon: " + message};
  }
}

// ─────────────────────────────────────────────────────────
// Update Coupon
// ─────────────────────────────────────────────────────────
const updateCouponSchema = couponSchema.extend({
  couponId: z.string().min(1)
});

export async function updateCoupon(formData: FormData): Promise<CouponActionResult> {
  const session = await auth();
  if (!session?.user?.id) return {success: false, error: "Unauthorized"};

  const raw = Object.fromEntries(formData.entries());
  const parsed = updateCouponSchema.safeParse(raw);
  if (!parsed.success) {
    return {success: false, error: parsed.error.issues[0]?.message ?? "Validation error"};
  }

  const d = parsed.data;
  const tenant = await prisma.tenant.findUnique({where: {slug: d.tenantSlug}});
  if (!tenant) return {success: false, error: "Tenant not found"};

  try {
    const db = getTenantDb(tenant.id);
    await db.coupon.updateMany({
      where: {id: d.couponId},
      data: {
        code: d.code,
        type: d.type,
        value: d.value,
        usageLimit: d.usageLimit ?? null,
        minimumAmount: d.minimumAmount ?? null,
        startsAt: d.startsAt ? new Date(d.startsAt) : null,
        endsAt: d.endsAt ? new Date(d.endsAt) : null
      }
    });

    revalidatePath(`/company/${d.tenantSlug}/coupons`);
    return {success: true, id: d.couponId};
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : "Unknown error";
    return {success: false, error: "Failed to update coupon: " + message};
  }
}

// ─────────────────────────────────────────────────────────
// Toggle Coupon Active
// ─────────────────────────────────────────────────────────
export async function toggleCouponActive(
  couponId: string,
  tenantSlug: string,
  isActive: boolean
): Promise<CouponActionResult> {
  const session = await auth();
  if (!session?.user?.id) return {success: false, error: "Unauthorized"};

  const tenant = await prisma.tenant.findUnique({where: {slug: tenantSlug}});
  if (!tenant) return {success: false, error: "Tenant not found"};

  try {
    const db = getTenantDb(tenant.id);
    await db.coupon.updateMany({
      where: {id: couponId},
      data: {isActive}
    });

    revalidatePath(`/company/${tenantSlug}/coupons`);
    return {success: true};
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : "Unknown error";
    return {success: false, error: "Failed to toggle coupon: " + message};
  }
}
