'use client';

import React, { useState } from 'react';
import {
  Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription,
} from '@/components/ui/dialog';
import { Input } from '@/components/ui/input';
import { Button } from '@/components/ui/button';
import { toast } from '@/hooks/use-toast';
import {
  Search, Loader2, Package, Phone, MapPin, CreditCard, Truck, MessageCircle,
  ClipboardList, CheckCircle2, ChefHat, Rocket, XCircle, FileText,
} from 'lucide-react';
import { motion, AnimatePresence } from 'framer-motion';

interface OrderTrackingModalProps {
  open: boolean;
  onOpenChange: (open: boolean) => void;
}

interface InvoiceData {
  invoice: {
    id: string; invoiceNumber: string; buyerName: string; buyerPhone: string;
    buyerAddress: string; buyerNotes: string; paymentMethod: string;
    subtotal: number; shipping: number; total: number; status: string;
    createdAt: string; updatedAt: string;
  };
  items: Array<{ id: string; name: string; price: number; quantity: number; variant?: string; note?: string; }>;
  statusHistory: Array<{
    key: string; label: string; emoji: string; description: string;
    status: 'completed' | 'current' | 'upcoming' | 'cancelled';
  }>;
}

function formatPrice(price: number): string { return new Intl.NumberFormat('id-ID').format(price); }
function formatDate(dateStr: string): string {
  return new Date(dateStr).toLocaleDateString('id-ID', { day: 'numeric', month: 'long', year: 'numeric', hour: '2-digit', minute: '2-digit' });
}

function getStepIcon(key: string, stepStatus: string) {
  const iconClass = stepStatus === 'completed' ? 'text-emerald-400' : stepStatus === 'current' ? 'text-[var(--accent-400)]' : stepStatus === 'cancelled' ? 'text-red-400' : 'text-[var(--text-quaternary)]';
  const size = 'h-6 w-6';
  switch (key) {
    case 'pending': return <ClipboardList className={`${size} ${iconClass}`} />;
    case 'confirmed': return <CheckCircle2 className={`${size} ${iconClass}`} />;
    case 'preparing': return <ChefHat className={`${size} ${iconClass}`} />;
    case 'on_the_way': return <Rocket className={`${size} ${iconClass}`} />;
    case 'delivered': return <CheckCircle2 className={`${size} ${iconClass}`} />;
    case 'cancelled': return <XCircle className={`${size} ${iconClass}`} />;
    default: return <Package className={`${size} ${iconClass}`} />;
  }
}

function getPaymentLabel(method: string): string {
  return { whatsapp: 'WhatsApp Transfer', qris: 'QRIS', cod: 'Bayar di Tempat (COD)' }[method] || method.toUpperCase();
}

export default function OrderTrackingModal({ open, onOpenChange }: OrderTrackingModalProps) {
  const [searchQuery, setSearchQuery] = useState('');
  const [searchType, setSearchType] = useState<'invoice' | 'phone'>('invoice');
  const [loading, setLoading] = useState(false);
  const [result, setResult] = useState<InvoiceData | null>(null);
  const [error, setError] = useState('');
  const [whatsapp, setWhatsapp] = useState('6281234567890');

  const handleSearch = async () => {
    if (!searchQuery.trim()) {
      toast({ title: 'Kolom pencarian kosong', description: 'Masukkan nomor invoice atau nomor HP', variant: 'destructive' });
      return;
    }
    setLoading(true); setError(''); setResult(null);
    try {
      const params = new URLSearchParams();
      if (searchType === 'invoice') params.set('invoiceNumber', searchQuery.trim());
      else params.set('phone', searchQuery.trim());
      const res = await fetch(`/api/order-tracking?${params.toString()}`);
      const data = await res.json();
      if (!data.success) { setError(data.error || 'Pesanan tidak ditemukan'); return; }
      setResult(data.data);
      try { const sr = await fetch('/api/settings'); const sd = await sr.json(); if (sd.success) setWhatsapp(sd.data.whatsapp); } catch { /* */ }
    } catch { setError('Gagal terhubung ke server. Coba lagi.'); } finally { setLoading(false); }
  };

  const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter') handleSearch(); };
  const handleReset = () => { setSearchQuery(''); setResult(null); setError(''); };

  const waMessage = result
    ? `Halo, saya ingin menanyakan status pesanan saya:\n\nNo. Invoice: ${result.invoice.invoiceNumber}\nNama: ${result.invoice.buyerName}\nStatus: ${result.invoice.status}\n\nTerima kasih!`
    : '';

  return (
    <Dialog open={open} onOpenChange={onOpenChange}>
      <DialogContent className="max-h-[95vh] overflow-y-auto border-[var(--border-hover)] bg-[var(--bg-secondary)] p-0 sm:max-w-md rounded-2xl">
        <div className="flex flex-col gap-4 border-b border-[var(--border-default)] p-5">
          <DialogHeader className="gap-1 p-0 text-left">
            <DialogTitle className="flex items-center gap-2 text-lg font-bold text-[var(--text-primary)]">
              <Package className="h-5 w-5 text-[var(--accent-400)]" />Lacak Pesanan
            </DialogTitle>
            <DialogDescription className="text-[var(--text-secondary)]">Masukkan nomor invoice atau nomor HP untuk melacak pesanan</DialogDescription>
          </DialogHeader>
          <div className="flex gap-2">
            <button onClick={() => { setSearchType('invoice'); handleReset(); }}
              className={`flex items-center gap-2 rounded-lg border px-4 py-2.5 text-sm font-medium transition-all ${
                searchType === 'invoice' ? 'border-[var(--accent-300)] bg-[var(--accent-100)] text-[var(--accent-600)]'
                : 'border-[var(--border-hover)] bg-[var(--bg-input)] text-[var(--text-secondary)] hover:border-[var(--border-hover)]'
              }`}>
              <FileText className="h-4 w-4" />No. Invoice
            </button>
            <button onClick={() => { setSearchType('phone'); handleReset(); }}
              className={`flex items-center gap-2 rounded-lg border px-4 py-2.5 text-sm font-medium transition-all ${
                searchType === 'phone' ? 'border-[var(--accent-300)] bg-[var(--accent-100)] text-[var(--accent-600)]'
                : 'border-[var(--border-hover)] bg-[var(--bg-input)] text-[var(--text-secondary)] hover:border-[var(--border-hover)]'
              }`}>
              <Phone className="h-4 w-4" />No. HP
            </button>
          </div>
          <div className="flex gap-2">
            <Input value={searchQuery} onChange={(e) => setSearchQuery(e.target.value)} onKeyDown={handleKeyDown}
              placeholder={searchType === 'invoice' ? 'Contoh: 20240101ABCD' : 'Contoh: 081234567890'}
              className="flex-1 border-[var(--border-hover)] bg-[var(--bg-input)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:border-[var(--accent-300)] rounded-xl h-12" />
            <Button onClick={handleSearch} disabled={loading}
              className="h-12 shrink-0 rounded-xl bg-gradient-to-r from-[var(--accent-500)] to-[var(--accent-400)] px-5 font-semibold text-white shadow-lg transition-all hover:shadow-xl active:scale-95 disabled:opacity-50">
              {loading ? <Loader2 className="h-5 w-5 animate-spin" /> : <Search className="h-5 w-5" />}
            </Button>
          </div>
        </div>

        <div className="flex flex-col p-5">
          <AnimatePresence mode="wait">
            {error && (
              <motion.div key="error" initial={{ opacity: 0, y: 10 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0 }}
                className="flex flex-col items-center gap-3 py-8 text-center">
                <div className="flex h-16 w-16 items-center justify-center rounded-full bg-red-500/10">
                  <Package className="h-8 w-8 text-red-400" />
                </div>
                <p className="text-sm text-[var(--text-secondary)]">{error}</p>
                <button onClick={handleReset} className="mt-2 text-sm text-[var(--accent-400)] hover:text-[var(--accent-300)]">Coba cari lagi</button>
              </motion.div>
            )}
            {result && (
              <motion.div key="result" initial={{ opacity: 0, y: 10 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0 }} className="flex flex-col gap-5">
                <div className="flex flex-col gap-3">
                  <div className="flex items-center justify-between">
                    <h3 className="text-sm font-semibold text-[var(--text-primary)]">{result.invoice.invoiceNumber}</h3>
                    <span className="text-xs text-[var(--text-tertiary)]">{formatDate(result.invoice.createdAt)}</span>
                  </div>
                  <div className="flex flex-col gap-2 rounded-xl border border-[var(--border-default)] bg-[var(--bg-input)] p-4">
                    <div className="flex items-center gap-2">
                      <div className="flex h-8 w-8 items-center justify-center rounded-lg bg-[var(--accent-100)]">
                        <span className="text-sm">{result.invoice.buyerName.charAt(0).toUpperCase()}</span>
                      </div>
                      <div>
                        <p className="text-sm font-semibold text-[var(--text-primary)]">{result.invoice.buyerName}</p>
                        <p className="text-xs text-[var(--text-tertiary)]">{result.invoice.buyerPhone}</p>
                      </div>
                    </div>
                    <div className="flex items-start gap-2 pl-10">
                      <MapPin className="mt-0.5 h-3.5 w-3.5 shrink-0 text-[var(--text-quaternary)]" />
                      <p className="text-xs text-[var(--text-secondary)]">{result.invoice.buyerAddress}</p>
                    </div>
                    {result.invoice.buyerNotes && (
                      <div className="flex items-start gap-2 pl-10">
                        <FileText className="mt-0.5 h-3.5 w-3.5 shrink-0 text-[var(--text-quaternary)]" />
                        <p className="text-xs text-[var(--text-secondary)]">{result.invoice.buyerNotes}</p>
                      </div>
                    )}
                  </div>
                </div>

                <div className="flex flex-col gap-3">
                  <h3 className="text-sm font-semibold text-[var(--text-primary)]">Status Pesanan</h3>
                  <div className="flex flex-col gap-0">
                    {result.statusHistory.map((step, idx) => {
                      const isLast = idx === result.statusHistory.length - 1;
                      return (
                        <div key={step.key} className="flex gap-3">
                          <div className="flex flex-col items-center">
                            <div className={`flex h-10 w-10 shrink-0 items-center justify-center rounded-full border-2 transition-all ${
                              step.status === 'completed' ? 'border-emerald-500/50 bg-emerald-500/15'
                              : step.status === 'current' ? 'border-[var(--accent-300)] bg-[var(--accent-100)]'
                              : step.status === 'cancelled' ? 'border-red-500/50 bg-red-500/15'
                              : 'border-[var(--border-default)] bg-[var(--bg-input)]'
                            }`}>
                              {getStepIcon(step.key, step.status)}
                            </div>
                            {!isLast && <div className={`w-0.5 flex-1 min-h-6 ${step.status === 'completed' ? 'bg-emerald-500/40' : 'bg-[var(--border-default)]'}`} />}
                          </div>
                          <div className="flex flex-col pb-4">
                            <p className={`text-sm font-semibold ${
                              step.status === 'completed' ? 'text-emerald-400' : step.status === 'current' ? 'text-[var(--accent-400)]'
                              : step.status === 'cancelled' ? 'text-red-400' : 'text-[var(--text-quaternary)]'
                            }`}>{step.emoji} {step.label}</p>
                            <p className={`text-xs ${step.status === 'current' ? 'text-[var(--text-secondary)]' : 'text-[var(--text-quaternary)]'}`}>{step.description}</p>
                          </div>
                        </div>
                      );
                    })}
                  </div>
                </div>

                <div className="flex flex-col gap-3">
                  <h3 className="text-sm font-semibold text-[var(--text-primary)]">Detail Pesanan</h3>
                  <div className="flex flex-col gap-2 rounded-xl border border-[var(--border-default)] bg-[var(--bg-input)] p-4">
                    {result.items.map((item, i) => (
                      <div key={item.id || i} className="flex items-center justify-between">
                        <div className="flex min-w-0 flex-1 flex-col">
                          <p className="text-sm text-[var(--text-primary)] truncate">
                            {item.name}{item.variant && item.variant !== 'Regular' ? <span className="text-xs text-[var(--text-tertiary)]"> ({item.variant})</span> : ''}
                          </p>
                          <p className="text-xs text-[var(--text-tertiary)]">{item.quantity}x @ Rp {formatPrice(item.price)}</p>
                          {item.note && <p className="text-xs text-[var(--accent-400)]/60 italic">Catatan: {item.note}</p>}
                        </div>
                        <span className="ml-3 shrink-0 text-sm font-medium text-[var(--text-primary)]">Rp {formatPrice(item.price * item.quantity)}</span>
                      </div>
                    ))}
                    <div className="mt-2 border-t border-[var(--border-hover)] pt-2">
                      <div className="flex justify-between text-xs">
                        <span className="text-[var(--text-tertiary)]">Subtotal</span>
                        <span className="text-[var(--text-secondary)]">Rp {formatPrice(result.invoice.subtotal)}</span>
                      </div>
                      <div className="flex justify-between text-xs">
                        <span className="text-[var(--text-tertiary)]">Ongkos Kirim</span>
                        <span className={result.invoice.shipping === 0 ? 'text-emerald-400' : 'text-[var(--text-secondary)]'}>
                          {result.invoice.shipping === 0 ? 'GRATIS' : `Rp ${formatPrice(result.invoice.shipping)}`}
                        </span>
                      </div>
                      <div className="mt-1 flex justify-between text-sm font-bold">
                        <span className="text-[var(--text-primary)]">Total</span>
                        <span className="text-[var(--accent-400)]">Rp {formatPrice(result.invoice.total)}</span>
                      </div>
                    </div>
                  </div>
                </div>

                <div className="flex items-center gap-3 rounded-xl border border-[var(--border-default)] bg-[var(--bg-input)] p-4">
                  <CreditCard className="h-4 w-4 shrink-0 text-[var(--text-tertiary)]" />
                  <div>
                    <p className="text-xs text-[var(--text-tertiary)]">Metode Pembayaran</p>
                    <p className="text-sm font-medium text-[var(--text-primary)]">{getPaymentLabel(result.invoice.paymentMethod)}</p>
                  </div>
                </div>

                <a href={`https://wa.me/${whatsapp}?text=${encodeURIComponent(waMessage)}`} target="_blank" rel="noopener noreferrer"
                  className="flex w-full items-center justify-center gap-2 rounded-xl bg-gradient-to-r from-emerald-500 to-emerald-600 px-6 py-3.5 text-sm font-semibold text-white shadow-lg shadow-emerald-500/25 transition-all hover:shadow-xl hover:shadow-emerald-500/40 active:scale-95">
                  <MessageCircle className="h-5 w-5" />Hubungi via WhatsApp
                </a>
              </motion.div>
            )}
            {!result && !error && !loading && (
              <motion.div key="empty" initial={{ opacity: 0 }} animate={{ opacity: 1 }} className="flex flex-col items-center gap-3 py-8 text-center">
                <div className="flex h-16 w-16 items-center justify-center rounded-full bg-[var(--bg-input)]">
                  <Truck className="h-8 w-8 text-[var(--text-quaternary)]" />
                </div>
                <p className="text-sm text-[var(--text-tertiary)]">Masukkan nomor invoice atau nomor HP untuk melacak pesanan Anda</p>
              </motion.div>
            )}
          </AnimatePresence>
        </div>
      </DialogContent>
    </Dialog>
  );
}
