import type { NextPage } from 'next';
import Head from 'next/head';
import { useSession } from 'next-auth/react';
import { useRouter } from 'next/router';
import Link from 'next/link';
import { useEffect, useState } from 'react';
import toast from 'react-hot-toast';

interface OrderItem {
  id: number;
  productId?: number;
  productSlug?: string;
  name: string;
  brand: string;
  quantity: number;
  unitPrice: number;
  totalPrice: number;
  image?: string;
  volume?: string;
  productType?: string;
}

interface OrderDetail {
  id: number;
  orderNumber: string;
  date: string;
  status: string;
  total: number;
  discountAmount: number;
  isGiftWrapped: boolean;
  giftWrappingPrice: number;
  items: OrderItem[];
  shipping: {
    method: string;
    price: number;
    pickupPoint?: any;
  };
  billing: {
    name: string;
    email: string;
    phone: string;
    street: string;
    city: string;
    zip: string;
    country: string;
  };
  shipping_address?: {
    name: string;
    street: string;
    city: string;
    zip: string;
    country: string;
  };
}

const OrderDetail: NextPage = () => {
  const { status } = useSession();
  const router = useRouter();
  const { id } = router.query;
  const [order, setOrder] = useState<OrderDetail | null>(null);
  const [isLoading, setIsLoading] = useState(true);

  useEffect(() => {
    if (status === 'unauthenticated') {
      router.push('/login');
    }
  }, [status, router]);

  useEffect(() => {
    const fetchOrder = async () => {
      if (!id || Array.isArray(id)) return;

      try {
        const response = await fetch(`/api/user/orders/${id}`);
        if (response.ok) {
          const data = await response.json();
          setOrder(data);
        } else if (response.status === 404) {
          toast.error('Objednávka nebyla nalezena');
          router.push('/orders');
        } else {
          console.error('Failed to fetch order');
          toast.error('Chyba při načítání objednávky');
        }
      } catch (error) {
        console.error('Error fetching order:', error);
        toast.error('Chyba při připojení');
      } finally {
        setIsLoading(false);
      }
    };

    if (status === 'authenticated' && id) {
      fetchOrder();
    }
  }, [status, id, router]);

  if (status === 'loading' || isLoading) {
    return (
      <div className="min-h-screen flex items-center justify-center pt-48 pb-8">
        <div className="text-luxury-light">Načítání...</div>
      </div>
    );
  }

  if (status === 'unauthenticated' || !order) {
    return null;
  }

  const subtotal = Number(order.total) + Number(order.discountAmount) - Number(order.shipping.price) - (order.isGiftWrapped ? Number(order.giftWrappingPrice) : 0);
  const shippingAddress = order.shipping_address || order.billing;
  const hasOnlyVouchers = order.items.every(item => item.productType === 'voucher');
  const showShipping = !hasOnlyVouchers || Number(order.shipping.price) > 0;

  return (
    <>
      <Head>
        <title>Objednávka #{order.orderNumber} | Vystříkejto.cz</title>
        <meta name="robots" content="noindex,nofollow,noarchive" />
      </Head>
      <div className="min-h-screen w-full bg-luxury-dark pt-48 pb-16">
        <div className="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8">
          {/* Header */}
          <div className="mb-12">
            <Link href="/orders">
              <button className="flex items-center gap-2 text-luxury-gold hover:text-yellow-300 font-semibold text-sm uppercase tracking-wider mb-6 transition-colors">
                <svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                  <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
                </svg>
                Zpět na objednávky
              </button>
            </Link>
            <div className="flex flex-col md:flex-row items-start md:items-center justify-between gap-4 mb-6">
              <div>
                <h1 className="text-4xl md:text-5xl font-aptos font-black text-luxury-light">
                  Objednávka #{order.orderNumber}
                </h1>
                <p className="text-luxury-light/70 mt-2">{order.date}</p>
              </div>
              <div className="text-right">
                <span className="inline-block px-4 py-2 bg-luxury-gold/10 border border-luxury-gold/30 text-luxury-gold font-semibold rounded-lg">
                  {order.status}
                </span>
              </div>
            </div>
          </div>

          {/* Main Content */}
          <div className="grid grid-cols-1 lg:grid-cols-3 gap-8 mb-12">
            {/* Items Section */}
            <div className="lg:col-span-2">
              <div className="bg-luxury-dark/40 border border-luxury-gold/20 rounded-lg p-8 mb-8">
                <h2 className="text-lg font-semibold text-luxury-light uppercase tracking-wider mb-6 flex items-center gap-3">
                  <svg className="w-5 h-5 text-luxury-gold" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                    <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z" />
                  </svg>
                  Obsah objednávky
                </h2>

                <div className="space-y-6">
                  {order.items.map((item) => (
                    <div key={item.id} className="flex gap-4 pb-6 border-b border-luxury-gold/10 last:border-b-0 last:pb-0">
                      {/* Product Image and Info - Clickable */}
                      <div
                        className={`flex gap-4 flex-1 ${item.productSlug ? 'cursor-pointer group' : ''}`}
                        onClick={() => {
                          if (item.productSlug) {
                            router.push(`/product/${item.productSlug}`);
                          }
                        }}
                      >
                        {/* Product Image */}
                        {item.image && (
                          <div className="flex-shrink-0 w-32 h-46 bg-luxury-dark/50 rounded-lg overflow-hidden flex items-center justify-center border border-luxury-gold/20 group-hover:border-luxury-gold/40 transition-all duration-300">
                            <img
                              src={item.image}
                              alt={item.name}
                              className="w-full h-full object-contain"
                              onError={(e) => {
                                (e.target as HTMLImageElement).src =
                                  'data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22100%25%22 height=%22100%25%22%3E%3Crect fill=%220a0a0a%22 width=%22100%25%22 height=%22100%25%22/%3E%3Crect fill=%22%23f3bd3533%22 x=%2225%25%22 y=%2225%25%22 width=%2250%25%22 height=%2250%25%22/%3E%3Ctext x=%2250%25%22 y=%2250%25%22 text-anchor=%22middle%22 dy=%22.3em%22 fill=%22%23f3bd35%22 font-size=%2212%22 font-family=%22serif%22%3E✓%3C/text%3E%3C/svg%3E';
                              }}
                            />
                          </div>
                        )}

                        {/* Product Info */}
                        <div className="flex-1 min-w-0">
                          <p className="text-luxury-light/60 text-sm font-semibold uppercase tracking-widest mb-2 group-hover:text-luxury-gold transition-colors duration-300">
                            {item.brand}
                          </p>
                          <h3 className="text-xl md:text-2xl font-aptos font-black text-luxury-light mb-2 line-clamp-2 group-hover:text-luxury-gold transition-colors duration-300">
                            {item.name}
                          </h3>
                          {item.volume && item.productType !== 'voucher' && (
                            <p className="text-luxury-light/70 text-sm mb-3">
                              {item.volume} ml
                            </p>
                          )}
                          <div className="flex items-baseline gap-2">
                            <p className="text-luxury-light/70 text-sm font-medium">
                              {item.quantity}× {Number(item.unitPrice).toFixed(2)} Kč
                            </p>
                            <span className="text-luxury-light/40">=</span>
                            <p className="text-luxury-light font-aptos font-black">
                              {Number(item.totalPrice).toFixed(2)} Kč
                            </p>
                          </div>
                        </div>
                      </div>
                    </div>
                  ))}
                </div>
              </div>

              {/* Gift Wrapping */}
              {order.isGiftWrapped && (
                <div className="bg-luxury-dark/40 border border-luxury-gold/20 rounded-lg p-8 mb-8">
                  <h2 className="text-lg font-semibold text-luxury-light uppercase tracking-wider mb-6 flex items-center gap-3">
                    <svg className="w-5 h-5 text-luxury-gold" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                      <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 8v-1m0 0L9.172 3.172a2 2 0 00-2.828 0l-2.828 2.828A2 2 0 003 9.172V21a2 2 0 002 2h14a2 2 0 002-2V9.172a2 2 0 00-.586-1.414l-2.828-2.828a2 2 0 00-2.828 0L12 7m0 0l3.172-3.172a2 2 0 012.828 0l2.828 2.828A2 2 0 0121 9.172V21a2 2 0 01-2 2H5a2 2 0 01-2-2V9.172a2 2 0 01.586-1.414z" />
                    </svg>
                    Dárkové balení
                  </h2>
                  <p className="text-luxury-light/70">Objednávka byla zabalena v dárkovém balení.</p>
                </div>
              )}

              {/* Shipping Info */}
              {showShipping && (
              <div className="bg-luxury-dark/40 border border-luxury-gold/20 rounded-lg p-8">
                <h2 className="text-lg font-semibold text-luxury-light uppercase tracking-wider mb-6 flex items-center gap-3">
                  <svg className="w-5 h-5 text-luxury-gold" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                    <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9-4v4m0 0v4" />
                  </svg>
                  Doručení
                </h2>

                <div>
                  {/* Shipping Method */}
                  <div>

                    {/* Pickup Point Details */}
                    {order.shipping.pickupPoint?.pickupPoint && (
                      <div className="bg-luxury-dark/40 border border-luxury-gold/20 rounded-lg p-4 mt-4">
                    <p className="text-luxury-light font-semibold mb-2">{order.shipping.method}</p>
                        <p className="text-luxury-light font-semibold mb-1">
                          {order.shipping.pickupPoint.pickupPoint.name}
                        </p>
                        <p className="text-luxury-light/70 text-sm mb-1">
                          {order.shipping.pickupPoint.pickupPoint.street}
                        </p>
                        <p className="text-luxury-light/70 text-sm">
                          {order.shipping.pickupPoint.pickupPoint.zip} {order.shipping.pickupPoint.pickupPoint.city}
                        </p>
                      </div>
                    )}

                    {/* Shipping Address */}
                    {!order.shipping.pickupPoint?.pickupPoint && (
                      <div className="bg-luxury-dark/40 border border-luxury-gold/20 rounded-lg p-4 mt-4">
                        <p className="text-luxury-light font-semibold mb-3">{order.shipping.method}</p>
                        <div className="space-y-2 text-sm">
                          <p className="text-luxury-light font-semibold">{shippingAddress.name}</p>
                          <p className="text-luxury-light/70">{shippingAddress.street}</p>
                          <p className="text-luxury-light/70">{shippingAddress.zip} {shippingAddress.city}</p>
                        </div>
                      </div>
                    )}
                  </div>
                </div>
              </div>
              )}
            </div>

            {/* Sidebar */}
            <div className="lg:col-span-1">
              {/* Price Summary */}
              <div className="bg-luxury-dark/40 border border-luxury-gold/20 rounded-lg p-8 mb-8">
                <h2 className="text-lg font-semibold text-luxury-light uppercase tracking-wider mb-6">
                  Souhrn
                </h2>

                <div className="space-y-3 mb-6 pb-6 border-b border-luxury-gold/20">
                  <div className="flex justify-between">
                    <p className="text-luxury-light/70">Produkty</p>
                    <p className="text-luxury-light font-semibold">{Number(subtotal).toFixed(2)} Kč</p>
                  </div>
                  {showShipping && (
                  <div className="flex justify-between">
                    <p className="text-luxury-light/70">Doprava</p>
                    <p className="text-luxury-light font-semibold">{Number(order.shipping.price) === 0 ? 'Zdarma' : Number(order.shipping.price).toFixed(2) + ' Kč'}</p>
                  </div>
                  )}
                  {order.isGiftWrapped && (
                    <div className="flex justify-between">
                      <p className="text-luxury-light/70">Dárkové balení</p>
                      <p className="text-luxury-light font-semibold">{Number(order.giftWrappingPrice).toFixed(2)} Kč</p>
                    </div>
                  )}
                  {order.discountAmount > 0 && (
                    <div className="flex justify-between text-luxury-gold">
                      <p>Sleva</p>
                      <p className="font-semibold">-{Number(order.discountAmount).toFixed(2)} Kč</p>
                    </div>
                  )}
                </div>

                <div className="flex justify-between items-center mb-8">
                  <p className="text-luxury-light/50 text-xs font-semibold uppercase tracking-wider">
                    Celkem
                  </p>
                  <p className="text-3xl font-aptos font-black text-luxury-gold">
                    {Number(order.total).toFixed(2)} Kč
                  </p>
                </div>
              </div>

              {/* Billing Info */}
              <div className="bg-luxury-dark/40 border border-luxury-gold/20 rounded-lg p-8">
                <h2 className="text-lg font-semibold text-luxury-light uppercase tracking-wider mb-6">
                  Fakturační údaje
                </h2>

                <div className="space-y-3 text-sm">
                  <div>
                    <p className="text-luxury-light/50 font-semibold mb-1">Jméno</p>
                    <p className="text-luxury-light">{order.billing.name}</p>
                  </div>
                  <div>
                    <p className="text-luxury-light/50 font-semibold mb-1">Email</p>
                    <p className="text-luxury-light break-all">{order.billing.email}</p>
                  </div>
                  <div>
                    <p className="text-luxury-light/50 font-semibold mb-1">Telefon</p>
                    <p className="text-luxury-light">{order.billing.phone}</p>
                  </div>
                  <div className="pt-4 border-t border-luxury-gold/10">
                    <p className="text-luxury-light/50 font-semibold mb-1">Adresa</p>
                    <p className="text-luxury-light">{order.billing.street}</p>
                    <p className="text-luxury-light">{order.billing.zip} {order.billing.city}</p>
                  </div>
                </div>
              </div>
            </div>
          </div>

          {/* Action Buttons */}
          <div className="flex flex-col sm:flex-row gap-4">
            <button
              onClick={async () => {
                try {
                  const response = await fetch(`/api/user/orders/${order.id}/invoice`);

                  if (!response.ok) {
                    toast.error(`Chyba při stažení faktury: ${response.status}`);
                    return;
                  }

                  const blob = await response.blob();

                  const link = document.createElement('a');
                  link.href = URL.createObjectURL(blob);
                  link.download = `faktura-${order.orderNumber}.pdf`;
                  document.body.appendChild(link);
                  link.click();
                  document.body.removeChild(link);
                  URL.revokeObjectURL(link.href);

                  toast.success('Faktura byla stažena');
                } catch (error) {
                  toast.error('Chyba při stažení faktury');
                }
              }}
              className="flex-1 px-8 py-4 border-2 border-luxury-gold hover:bg-luxury-gold/10 text-luxury-gold font-aptos font-bold rounded-lg transition-all duration-300 text-base uppercase tracking-widest flex items-center justify-center gap-2"
            >
              <svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
              </svg>
              Stáhnout fakturu
            </button>
            <Link href="/orders" className="flex-1">
              <button className="w-full px-8 py-4 bg-luxury-gold hover:bg-yellow-300 text-luxury-dark font-aptos font-bold rounded-lg transition-all duration-300 text-base uppercase tracking-widest">
                Zpět na objednávky
              </button>
            </Link>
          </div>
        </div>
      </div>
    </>
  );
};

export default OrderDetail;
