'use client';

import React, { useState, useEffect } from 'react';
import { Star, Plus, Minus, ShoppingCart, Loader2, Send, MessageSquare } from 'lucide-react';
import {
  Dialog,
  DialogContent,
  DialogHeader,
  DialogTitle,
  DialogDescription,
} from '@/components/ui/dialog';
import { Input } from '@/components/ui/input';
import { useFoodMartStore, type CartItem } from '@/store/foodmart';
import { toast } from '@/hooks/use-toast';
import type { FoodItem } from './food-card';
import { motion, AnimatePresence } from 'framer-motion';

interface FoodModalProps {
  food: FoodItem | null;
  open: boolean;
  onOpenChange: (open: boolean) => void;
}

interface ReviewData {
  id: string;
  name: string;
  rating: number;
  comment: string;
  createdAt: string;
}

interface ReviewsResponse {
  reviews: ReviewData[];
  averageRating: number;
  totalCount: number;
  distribution: Record<number, number>;
}

function formatPrice(price: number): string {
  return new Intl.NumberFormat('id-ID').format(price);
}

function sanitizeHTML(html: string): string {
  let clean = html.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
  clean = clean.replace(/\bon\w+="[^"]*"/gi, '');
  clean = clean.replace(/\bon\w+='[^']*'/gi, '');
  clean = clean.replace(/\bon\w+=\S+/gi, '');
  return clean;
}

function formatDate(dateStr: string): string {
  const date = new Date(dateStr);
  const now = new Date();
  const diffMs = now.getTime() - date.getTime();
  const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));

  if (diffDays === 0) return 'Hari ini';
  if (diffDays === 1) return 'Kemarin';
  if (diffDays < 7) return `${diffDays} hari lalu`;
  if (diffDays < 30) return `${Math.floor(diffDays / 7)} minggu lalu`;
  return date.toLocaleDateString('id-ID', { day: 'numeric', month: 'short', year: 'numeric' });
}

const SPICY_LEVELS = [
  { level: 0, emoji: '❌', label: 'Tidak Pedas' },
  { level: 1, emoji: '🌶️', label: 'Sedikit Pedas' },
  { level: 2, emoji: '🌶️🌶️', label: 'Pedas' },
  { level: 3, emoji: '🔥', label: 'Sangat Pedas' },
];

const SWEETNESS_LEVELS = [
  { level: 0, emoji: '🚫', label: 'Less Sugar' },
  { level: 1, emoji: '🍬', label: 'Normal' },
  { level: 2, emoji: '🍯', label: 'Extra Sweet' },
];

const VARIANTS = ['Regular', 'Large'];

export default function FoodModal({ food, open, onOpenChange }: FoodModalProps) {
  const [quantity, setQuantity] = useState(1);
  const [note, setNote] = useState('');
  const [variant, setVariant] = useState('Regular');
  const [optionLevel, setOptionLevel] = useState(0);
  const addToCart = useFoodMartStore((s) => s.addToCart);

  const [reviewsData, setReviewsData] = useState<ReviewsResponse | null>(null);
  const [reviewsLoading, setReviewsLoading] = useState(false);
  const [showReviewForm, setShowReviewForm] = useState(false);
  const [reviewName, setReviewName] = useState('');
  const [reviewRating, setReviewRating] = useState(5);
  const [reviewComment, setReviewComment] = useState('');
  const [reviewSubmitting, setReviewSubmitting] = useState(false);

  const prevOpen = React.useRef(false);
  const prevFoodId = React.useRef<string | null>(null);

  React.useEffect(() => {
    if (open && !prevOpen.current) {
      setQuantity(1);
      setNote('');
      setVariant('Regular');
      setOptionLevel(0);
      setShowReviewForm(false);
      setReviewName('');
      setReviewRating(5);
      setReviewComment('');
    }
    prevOpen.current = open;
  }, [open]);

  useEffect(() => {
    if (food && open && food.id !== prevFoodId.current) {
      prevFoodId.current = food.id;
      fetchReviews(food.id);
    }
  }, [food, open]);

  const fetchReviews = async (foodId: string) => {
    setReviewsLoading(true);
    try {
      const res = await fetch(`/api/reviews?foodId=${foodId}&limit=10`);
      const data = await res.json();
      if (data.success) {
        setReviewsData(data.data);
      }
    } catch {
      // silent
    } finally {
      setReviewsLoading(false);
    }
  };

  const handleSubmitReview = async () => {
    if (!food) return;
    if (!reviewName.trim()) {
      toast({ title: 'Nama wajib diisi', description: 'Masukkan nama Anda untuk mengirim ulasan', variant: 'destructive' });
      return;
    }
    setReviewSubmitting(true);
    try {
      const res = await fetch('/api/reviews', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ foodId: food.id, name: reviewName.trim(), rating: reviewRating, comment: reviewComment.trim() }),
      });
      const data = await res.json();
      if (!data.success) throw new Error(data.error || 'Gagal mengirim ulasan');
      toast({ title: 'Ulasan Terkirim! 🎉', description: 'Terima kasih atas ulasan Anda' });
      setShowReviewForm(false);
      setReviewName('');
      setReviewRating(5);
      setReviewComment('');
      fetchReviews(food.id);
    } catch (error) {
      toast({ title: 'Gagal Mengirim', description: error instanceof Error ? error.message : 'Terjadi kesalahan', variant: 'destructive' });
    } finally {
      setReviewSubmitting(false);
    }
  };

  if (!food) return null;

  const isDrink = food.category?.slug === 'minuman';
  const currentPrice = food.discountPrice || food.price;
  const variantMultiplier = variant === 'Large' ? 1.4 : 1;
  const totalPrice = Math.round(currentPrice * variantMultiplier * quantity);
  const displayRating = reviewsData?.averageRating || food.rating;
  const displayReviewCount = reviewsData?.totalCount || food.reviews;
  const recentReviews = reviewsData?.reviews?.slice(0, 3) || [];
  const distribution = reviewsData?.distribution || { 5: 0, 4: 0, 3: 0, 2: 0, 1: 0 };
  const maxDistCount = Math.max(...Object.values(distribution), 1);

  const handleAddToCart = () => {
    const item: CartItem = {
      id: food.id,
      name: `${food.name}${variant !== 'Regular' ? ` (${variant})` : ''}`,
      price: Math.round(currentPrice * variantMultiplier),
      thumbnail: food.thumbnail,
      quantity,
      variant,
      note: optionLevel > 0 ? `${isDrink ? SWEETNESS_LEVELS[optionLevel].label : SPICY_LEVELS[optionLevel].label}${note ? ', ' + note : ''}` : note,
    };
    addToCart(item);
    toast({ title: 'Ditambahkan ke Keranjang! 🎉', description: `${item.name} x${quantity}` });
    onOpenChange(false);
  };

  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="relative aspect-[4/3] overflow-hidden">
          {food.largeImage || food.thumbnail ? (
            <img src={food.largeImage || food.thumbnail} alt={food.name} className="h-full w-full object-cover" />
          ) : (
            <div className="flex h-full w-full items-center justify-center bg-[var(--bg-card)] text-6xl">🍽️</div>
          )}
          <div className="absolute inset-0 bg-gradient-to-t from-[var(--bg-secondary)] via-transparent to-transparent" />
          {food.isHalal && (
            <div className="absolute top-4 left-4 z-10 flex items-center gap-1.5 rounded-full bg-emerald-600/90 px-3 py-1 text-xs font-semibold text-white backdrop-blur-sm">
              <svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C9.243 2 7 4.243 7 7c0 2.757 2.243 5 5 5s5-2.243 5-5c0-2.757-2.243-5-5-5zm-1 7h2v2h-2V9zm0-4h2v2h-2V5zm-5 10c-2.757 0-5 2.243-5 5s2.243 5 5 5 5-2.243 5-5-2.243-5-5-5zm-1 7h2v2h-2v-2zm0-4h2v2h-2v-2zm12-3c-2.757 0-5 2.243-5 5s2.243 5 5 5 5-2.243 5-5-2.243-5-5-5zm-1 7h2v2h-2v-2zm0-4h2v2h-2v-2z"/></svg>
              Halal
            </div>
          )}
          {food.badge && (
            <div className="absolute top-4 right-4 z-10">
              <span className={`rounded-full px-3 py-1 text-xs font-bold text-white backdrop-blur-sm ${
                food.badge.toLowerCase().includes('promo') ? 'bg-red-500/90'
                : food.badge.toLowerCase().includes('best') || food.isBestseller ? 'bg-[var(--accent-500)]/90'
                : 'bg-emerald-500/90'
              }`}>{food.badge}</span>
            </div>
          )}
        </div>

        <div className="flex flex-col gap-4 p-5">
          <DialogHeader className="gap-2 text-left p-0">
            <DialogTitle className="text-xl font-bold text-[var(--text-primary)]">{food.name}</DialogTitle>
            <DialogDescription className="sr-only">Detail menu {food.name}</DialogDescription>
          </DialogHeader>

          <div className="flex items-center gap-3">
            <div className="flex items-center gap-1.5">
              <Star className="h-4 w-4 fill-amber-500 text-amber-500" />
              <span className="text-sm font-semibold text-[var(--text-primary)]">{displayRating}</span>
            </div>
            <span className="text-xs text-[var(--text-tertiary)]">({displayReviewCount} ulasan)</span>
            <span className="text-xs text-[var(--text-quaternary)]">•</span>
            <span className="text-xs text-[var(--text-tertiary)]">{food.category?.name}</span>
          </div>

          <div className="flex items-baseline gap-3">
            <span className="text-2xl font-bold text-[var(--accent-400)]">Rp {formatPrice(currentPrice)}</span>
            {food.discountPrice && food.discountPrice < food.price && (
              <>
                <span className="text-sm text-[var(--text-tertiary)] line-through">Rp {formatPrice(food.price)}</span>
                <span className="rounded-md bg-red-500/20 px-2 py-0.5 text-xs font-semibold text-red-400">Hemat Rp {formatPrice(food.price - food.discountPrice)}</span>
              </>
            )}
          </div>

          {food.description && (
            <div className="rounded-lg bg-[var(--bg-input)] p-4 text-sm leading-relaxed text-[var(--text-secondary)] [&_p]:mb-2 [&_ul]:ml-4 [&_ol]:ml-4 [&_li]:text-[var(--text-secondary)] [&_strong]:text-[var(--text-primary)] [&_em]:text-[var(--accent-400)]"
              dangerouslySetInnerHTML={{ __html: sanitizeHTML(food.description) }} />
          )}

          <div>
            <p className="mb-2 text-sm font-semibold text-[var(--text-primary)]">Ukuran</p>
            <div className="flex gap-2">
              {VARIANTS.map((v) => (
                <button key={v} onClick={() => setVariant(v)}
                  className={`flex-1 rounded-xl border px-4 py-2.5 text-sm font-medium transition-all ${
                    variant === v ? 'border-[var(--accent-300)] bg-[var(--accent-100)] text-[var(--accent-600)]'
                    : 'border-[var(--border-hover)] bg-[var(--bg-input)] text-[var(--text-tertiary)] hover:border-[var(--border-hover)] hover:text-[var(--text-secondary)]'
                  }`}>
                  {v}{v === 'Large' && <span className="ml-2 text-xs opacity-70">+40%</span>}
                </button>
              ))}
            </div>
          </div>

          {isDrink && (
            <div>
              <p className="mb-2 text-sm font-semibold text-[var(--text-primary)]">Tingkat Kemanisan</p>
              <div className="flex gap-2">
                {SWEETNESS_LEVELS.map((s) => (
                  <button key={s.level} onClick={() => setOptionLevel(s.level)}
                    className={`flex items-center gap-1.5 rounded-xl border px-3 py-2 text-sm transition-all ${
                      optionLevel === s.level ? 'border-[var(--accent-300)] bg-[var(--accent-100)] text-[var(--accent-600)]'
                      : 'border-[var(--border-hover)] bg-[var(--bg-input)] text-[var(--text-tertiary)] hover:border-[var(--border-hover)] hover:text-[var(--text-secondary)]'
                    }`}>
                    <span>{s.emoji}</span>
                    <span className="hidden sm:inline text-xs">{s.label}</span>
                  </button>
                ))}
              </div>
            </div>
          )}

          <div>
            <p className="mb-2 text-sm font-semibold text-[var(--text-primary)]">Jumlah</p>
            <div className="flex items-center gap-3">
              <button onClick={() => setQuantity((q) => Math.max(1, q - 1))}
                className="flex h-10 w-10 items-center justify-center rounded-xl border border-[var(--border-hover)] bg-[var(--bg-input)] text-[var(--text-primary)] transition-colors hover:bg-[var(--bg-hover)]">
                <Minus className="h-4 w-4" />
              </button>
              <span className="min-w-[40px] text-center text-lg font-bold text-[var(--text-primary)]">{quantity}</span>
              <button onClick={() => setQuantity((q) => q + 1)}
                className="flex h-10 w-10 items-center justify-center rounded-xl border border-[var(--accent-200)] bg-[var(--accent-100)] text-[var(--accent-400)] transition-colors hover:bg-[var(--accent-200)]">
                <Plus className="h-4 w-4" />
              </button>
            </div>
          </div>

          <div>
            <p className="mb-2 text-sm font-semibold text-[var(--text-primary)]">Catatan (Opsional)</p>
            <textarea value={note} onChange={(e) => setNote(e.target.value)}
              placeholder="Contoh: tanpa bawang, tambah sambal..." rows={2}
              className="w-full rounded-xl border border-[var(--border-hover)] bg-[var(--bg-input)] px-4 py-3 text-sm text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] outline-none transition-colors focus:border-[var(--accent-300)] focus:bg-[var(--bg-input-focus)] resize-none" />
          </div>

          {/* Reviews Section */}
          <div className="border-t border-[var(--border-default)] pt-4">
            <div className="flex items-center justify-between mb-4">
              <div className="flex items-center gap-2">
                <MessageSquare className="h-5 w-5 text-[var(--accent-400)]" />
                <h3 className="text-sm font-bold text-[var(--text-primary)]">Ulasan Pelanggan</h3>
              </div>
              {!showReviewForm && (
                <button onClick={() => setShowReviewForm(true)}
                  className="rounded-lg bg-[var(--accent-100)] px-3 py-1.5 text-xs font-semibold text-[var(--accent-600)] transition-colors hover:bg-[var(--accent-200)]">
                  Tulis Ulasan
                </button>
              )}
            </div>

            {reviewsLoading ? (
              <div className="flex items-center justify-center py-6">
                <Loader2 className="h-5 w-5 animate-spin text-[var(--text-tertiary)]" />
              </div>
            ) : (
              <>
                <div className="mb-4 flex gap-4 rounded-xl border border-[var(--border-default)] bg-[var(--bg-input)] p-4">
                  <div className="flex flex-col items-center justify-center gap-1 shrink-0">
                    <span className="text-3xl font-bold text-[var(--text-primary)]">{displayRating}</span>
                    <div className="flex gap-0.5">
                      {[1, 2, 3, 4, 5].map((s) => (
                        <Star key={s} className={`h-3.5 w-3.5 ${s <= Math.round(displayRating) ? 'fill-amber-500 text-amber-500' : 'text-[var(--text-quaternary)]'}`} />
                      ))}
                    </div>
                    <span className="text-[10px] text-[var(--text-tertiary)]">{displayReviewCount} ulasan</span>
                  </div>
                  <div className="flex flex-1 flex-col gap-1.5">
                    {[5, 4, 3, 2, 1].map((star) => {
                      const count = distribution[star] || 0;
                      const pct = displayReviewCount > 0 ? (count / displayReviewCount) * 100 : 0;
                      return (
                        <div key={star} className="flex items-center gap-2">
                          <span className="w-3 text-right text-xs text-[var(--text-secondary)]">{star}</span>
                          <Star className="h-3 w-3 fill-amber-500 text-amber-500" />
                          <div className="h-2 flex-1 overflow-hidden rounded-full bg-[var(--bg-hover)]">
                            <motion.div initial={{ width: 0 }} animate={{ width: `${pct}%` }} transition={{ duration: 0.5, delay: (5 - star) * 0.1 }}
                              className="h-full rounded-full bg-amber-500" />
                          </div>
                          <span className="w-5 text-right text-[10px] text-[var(--text-quaternary)]">{count}</span>
                        </div>
                      );
                    })}
                  </div>
                </div>

                {recentReviews.length > 0 && (
                  <div className="flex flex-col gap-3 mb-4">
                    {recentReviews.map((review) => (
                      <motion.div key={review.id} initial={{ opacity: 0, y: 5 }} animate={{ opacity: 1, y: 0 }}
                        className="rounded-lg border border-[var(--border-default)] bg-[var(--bg-input)] p-3">
                        <div className="mb-1.5 flex items-center justify-between">
                          <div className="flex items-center gap-2">
                            <div className="flex h-7 w-7 items-center justify-center rounded-full bg-gradient-to-br from-[var(--accent-500)] to-[var(--accent-400)] text-xs font-bold text-white">
                              {review.name.charAt(0).toUpperCase()}
                            </div>
                            <span className="text-xs font-semibold text-[var(--text-primary)]">{review.name}</span>
                          </div>
                          <span className="text-[10px] text-[var(--text-quaternary)]">{formatDate(review.createdAt)}</span>
                        </div>
                        <div className="mb-1 flex gap-0.5">
                          {[1, 2, 3, 4, 5].map((s) => (
                            <Star key={s} className={`h-3 w-3 ${s <= review.rating ? 'fill-amber-500 text-amber-500' : 'text-[var(--text-quaternary)]'}`} />
                          ))}
                        </div>
                        {review.comment && <p className="text-xs text-[var(--text-secondary)] leading-relaxed">{review.comment}</p>}
                      </motion.div>
                    ))}
                  </div>
                )}

                {recentReviews.length === 0 && !reviewsLoading && (
                  <p className="mb-4 text-center text-xs text-[var(--text-tertiary)] py-4">Belum ada ulasan. Jadilah yang pertama!</p>
                )}

                <AnimatePresence>
                  {showReviewForm && (
                    <motion.div initial={{ opacity: 0, height: 0 }} animate={{ opacity: 1, height: 'auto' }} exit={{ opacity: 0, height: 0 }} className="overflow-hidden">
                      <div className="rounded-xl border border-[var(--accent-200)] bg-[var(--accent-50)] p-4 flex flex-col gap-3">
                        <h4 className="text-sm font-semibold text-[var(--text-primary)]">Tulis Ulasan</h4>
                        <div>
                          <p className="mb-1 text-xs text-[var(--text-secondary)]">Nama *</p>
                          <Input value={reviewName} onChange={(e) => setReviewName(e.target.value)} placeholder="Nama Anda"
                            className="h-11 border-[var(--border-hover)] bg-[var(--bg-input)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:border-[var(--accent-300)] rounded-xl text-sm" />
                        </div>
                        <div>
                          <p className="mb-1 text-xs text-[var(--text-secondary)]">Rating *</p>
                          <div className="flex gap-1.5">
                            {[1, 2, 3, 4, 5].map((s) => (
                              <button key={s} type="button" onClick={() => setReviewRating(s)}
                                className="flex h-11 w-11 items-center justify-center rounded-lg border border-[var(--border-default)] transition-all">
                                <Star className={`h-6 w-6 transition-colors ${s <= reviewRating ? 'fill-amber-500 text-amber-500' : 'text-[var(--text-quaternary)]'}`} />
                              </button>
                            ))}
                          </div>
                        </div>
                        <div>
                          <p className="mb-1 text-xs text-[var(--text-secondary)]">Ulasan (Opsional)</p>
                          <textarea value={reviewComment} onChange={(e) => setReviewComment(e.target.value)} placeholder="Bagikan pengalaman Anda..." rows={3}
                            className="w-full rounded-xl border border-[var(--border-hover)] bg-[var(--bg-input)] px-4 py-3 text-sm text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] outline-none transition-colors focus:border-[var(--accent-300)] focus:bg-[var(--bg-input-focus)] resize-none" />
                        </div>
                        <div className="flex gap-2">
                          <button onClick={() => setShowReviewForm(false)}
                            className="flex-1 rounded-xl border border-[var(--border-hover)] bg-[var(--bg-input)] px-4 py-3 text-sm font-medium text-[var(--text-secondary)] transition-colors hover:bg-[var(--bg-hover)]">
                            Batal
                          </button>
                          <button onClick={handleSubmitReview} disabled={reviewSubmitting}
                            className="flex flex-1 items-center justify-center gap-2 rounded-xl bg-gradient-to-r from-[var(--accent-500)] to-[var(--accent-400)] px-4 py-3 text-sm font-semibold text-white shadow-lg transition-all hover:shadow-xl active:scale-95 disabled:opacity-50">
                            {reviewSubmitting ? <Loader2 className="h-4 w-4 animate-spin" /> : <Send className="h-4 w-4" />}
                            Kirim
                          </button>
                        </div>
                      </div>
                    </motion.div>
                  )}
                </AnimatePresence>
              </>
            )}
          </div>
        </div>

        <div className="sticky bottom-0 border-t border-[var(--border-hover)] p-5" style={{ backgroundColor: 'var(--header-bg)', backdropFilter: 'var(--header-blur)' }}>
          <div className="flex items-center justify-between">
            <div>
              <p className="text-xs text-[var(--text-secondary)]">Total</p>
              <p className="text-xl font-bold text-[var(--text-primary)]">Rp {formatPrice(totalPrice)}</p>
            </div>
            <button onClick={handleAddToCart}
              className="flex items-center gap-2 rounded-xl bg-gradient-to-r from-[var(--accent-500)] to-[var(--accent-400)] px-6 py-3 text-sm font-semibold text-white shadow-lg transition-all hover:shadow-xl active:scale-95">
              <ShoppingCart className="h-4 w-4" />
              Tambah ke Keranjang
            </button>
          </div>
        </div>
      </DialogContent>
    </Dialog>
  );
}
