import { redirect, notFound } from "next/navigation";
import Link from "next/link";
import { isAdminSession, hasPermission, getAllPermissions } from "@/lib/adminAuth";
import { connectDB } from "@/lib/db";
import { Client } from "@/models/Client";
import { Order } from "@/models/Order";
import { PriceProposal } from "@/models/PriceProposal";
import { ClientPhotoFolder } from "@/models/ClientPhotoFolder";
import { Invoice } from "@/models/Invoice";
import { AdminNavLinks } from "@/components/admin/AdminNavLinks";
import { AdminPageHeader } from "@/components/admin/AdminPageHeader";
import { StatCard } from "@/components/admin/StatCard";
import { AdminEmptyState } from "@/components/admin/AdminEmptyState";
import { PromoteStaffButton } from "@/components/admin/PromoteStaffButton";
import { ClientAccountPanel } from "@/components/admin/ClientAccountPanel";
import { ClientTagsPanel } from "@/components/admin/ClientTagsPanel";
import { AdminPhotoPanel } from "@/components/admin/AdminPhotoPanel";
import { DeleteClientPanel } from "@/components/admin/DeleteClientPanel";
import { ORDER_TAG_LABELS, ORDER_TAG_COLORS, formatEUR, formatAddress, type OrderTag, formatDateDE } from "@/lib/orderConstants";
import { getPayableAmount, getTotalOrderDiscount } from "@/lib/discounts";

export const dynamic = "force-dynamic";

export default async function AdminClientDetailPage({ params }: { params: Promise<{ clientId: string }> }) {
  if (!(await isAdminSession())) redirect("/de/login?next=%2Fde%2Fadmin%2Fclients");

  if (!(await hasPermission("clients_view"))) redirect("/de/account");

  const permissions = await getAllPermissions();
  const canManageAccount = permissions.client_accounts;
  const { clientId } = await params;

  await connectDB();
  const client = await Client.findById(clientId).lean();
  if (!client) notFound();

  const orders = await Order.find({ clientId }).sort({ createdAt: -1 }).lean();
  const photoFolders = await ClientPhotoFolder.find({ clientId }).sort({ sortOrder: 1 }).lean();
  const hasInvoices = (await Invoice.exists({ clientId })) !== null;
  const acceptedProposals = await PriceProposal.find({
    orderId: { $in: orders.map((o) => o._id) },
    status: "accepted",
  }).lean();
  const ordersById = new Map(orders.map((o) => [String(o._id), o]));
  const totalRevenue = acceptedProposals.reduce((sum, p) => {
    const o = ordersById.get(String(p.orderId));
    return sum + getPayableAmount(p.amount, o ? getTotalOrderDiscount(o) : 0);
  }, 0);
  const activeOrders = orders.filter((o) => !o.archived && !o.rejected);
  const archivedOrders = orders.filter((o) => o.archived);

  return (
    <main className="px-6 pt-4 pb-24 max-w-5xl mx-auto">
      <AdminNavLinks permissions={permissions} />
      <Link href="/de/admin/clients" className="text-xs text-[var(--rk-ink-muted)] hover:text-[var(--rk-ink)] transition-colors">
        ← Alle Kunden
      </Link>

      <div className="mt-4 flex items-center gap-4 mb-8">
        {client.avatarPath ? (
          // eslint-disable-next-line @next/next/no-img-element
          <img
            src={`/api/avatars/${client._id}/${client.avatarPath}`}
            alt=""
            className="w-16 h-16 rounded-full object-cover border border-white/15 shrink-0"
          />
        ) : (
          <div className="w-16 h-16 rounded-full border border-white/15 bg-white/5 flex items-center justify-center text-xl text-[var(--rk-ink-muted)] shrink-0">
            {client.firstName?.[0]?.toUpperCase() ?? client.name?.[0]?.toUpperCase() ?? "?"}
          </div>
        )}
        <div>
          <h1 className="text-xl font-medium text-[var(--rk-ink)] flex items-center gap-2 flex-wrap">
            {client.name}
            {client.nickname && <span className="text-[var(--rk-ink-muted)] font-normal">· „{client.nickname}"</span>}
            {orders.length > 1 && (
              <span className="text-[0.65rem] uppercase tracking-[0.08em] border border-emerald-400/40 text-emerald-400 rounded-full px-2 py-0.5">
                Stammkunde
              </span>
            )}
          </h1>
          <p className="text-sm text-[var(--rk-ink-muted)] mt-0.5">{client.email}</p>
          {client.phone && <p className="text-sm text-[var(--rk-ink-muted)] mt-0.5">{client.phone}</p>}
          {client.company && <p className="text-sm text-[var(--rk-ink-muted)] mt-0.5">{client.company}</p>}
          {!client.verified && <p className="text-xs text-amber-400 mt-1">E-Mail nicht verifiziert</p>}
          <div className="mt-2">
            <PromoteStaffButton clientId={String(client._id)} isStaff={client.role === "staff"} />
          </div>
        </div>
      </div>

      <div className="grid grid-cols-2 sm:grid-cols-3 gap-3 mb-8">
        <StatCard label="Aufträge" value={orders.length} />
        <StatCard label="Aktiv" value={activeOrders.length} accent="emerald" />
        <StatCard label="Umsatz" value={formatEUR(totalRevenue)} accent={totalRevenue ? "emerald" : "muted"} />
      </div>

      <ClientTagsPanel clientId={String(client._id)} tags={client.tags || []} />

      {canManageAccount && (
        <ClientAccountPanel
          clientId={String(client._id)}
          role={client.role}
          firstName={client.firstName || ""}
          lastName={client.lastName || ""}
          salutation={client.salutation || ""}
          pronouns={client.pronouns || ""}
          nickname={client.nickname || ""}
          email={client.email}
          phone={client.phone || ""}
          billingStreet={client.billingStreet || ""}
          billingPostCode={client.billingPostCode || ""}
          billingCity={client.billingCity || ""}
          billingCountryCode={client.billingCountryCode || "DE"}
          company={client.company}
        />
      )}

      {(client.billingStreet || client.address) && (
        <div className="bg-[var(--rk-surface)] border border-white/10 rounded-2xl p-5 mb-8">
          <p className="text-xs uppercase tracking-[0.1em] text-[var(--rk-ink-muted)] mb-1">Anschrift</p>
          <p className="text-sm whitespace-pre-line">
            {client.billingStreet
              ? formatAddress({
                  street: client.billingStreet,
                  postCode: client.billingPostCode,
                  city: client.billingCity,
                  countryCode: client.billingCountryCode,
                })
              : client.address}
          </p>
        </div>
      )}

      <div className="bg-[var(--rk-surface)] border border-white/10 rounded-2xl p-5 pt-2 mb-8">
        <AdminPhotoPanel
          clientId={String(client._id)}
          orders={orders.map((o) => ({ id: String(o._id), label: o.characterOrConcept }))}
          folders={photoFolders.map((f) => ({
            id: String(f._id),
            label: f.label,
            nextcloudPath: f.nextcloudPath,
            assignedAt: new Date(f.assignedAt).toISOString(),
            released: Boolean(f.released),
            orderId: f.orderId ? String(f.orderId) : null,
          }))}
        />
      </div>

      <div className="flex items-center justify-between mb-3">
        <h2 className="text-sm font-medium text-[var(--rk-ink)]">
          Aufträge{archivedOrders.length > 0 ? ` (${archivedOrders.length} archiviert)` : ""}
        </h2>
        {permissions.orders_create && (
          <a
            href={`/de/admin/orders/new?clientId=${client._id}`}
            className="text-xs border border-white/30 rounded-lg px-3 py-1.5 hover:border-white transition-colors"
          >
            + Auftrag für diesen Kunden
          </a>
        )}
      </div>
      {orders.length === 0 ? (
        <AdminEmptyState message="Noch keine Aufträge." />
      ) : (
        <div className="flex flex-col gap-3">
          {orders.map((order) => (
            <Link
              key={String(order._id)}
              href={`/de/admin/orders/${order._id}`}
              className={`flex items-center justify-between gap-3 bg-[var(--rk-surface)] border border-white/10 rounded-2xl p-5 hover:border-white/25 transition-colors ${
                order.archived ? "opacity-50" : ""
              }`}
              style={{ borderLeft: `3px solid ${ORDER_TAG_COLORS[order.tag as OrderTag]}` }}
            >
              <div className="min-w-0">
                <p className="text-sm font-medium text-[var(--rk-ink)] truncate">{order.characterOrConcept}</p>
                <p className="text-xs text-[var(--rk-ink-muted)] mt-0.5">
                  {formatDateDE(new Date(order.createdAt))}
                  {order.archived ? " · Archiviert" : ""}
                </p>
              </div>
              <span
                className="text-[0.65rem] uppercase tracking-[0.1em] border rounded-full px-2.5 py-1 shrink-0"
                style={{ borderColor: `${ORDER_TAG_COLORS[order.tag as OrderTag]}66`, color: ORDER_TAG_COLORS[order.tag as OrderTag] }}
              >
                {ORDER_TAG_LABELS[order.tag as OrderTag]}
              </span>
            </Link>
          ))}
        </div>
      )}

      {canManageAccount && client.role === "client" && (
        <div className="mt-8">
          <DeleteClientPanel
            clientId={String(client._id)}
            clientName={client.name}
            hasInvoices={hasInvoices}
            deletionRequestedAt={client.deletionRequestedAt ? new Date(client.deletionRequestedAt).toISOString() : null}
          />
        </div>
      )}
    </main>
  );
}
