'use server';
import { revalidatePath } from 'next/cache';
import { redirect } from 'next/navigation';
import { z } from 'zod';
import { prisma } from '@/lib/db';
import { requireUser } from '@/lib/auth';
import { STATUS_IDS } from '@/lib/crm';

const Base = z.object({ name: z.string().min(1).max(80), phone: z.string().max(30).optional(), email: z.string().email().max(120).optional().or(z.literal('')), status: z.enum(STATUS_IDS as [string, ...string[]]).optional(), note: z.string().max(4000).optional() });

export async function createContact(fd: FormData) {
  const u = await requireUser();
  const d = Base.safeParse(Object.fromEntries(fd)); if (!d.success) return;
  const c = await prisma.contact.create({ data: { userId: u.id, name: d.data.name, phone: d.data.phone || null, email: d.data.email || null, status: d.data.status || 'yeni', note: d.data.note || null } });
  redirect(`/panel/musteriler/${c.id}`);
}

export async function updateContact(id: string, fd: FormData) {
  const u = await requireUser();
  const d = Base.safeParse(Object.fromEntries(fd)); if (!d.success) return;
  await prisma.contact.updateMany({ where: { id, userId: u.id }, data: { name: d.data.name, phone: d.data.phone || null, email: d.data.email || null, status: d.data.status, note: d.data.note || null } });
  revalidatePath(`/panel/musteriler/${id}`); revalidatePath('/panel/musteriler');
}

export async function setStatus(id: string, status: string) {
  const u = await requireUser();
  if (!STATUS_IDS.includes(status)) return;
  await prisma.contact.updateMany({ where: { id, userId: u.id }, data: { status } });
  revalidatePath(`/panel/musteriler/${id}`); revalidatePath('/panel/musteriler');
}

export async function deleteContact(id: string) {
  const u = await requireUser();
  await prisma.contact.deleteMany({ where: { id, userId: u.id } });
  redirect('/panel/musteriler');
}

/** Sipariş detayından: ilanı bir müşteriye bağla / bağı kaldır. */
export async function linkOrder(orderId: string, contactId: string | null) {
  const u = await requireUser();
  const o = await prisma.order.findFirst({ where: { id: orderId, userId: u.id }, select: { id: true } }); if (!o) return;
  if (contactId) { const c = await prisma.contact.findFirst({ where: { id: contactId, userId: u.id }, select: { id: true } }); if (!c) return; }
  await prisma.order.update({ where: { id: orderId }, data: { contactId } });
  revalidatePath(`/panel/siparisler/${orderId}`);
}
