"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 BranchActionResult = {success: boolean; error?: string; id?: string};

const branchSchema = z.object({
  tenantSlug: z.string().min(1),
  name: z.string().min(2, "Name is required"),
  code: z.string().optional(),
  email: z.string().email().optional().or(z.literal("")),
  phone: z.string().optional(),
  city: z.string().optional(),
  country: z.string().optional(),
  addressLine1: z.string().optional(),
  postalCode: z.string().optional()
});

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

  const raw = Object.fromEntries(formData.entries());
  const parsed = branchSchema.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);
    const branch = await db.branch.create({
      data: {
        tenantId: tenant.id,
        name: d.name,
        code: d.code ?? null,
        email: d.email || null,
        phone: d.phone ?? null,
        city: d.city ?? null,
        country: d.country ?? null,
        addressLine1: d.addressLine1 ?? null,
        postalCode: d.postalCode ?? null,
        isActive: true
      }
    });

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

// ─────────────────────────────────────────────────────────
// Update Branch
// ─────────────────────────────────────────────────────────
const updateBranchSchema = branchSchema.extend({
  branchId: z.string().min(1)
});

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

  const raw = Object.fromEntries(formData.entries());
  const parsed = updateBranchSchema.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.branch.updateMany({
      where: {id: d.branchId},
      data: {
        name: d.name,
        code: d.code ?? null,
        email: d.email || null,
        phone: d.phone ?? null,
        city: d.city ?? null,
        country: d.country ?? null,
        addressLine1: d.addressLine1 ?? null,
        postalCode: d.postalCode ?? null
      }
    });

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

// ─────────────────────────────────────────────────────────
// Toggle Branch Active
// ─────────────────────────────────────────────────────────
export async function toggleBranchActive(
  branchId: string,
  tenantSlug: string,
  isActive: boolean
): Promise<BranchActionResult> {
  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.branch.updateMany({
      where: {id: branchId},
      data: {isActive}
    });

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