"use server";

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

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

// ─────────────────────────────────────────────────────────
// Update General Settings (Tenant)
// ─────────────────────────────────────────────────────────
const generalSettingsSchema = z.object({
  tenantSlug: z.string().min(1),
  name: z.string().min(2, "Company name is required"),
  email: z.string().email("Valid email is required"),
  phone: z.string().optional(),
  website: z.string().optional(),
  city: z.string().optional(),
  country: z.string().optional(),
  currency: z.enum(["USD", "EUR", "SAR", "AED", "TND", "MAD", "EGP"]),
  addressLine1: z.string().optional(),
  timezone: z.string().optional()
});

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

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

  const d = parsed.data;

  try {
    await prisma.tenant.update({
      where: {slug: d.tenantSlug},
      data: {
        name: d.name,
        email: d.email,
        phone: d.phone ?? null,
        website: d.website ?? null,
        city: d.city ?? null,
        country: d.country ?? null,
        currency: d.currency,
        addressLine1: d.addressLine1 ?? null,
        timezone: d.timezone ?? null
      }
    });

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

// ─────────────────────────────────────────────────────────
// Update Booking Settings (TenantSetting)
// ─────────────────────────────────────────────────────────
const bookingSettingsSchema = z.object({
  tenantSlug: z.string().min(1),
  minimumRentalHours: z.coerce.number().min(1).default(24),
  maximumRentalDays: z.coerce.number().min(1).default(30),
  defaultDepositAmount: z.coerce.number().min(0).default(0),
  cancellationWindowHours: z.coerce.number().min(0).default(24),
  lateReturnFeePerHour: z.coerce.number().min(0).default(0),
  bookingRequiresApproval: z.string().optional(),
  allowInstantBooking: z.string().optional()
});

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

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

  const d = parsed.data;

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

    await prisma.tenantSetting.upsert({
      where: {tenantId: tenant.id},
      update: {
        minimumRentalHours: d.minimumRentalHours,
        maximumRentalDays: d.maximumRentalDays,
        defaultDepositAmount: d.defaultDepositAmount,
        cancellationWindowHours: d.cancellationWindowHours,
        lateReturnFeePerHour: d.lateReturnFeePerHour,
        bookingRequiresApproval: d.bookingRequiresApproval === "on" || d.bookingRequiresApproval === "true",
        allowInstantBooking: d.allowInstantBooking === "on" || d.allowInstantBooking === "true"
      },
      create: {
        tenantId: tenant.id,
        minimumRentalHours: d.minimumRentalHours,
        maximumRentalDays: d.maximumRentalDays,
        defaultDepositAmount: d.defaultDepositAmount,
        cancellationWindowHours: d.cancellationWindowHours,
        lateReturnFeePerHour: d.lateReturnFeePerHour,
        bookingRequiresApproval: d.bookingRequiresApproval === "on" || d.bookingRequiresApproval === "true",
        allowInstantBooking: d.allowInstantBooking === "on" || d.allowInstantBooking === "true"
      }
    });

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