import type { GetServerSideProps, NextPage } from 'next';
import Head from 'next/head';
import { useEffect, useState } from 'react';
import toast from 'react-hot-toast';
import Link from 'next/link';
import { useCart } from '../context/CartContext';
import Breadcrumbs, { breadcrumbsJsonLd } from '../components/Breadcrumbs';
import ProductImage from '../components/ProductImage';
import { fetchFromApi } from '../lib/serverFetch';

interface VoucherVariant {
  id: number;
  name: string;
  volume: string;
  currentPrice: number;
}

interface Voucher {
  id: number;
  name: string;
  slug: string;
  description: string;
  discount: number;
  primaryImage: string;
  variants: VoucherVariant[];
}

interface DarovePoukazyProps {
  initialVouchers: Voucher[];
}

const formatPrice = (price: number) =>
  new Intl.NumberFormat('cs-CZ', {
    style: 'currency',
    currency: 'CZK',
    minimumFractionDigits: 0,
    maximumFractionDigits: 0,
  }).format(Number(price));

const DarovePoukazy: NextPage<DarovePoukazyProps> = ({ initialVouchers }) => {
  const { addItem } = useCart();
  const [isClient, setIsClient] = useState(false);
  const [vouchers, setVouchers] = useState<Voucher[]>(initialVouchers);
  const [isLoading, setIsLoading] = useState(initialVouchers.length === 0);
  const [selectedVoucher, setSelectedVoucher] = useState<Voucher | null>(initialVouchers[0] || null);
  const [selectedVariant, setSelectedVariant] = useState<VoucherVariant | null>(
    initialVouchers[0]?.variants[0] || null,
  );
  const [addedToCart, setAddedToCart] = useState(false);

  useEffect(() => {
    setIsClient(true);
  }, []);

  useEffect(() => {
    if (initialVouchers.length > 0) {
      setVouchers(initialVouchers);
      setIsLoading(false);
      return;
    }
    fetchVouchers();
  }, [initialVouchers]);

  useEffect(() => {
    if (vouchers.length > 0 && !selectedVoucher) {
      setSelectedVoucher(vouchers[0]);
      setSelectedVariant(vouchers[0].variants[0] || null);
    }
  }, [selectedVoucher, vouchers]);

  const fetchVouchers = async () => {
    try {
      setIsLoading(true);
      const response = await fetch('/api/vouchers');
      if (response.ok) {
        const data = await response.json();
        setVouchers(data);
      } else {
        toast.error('Chyba při načítání poukazů');
      }
    } catch (error) {
      toast.error('Chyba při načítání poukazů');
    } finally {
      setIsLoading(false);
    }
  };

  const handleAddToCart = async () => {
    if (!isClient) {
      toast.error('Prosím počkejte, stránka se načítá');
      return;
    }

    if (!selectedVariant || !selectedVoucher) {
      toast.error('Prosím vyberte poukaz a částku');
      return;
    }

    try {
      await addItem({
        variantId: selectedVariant.id,
        productId: selectedVoucher.id,
        productName: selectedVoucher.name,
        productSlug: selectedVoucher.slug,
        brandName: 'Poukaz',
        volume: `${selectedVariant.currentPrice.toFixed(0)} Kč`,
        price: selectedVariant.currentPrice,
        image: selectedVoucher.primaryImage,
      });
      setAddedToCart(true);
      window.setTimeout(() => setAddedToCart(false), 2000);
    } catch (error) {
      const errorMessage = error instanceof Error ? error.message : 'Chyba při přidávání poukazů do košíku';
      toast.error(errorMessage);
    }
  };

  return (
    <>
      <Head>
        <title>Dárkové poukazy na parfémy | Vystříkejto.cz</title>
        <meta name="description" content="Darujte celé parfémy. Luxusní dárkové poukazy na originální vůně z Vystříkejto.cz." />
        <link rel="canonical" href="https://vystrikejto.cz/darkove-poukazy" />
        <script
          type="application/ld+json"
          dangerouslySetInnerHTML={{
            __html: JSON.stringify(breadcrumbsJsonLd([
              { name: 'Domů', href: '/' },
              { name: 'Dárkové poukazy' },
            ])),
          }}
        />
      </Head>

      <section className="w-full bg-luxury-dark px-4 pb-20 pt-28 sm:px-6 lg:px-[5vw] lg:pb-24 lg:pt-36">
        <div className="mx-auto max-w-[1600px]">
          <Breadcrumbs items={[{ name: 'Domů', href: '/' }, { name: 'Dárkové poukazy' }]} />
          {isLoading ? (
            <div className="flex min-h-[55vh] items-center justify-center">
              <div className="flex items-center gap-3 text-sm font-semibold uppercase tracking-[0.12em] text-luxury-light/60">
                <span className="h-2 w-2 animate-pulse rounded-full bg-luxury-gold" />
                Načítání poukazů
              </div>
            </div>
          ) : vouchers.length === 0 ? (
            <div className="flex min-h-[55vh] flex-col items-center justify-center text-center">
              <p className="mb-3 text-xs font-bold uppercase tracking-[0.18em] text-luxury-gold">Dárkové poukazy</p>
              <h2 className="text-3xl font-black text-luxury-light md:text-5xl">
                Momentálně nejsou poukazy dostupné
              </h2>
              <Link
                href="/"
                className="mt-8 bg-luxury-gold px-8 py-3 font-bold uppercase tracking-wider text-luxury-dark transition-colors hover:bg-yellow-300"
              >
                Zpět na hlavní stránku
              </Link>
            </div>
          ) : selectedVoucher ? (
            <>
              <header className="mb-8 max-w-4xl sm:mb-10 lg:mb-12">
                <p className="mb-2 text-xs font-bold uppercase tracking-[0.18em] text-luxury-gold">Dárek bez špatné volby</p>
                <h1 className="text-4xl font-black tracking-[-0.035em] text-luxury-light sm:text-5xl lg:text-6xl">
                  Darujte vůni. Výběr nechte na nich.
                </h1>
                <p className="mt-4 max-w-2xl text-sm leading-relaxed text-luxury-light/65 sm:text-base">
                  Elektronický poukaz na libovolný nákup na Vystříkejto.cz. Po zaplacení ho pošleme e-mailem jako PDF připravené k předání nebo vytištění.
                </p>
              </header>

              {vouchers.length > 1 && (
                <div className="mb-8 flex flex-wrap gap-2 border-y border-luxury-light/15 py-4">
                  {vouchers.map((voucher) => (
                    <button
                      type="button"
                      key={voucher.id}
                      onClick={() => {
                        setSelectedVoucher(voucher);
                        setSelectedVariant(voucher.variants[0] || null);
                        setAddedToCart(false);
                      }}
                      className={`px-4 py-2 text-xs font-bold uppercase tracking-[0.1em] transition-colors ${
                        selectedVoucher.id === voucher.id
                          ? 'bg-luxury-gold text-luxury-dark'
                          : 'border border-luxury-gold/30 text-luxury-light hover:border-luxury-gold'
                      }`}
                    >
                      {voucher.name}
                    </button>
                  ))}
                </div>
              )}

              <div className="grid items-start gap-10 lg:grid-cols-[0.88fr_1.12fr] lg:gap-[clamp(48px,6vw,104px)]">
                <div className="lg:sticky lg:top-32">
                  <div className="relative mx-auto w-full max-w-[420px] lg:max-w-[520px]">
                    <div aria-hidden="true" className="absolute -inset-4 bg-luxury-gold/[0.035] blur-3xl" />
                    <div className="relative aspect-[2/3] overflow-hidden bg-[#0a0a0a]">
                      <ProductImage
                        src={selectedVoucher.primaryImage}
                        alt="Dárkový poukaz Vystříkejto.cz"
                        priority
                        className="h-full w-full object-cover"
                      />
                      {selectedVariant && (
                        <div className="absolute bottom-4 left-4 bg-luxury-gold px-4 py-2 text-luxury-dark shadow-xl sm:bottom-6 sm:left-6 sm:px-5 sm:py-3">
                          <span className="block text-[9px] font-bold uppercase tracking-[0.16em] opacity-65">Hodnota poukazu</span>
                          <strong className="text-xl font-black sm:text-2xl">{formatPrice(selectedVariant.currentPrice)}</strong>
                        </div>
                      )}
                    </div>
                  </div>
                </div>

                <div className="lg:pt-3">
                  <div className="border-b border-luxury-light/15 pb-6">
                    <p className="text-xs font-bold uppercase tracking-[0.16em] text-luxury-gold">Dárkový poukaz</p>
                    <h2 className="mt-2 text-3xl font-black text-luxury-light sm:text-4xl">Vyberte jeho hodnotu</h2>
                    <p className="mt-3 max-w-2xl text-sm leading-relaxed text-luxury-light/60">
                      Obdarovaný si vybere přesně tu vůni a objem, který mu udělá radost. Poukaz lze pohodlně uplatnit zadáním kódu v košíku.
                    </p>
                  </div>

                  {selectedVoucher.variants.length > 0 ? (
                    <div className="pt-6">
                      <div className="mb-3 flex items-baseline justify-between gap-4">
                        <h3 className="text-sm font-bold uppercase tracking-[0.14em] text-luxury-light">Dostupné částky</h3>
                        <span className="text-[10px] font-semibold uppercase tracking-wider text-luxury-light/40">
                          {selectedVoucher.variants.length} možností
                        </span>
                      </div>

                      <div className="grid grid-cols-2 gap-2 sm:grid-cols-3 xl:grid-cols-5">
                        {selectedVoucher.variants.map((variant) => {
                          const selected = selectedVariant?.id === variant.id;
                          return (
                            <button
                              type="button"
                              key={variant.id}
                              aria-pressed={selected}
                              onClick={() => {
                                setSelectedVariant(variant);
                                setAddedToCart(false);
                              }}
                              className={`min-h-[52px] border px-3 py-2 text-sm font-bold transition-all duration-200 ${
                                selected
                                  ? 'border-luxury-gold bg-luxury-gold text-luxury-dark shadow-lg shadow-luxury-gold/10'
                                  : 'border-luxury-gold/30 text-luxury-light hover:border-luxury-gold/75 hover:bg-luxury-gold/5'
                              }`}
                            >
                              {formatPrice(variant.currentPrice)}
                            </button>
                          );
                        })}
                      </div>

                      <div className="mt-7 flex items-end justify-between gap-5 border-y border-luxury-light/15 py-5">
                        <div>
                          <p className="text-[10px] font-bold uppercase tracking-[0.14em] text-luxury-light/45">Vybraná hodnota</p>
                          <p className="mt-1 text-3xl font-black text-luxury-gold sm:text-4xl">
                            {selectedVariant ? formatPrice(selectedVariant.currentPrice) : '—'}
                          </p>
                        </div>
                        <span className="hidden text-right text-xs leading-relaxed text-luxury-light/45 sm:block">
                          Elektronické doručení<br />bez dopravy
                        </span>
                      </div>

                      <button
                        type="button"
                        onClick={handleAddToCart}
                        disabled={!selectedVariant || !isClient}
                        className={`mt-5 min-h-[56px] w-full px-6 py-4 text-base font-black transition-all duration-300 disabled:cursor-not-allowed disabled:opacity-50 ${
                          addedToCart
                            ? 'bg-green-500 text-white'
                            : 'bg-luxury-gold text-luxury-dark shadow-lg shadow-luxury-gold/15 hover:bg-yellow-300'
                        }`}
                      >
                        {addedToCart ? '✓ Přidáno do košíku' : 'Přidat poukaz do košíku'}
                      </button>
                      <p className="mt-3 text-center text-[11px] text-luxury-light/45">
                        Kód poukazu vytvoříme automaticky po úspěšné platbě.
                      </p>
                    </div>
                  ) : (
                    <p className="border-b border-luxury-light/15 py-8 text-sm text-luxury-light/55">Pro tento poukaz momentálně není dostupná žádná částka.</p>
                  )}

                  <div className="mt-8 grid gap-3 sm:grid-cols-3">
                    {[
                      ['E-mailem', 'PDF po zaplacení'],
                      ['12 měsíců', 'Dlouhá platnost'],
                      ['Bez dopravy', 'Okamžité doručení'],
                    ].map(([title, text]) => (
                      <div key={title} className="border-l border-luxury-gold/50 pl-3">
                        <strong className="block text-sm text-luxury-light">{title}</strong>
                        <span className="mt-0.5 block text-[11px] text-luxury-light/45">{text}</span>
                      </div>
                    ))}
                  </div>

                  {selectedVoucher.description && (
                    <p className="mt-8 border-t border-luxury-light/15 pt-6 text-sm leading-relaxed text-luxury-light/60">
                      {selectedVoucher.description}
                    </p>
                  )}
                </div>
              </div>

              <section className="mt-20 border-t border-luxury-gold/35 pt-10 lg:mt-28 lg:pt-12">
                <header className="mb-8">
                  <p className="mb-2 text-xs font-bold uppercase tracking-[0.18em] text-luxury-gold">Jednoduše a rychle</p>
                  <h2 className="text-3xl font-black text-luxury-light sm:text-4xl">Jak dárkový poukaz funguje</h2>
                </header>
                <div className="grid gap-px bg-luxury-light/10 md:grid-cols-3">
                  {[
                    ['01', 'Vyberte hodnotu', 'Zvolte částku poukazu a vložte ho do košíku jako běžný produkt.'],
                    ['02', 'Dokončete platbu', 'Po úspěšném zaplacení automaticky vytvoříme jedinečný kód.'],
                    ['03', 'Darujte PDF', 'Poukaz přijde e-mailem a můžete ho přeposlat nebo vytisknout.'],
                  ].map(([number, title, text]) => (
                    <article key={number} className="bg-luxury-dark p-6 sm:p-8">
                      <span className="text-xs font-black tracking-[0.15em] text-luxury-gold">{number}</span>
                      <h3 className="mt-5 text-xl font-black text-luxury-light">{title}</h3>
                      <p className="mt-2 text-sm leading-relaxed text-luxury-light/55">{text}</p>
                    </article>
                  ))}
                </div>
              </section>

              <section className="mt-16 grid gap-8 border-t border-luxury-light/15 pt-10 lg:grid-cols-[0.38fr_0.62fr] lg:gap-16">
                <div>
                  <p className="text-xs font-bold uppercase tracking-[0.18em] text-luxury-gold">Dobré vědět</p>
                  <h2 className="mt-2 text-3xl font-black text-luxury-light">Podmínky poukazu</h2>
                </div>
                <div className="grid gap-4 text-sm leading-relaxed text-luxury-light/65 sm:grid-cols-2">
                  <p>Poukaz je přenositelný a lze ho uplatnit zadáním jedinečného kódu v košíku na Vystříkejto.cz.</p>
                  <p>Platnost je 12 měsíců od vystavení. Poukaz nelze směnit za hotovost.</p>
                  <p>V případě storna objednávky nebo vrácení zboží lze poukaz znovu použít do konce jeho platnosti.</p>
                  <p>Hodnota poukazu nemusí být vyčerpána celá během jednoho nákupu.</p>
                </div>
              </section>
            </>
          ) : null}
        </div>
      </section>
    </>
  );
};

export const getServerSideProps: GetServerSideProps<DarovePoukazyProps> = async ({ req }) => {
  const vouchers = await fetchFromApi<Voucher[]>(req, '/api/vouchers');
  return {
    props: {
      initialVouchers: vouchers || [],
    },
  };
};

export default DarovePoukazy;
