"use server";

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

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

// ─────────────────────────────────────────────────────────
// Create Vehicle
// ─────────────────────────────────────────────────────────
const createVehicleSchema = z.object({
  tenantSlug: z.string().min(1),
  branchId: z.string().min(1, "Branch is required"),
  brandId: z.string().min(1, "Brand is required"),
  modelId: z.string().min(1, "Model is required"),
  name: z.string().min(2, "Name is required"),
  year: z.coerce.number().min(1990).max(new Date().getFullYear() + 2),
  plateNumber: z.string().min(2, "Plate number is required"),
  vin: z.string().min(5, "VIN is required"),
  color: z.string().optional(),
  category: z.enum(["ECONOMY", "SEDAN", "SUV", "LUXURY", "SPORT", "VAN", "PICKUP"]),
  transmission: z.enum(["AUTOMATIC", "MANUAL"]),
  fuelType: z.enum(["PETROL", "DIESEL", "HYBRID", "ELECTRIC"]),
  seats: z.coerce.number().min(1).max(20),
  doors: z.coerce.number().optional(),
  bags: z.coerce.number().optional(),
  mileage: z.coerce.number().optional(),
  dailyRate: z.coerce.number().min(0),
  weeklyRate: z.coerce.number().optional(),
  monthlyRate: z.coerce.number().optional(),
  depositAmount: z.coerce.number().min(0),
  airConditioning: z.string().optional(),
  hasGps: z.string().optional(),
  hasBluetooth: z.string().optional(),
  insuranceIncluded: z.string().optional(),
  featured: z.string().optional(),
  isPublic: z.string().optional(),
  descriptionEn: z.string().optional(),
  descriptionAr: z.string().optional(),
  primaryImageUrl: z.string().optional()
});

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

  const raw = Object.fromEntries(formData.entries());
  const parsed = createVehicleSchema.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"};

  const slug = `${tenant.slug}-${d.name.toLowerCase().replace(/\s+/g, "-")}-${Date.now()}`;

  try {
    const db = getTenantDb(tenant.id);
    const vehicle = await db.vehicle.create({
      data: {
        tenantId: tenant.id,
        branchId: d.branchId,
        brandId: d.brandId,
        modelId: d.modelId,
        name: d.name,
        slug,
        year: d.year,
        plateNumber: d.plateNumber,
        vin: d.vin,
        color: d.color ?? null,
        category: d.category,
        transmission: d.transmission,
        fuelType: d.fuelType,
        seats: d.seats,
        doors: d.doors ?? null,
        bags: d.bags ?? null,
        mileage: d.mileage ?? null,
        dailyRate: d.dailyRate,
        weeklyRate: d.weeklyRate ?? null,
        monthlyRate: d.monthlyRate ?? null,
        depositAmount: d.depositAmount,
        airConditioning: d.airConditioning === "on" || d.airConditioning === "true",
        hasGps: d.hasGps === "on" || d.hasGps === "true",
        hasBluetooth: d.hasBluetooth === "on" || d.hasBluetooth === "true",
        insuranceIncluded: d.insuranceIncluded === "on" || d.insuranceIncluded === "true",
        featured: d.featured === "on" || d.featured === "true",
        isPublic: d.isPublic === "on" || d.isPublic === "true",
        descriptionEn: d.descriptionEn ?? null,
        descriptionAr: d.descriptionAr ?? null,
        primaryImageUrl: d.primaryImageUrl ?? null,
        status: "AVAILABLE"
      }
    });

    revalidatePath(`/company/${d.tenantSlug}/fleet`);
    redirect(`/company/${d.tenantSlug}/fleet/${vehicle.id}`);
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : "Unknown error";
    if (message.includes("NEXT_REDIRECT")) throw err;
    return {success: false, error: "Failed to create vehicle: " + message};
  }
}

// ─────────────────────────────────────────────────────────
// Update Vehicle
// ─────────────────────────────────────────────────────────
const updateVehicleSchema = z.object({
  vehicleId: z.string().min(1),
  tenantSlug: z.string().min(1),
  branchId: z.string().optional(),
  name: z.string().min(2).optional(),
  year: z.coerce.number().optional(),
  plateNumber: z.string().optional(),
  color: z.string().optional(),
  dailyRate: z.coerce.number().optional(),
  weeklyRate: z.coerce.number().optional(),
  monthlyRate: z.coerce.number().optional(),
  depositAmount: z.coerce.number().optional(),
  descriptionEn: z.string().optional(),
  descriptionAr: z.string().optional(),
  primaryImageUrl: z.string().optional(),
  airConditioning: z.string().optional(),
  hasGps: z.string().optional(),
  hasBluetooth: z.string().optional(),
  insuranceIncluded: z.string().optional(),
  featured: z.string().optional(),
  isPublic: z.string().optional(),
  seats: z.coerce.number().optional(),
  doors: z.coerce.number().optional(),
  bags: z.coerce.number().optional(),
  mileage: z.coerce.number().optional()
});

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

  const raw = Object.fromEntries(formData.entries());
  const parsed = updateVehicleSchema.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.vehicle.updateMany({
      where: {id: d.vehicleId},
      data: {
        ...(d.branchId && {branchId: d.branchId}),
        ...(d.name && {name: d.name}),
        ...(d.year && {year: d.year}),
        ...(d.plateNumber && {plateNumber: d.plateNumber}),
        ...(d.color !== undefined && {color: d.color || null}),
        ...(d.dailyRate !== undefined && {dailyRate: d.dailyRate}),
        ...(d.weeklyRate !== undefined && {weeklyRate: d.weeklyRate || null}),
        ...(d.monthlyRate !== undefined && {monthlyRate: d.monthlyRate || null}),
        ...(d.depositAmount !== undefined && {depositAmount: d.depositAmount}),
        ...(d.descriptionEn !== undefined && {descriptionEn: d.descriptionEn || null}),
        ...(d.descriptionAr !== undefined && {descriptionAr: d.descriptionAr || null}),
        ...(d.primaryImageUrl !== undefined && {primaryImageUrl: d.primaryImageUrl || null}),
        ...(d.airConditioning !== undefined && {airConditioning: d.airConditioning === "on" || d.airConditioning === "true"}),
        ...(d.hasGps !== undefined && {hasGps: d.hasGps === "on" || d.hasGps === "true"}),
        ...(d.hasBluetooth !== undefined && {hasBluetooth: d.hasBluetooth === "on" || d.hasBluetooth === "true"}),
        ...(d.insuranceIncluded !== undefined && {insuranceIncluded: d.insuranceIncluded === "on" || d.insuranceIncluded === "true"}),
        ...(d.featured !== undefined && {featured: d.featured === "on" || d.featured === "true"}),
        ...(d.isPublic !== undefined && {isPublic: d.isPublic === "on" || d.isPublic === "true"}),
        ...(d.seats && {seats: d.seats}),
        ...(d.doors !== undefined && {doors: d.doors || null}),
        ...(d.bags !== undefined && {bags: d.bags || null}),
        ...(d.mileage !== undefined && {mileage: d.mileage || null})
      }
    });

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

// ─────────────────────────────────────────────────────────
// Delete Vehicle (soft delete / archive)
// ─────────────────────────────────────────────────────────
export async function deleteVehicle(vehicleId: string, tenantSlug: string): Promise<VehicleActionResult> {
  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.vehicle.updateMany({
      where: {id: vehicleId},
      data: {status: "ARCHIVED", deletedAt: new Date(), isPublic: false}
    });

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

// ─────────────────────────────────────────────────────────
// Update Vehicle Status
// ─────────────────────────────────────────────────────────
export async function updateVehicleStatus(
  vehicleId: string,
  tenantSlug: string,
  status: "AVAILABLE" | "RESERVED" | "RENTED" | "MAINTENANCE" | "INACTIVE" | "ARCHIVED"
): Promise<VehicleActionResult> {
  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.vehicle.updateMany({
      where: {id: vehicleId},
      data: {status}
    });

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