"use server";

import { redirect } from "next/navigation";
import { z } from "zod";
import { db } from "@/lib/db";
import { requireOrganizer } from "@/lib/auth";
import { audit } from "@/lib/audit";
import { slugify } from "@/lib/utils";

const schema = z.object({
  name: z.string().min(3, "Conference name is too short"),
  type: z.enum(["PHYSICAL", "VIRTUAL", "HYBRID"]),
  category: z.string(),
  startAt: z.string().min(1, "Start date required"),
  endAt: z.string().min(1, "End date required"),
  tagline: z.string().optional(),
  description: z.string().optional(),
  orgChoice: z.string(),
  newOrgName: z.string().optional(),
  venueName: z.string().optional(),
  city: z.string().optional(),
  capacity: z.string().optional(),
  primaryColor: z.string().default("#4f46e5"),
});

export async function createConferenceAction(formData: FormData) {
  const user = await requireOrganizer();
  const parsed = schema.safeParse(Object.fromEntries(formData));
  if (!parsed.success) {
    redirect(`/dashboard/conferences/new?error=${encodeURIComponent(parsed.error.issues[0].message)}`);
  }
  const d = parsed.data;
  const startAt = new Date(d.startAt);
  const endAt = new Date(d.endAt);
  if (isNaN(startAt.getTime()) || isNaN(endAt.getTime()) || endAt < startAt) {
    redirect(`/dashboard/conferences/new?error=${encodeURIComponent("End date must be after the start date.")}`);
  }

  // Organization: existing (must be a member) or create new
  let orgId = d.orgChoice;
  if (orgId === "__new") {
    const orgName = d.newOrgName?.trim() || user.organization || `${user.name}'s Organization`;
    let orgSlug = slugify(orgName);
    if (await db.organization.findUnique({ where: { slug: orgSlug } })) orgSlug = `${orgSlug}-${Date.now().toString(36)}`;
    const org = await db.organization.create({
      data: { name: orgName, slug: orgSlug, members: { create: { userId: user.id, role: "OWNER" } } },
    });
    orgId = org.id;
  } else {
    const member = await db.orgMember.findFirst({ where: { orgId, userId: user.id } });
    if (!member && user.platformRole !== "SUPER_ADMIN") {
      redirect(`/dashboard/conferences/new?error=${encodeURIComponent("You are not a member of that organization.")}`);
    }
  }

  let slug = slugify(d.name);
  if (await db.conference.findUnique({ where: { slug } })) slug = `${slug}-${Date.now().toString(36)}`;

  const conf = await db.conference.create({
    data: {
      orgId,
      name: d.name,
      slug,
      tagline: d.tagline,
      description: d.description,
      category: d.category,
      type: d.type,
      startAt,
      endAt,
      venueName: d.venueName,
      city: d.city,
      capacity: d.capacity ? parseInt(d.capacity, 10) || null : null,
      primaryColor: d.primaryColor,
      contactEmail: user.email,
      regOpensAt: new Date(),
      regClosesAt: endAt,
      members: { create: { userId: user.id, role: "ORGANIZER" } },
      ticketTypes: {
        create: { name: "General Pass", description: "Standard conference access", price: 0 },
      },
      tracks: { create: { name: "Main Track", color: d.primaryColor } },
      rooms: d.type !== "VIRTUAL" ? { create: { name: "Main Hall" } } : undefined,
    },
  });
  await audit({ userId: user.id, conferenceId: conf.id, action: "conference.create", entity: "Conference", entityId: conf.id });
  redirect(`/dashboard/c/${conf.id}`);
}
