"use client";

import { useMemo, useState } from "react";
import Image from "next/image";
import Link from "next/link";
import { CheckCircle2, Clock3, Loader2, MessageSquareText, Send, Star, UserCircle2, XCircle } from "lucide-react";

type ReviewStatus = "pending" | "approved" | "rejected";

type ReviewItem = {
  id: string;
  client_id: string;
  rating: number;
  comment: string;
  status: ReviewStatus;
  created_at: string;
  updated_at?: string | null;
  client_name: string;
  client_avatar_url: string | null;
};

function formatReviewDate(value?: string | null) {
  if (!value) return "";
  return new Date(value).toLocaleDateString("pt-BR", {
    day: "2-digit",
    month: "short",
    year: "numeric",
  });
}

function statusMeta(status: ReviewStatus) {
  if (status === "approved") {
    return {
      label: "Aprovado",
      className: "border-emerald-200 bg-emerald-50 text-emerald-700",
      icon: CheckCircle2,
    };
  }
  if (status === "rejected") {
    return {
      label: "Ajuste necessário",
      className: "border-rose-200 bg-rose-50 text-rose-700",
      icon: XCircle,
    };
  }
  return {
    label: "Aguardando aprovação",
    className: "border-amber-200 bg-amber-50 text-amber-700",
    icon: Clock3,
  };
}

function Stars({
  value,
  interactive = false,
  onChange,
  size = 18,
}: {
  value: number;
  interactive?: boolean;
  onChange?: (value: number) => void;
  size?: number;
}) {
  return (
    <div className="flex items-center gap-1">
      {Array.from({ length: 5 }).map((_, index) => {
        const starValue = index + 1;
        const filled = starValue <= Math.round(value);
        const Icon = Star;

        if (interactive) {
          return (
            <button
              key={starValue}
              type="button"
              onClick={() => onChange?.(starValue)}
              className="transition-transform hover:scale-110"
              aria-label={`${starValue} estrela${starValue > 1 ? "s" : ""}`}
            >
              <Icon
                size={size}
                className={filled ? "fill-amber-400 text-amber-400" : "text-zinc-300"}
              />
            </button>
          );
        }

        return (
          <Icon
            key={starValue}
            size={size}
            className={filled ? "fill-amber-400 text-amber-400" : "text-zinc-300"}
          />
        );
      })}
    </div>
  );
}

export default function ProductReviewsSection({
  slug,
  productId,
  loggedClient,
  approvedReviews,
  ownReview,
  reviewCount,
  averageRating,
  loginHref,
}: {
  slug: string;
  productId: string;
  loggedClient?: { id: string; name: string; avatar_url: string | null } | null;
  approvedReviews: ReviewItem[];
  ownReview: ReviewItem | null;
  reviewCount: number;
  averageRating: number;
  loginHref: string;
}) {
  const [currentApprovedReviews, setCurrentApprovedReviews] = useState<ReviewItem[]>(approvedReviews);
  const [currentOwnReview, setCurrentOwnReview] = useState<ReviewItem | null>(ownReview);
  const [rating, setRating] = useState<number>(ownReview?.rating || 5);
  const [comment, setComment] = useState<string>(ownReview?.comment || "");
  const [submitting, setSubmitting] = useState(false);
  const [feedback, setFeedback] = useState<{ type: "success" | "error"; text: string } | null>(null);

  const summary = useMemo(() => {
    const total = currentApprovedReviews.length;
    const average = total
      ? currentApprovedReviews.reduce((sum, review) => sum + Number(review.rating || 0), 0) / total
      : averageRating;

    const distribution = Array.from({ length: 5 }).map((_, index) => {
      const star = 5 - index;
      const count = currentApprovedReviews.filter((review) => review.rating === star).length;
      const percentage = total ? (count / total) * 100 : 0;
      return { star, count, percentage };
    });

    return {
      total,
      average: total ? average : averageRating,
      distribution,
    };
  }, [averageRating, currentApprovedReviews]);

  const currentStatus = currentOwnReview ? statusMeta(currentOwnReview.status) : null;

  async function handleSubmit(event: React.FormEvent<HTMLFormElement>) {
    event.preventDefault();
    if (!loggedClient?.id) return;
    if (rating < 1 || rating > 5) {
      setFeedback({ type: "error", text: "Selecione uma nota de 1 a 5 estrelas." });
      return;
    }
    if (comment.trim().length < 8) {
      setFeedback({ type: "error", text: "Escreva um comentário mais completo para enviar." });
      return;
    }

    setSubmitting(true);
    setFeedback(null);

    try {
      const response = await fetch("/api/client-portal/reviews", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({
          slug,
          productId,
          reviewId: currentOwnReview?.id || null,
          rating,
          comment,
        }),
      });

      const data = (await response.json()) as {
        error?: string;
        review?: ReviewItem;
      };

      if (!response.ok || data.error || !data.review) {
        throw new Error(data.error || "Não foi possível enviar sua avaliação.");
      }

      setCurrentOwnReview(data.review);
      setFeedback({
        type: "success",
        text: "Avaliação enviada e aguardando aprovação da loja.",
      });
    } catch (error) {
      setFeedback({
        type: "error",
        text: error instanceof Error ? error.message : "Não foi possível enviar sua avaliação.",
      });
    } finally {
      setSubmitting(false);
    }
  }

  return (
    <section className="mt-14 border-t border-zinc-200 pt-10 md:mt-16 md:pt-12">
      <div className="flex flex-col gap-8 lg:flex-row lg:items-start lg:justify-between">
        <div className="min-w-0">
          <h2 className="text-[1.9rem] font-semibold tracking-[-0.04em] text-zinc-950">Avaliações</h2>
          <div className="mt-3 flex flex-wrap items-center gap-x-4 gap-y-2 text-sm text-zinc-500">
            <div className="inline-flex items-center gap-2 text-zinc-950">
              <Stars value={summary.average} size={16} />
              <span className="font-semibold">{summary.average > 0 ? summary.average.toFixed(1) : "0.0"}</span>
            </div>
            <span>{reviewCount} avaliaç{reviewCount === 1 ? "ão" : "ões"}</span>
            {currentStatus && currentOwnReview?.status !== "approved" ? (
              <span className={`inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[11px] font-semibold ${currentStatus.className}`}>
                <currentStatus.icon className="h-3.5 w-3.5" />
                {currentStatus.label}
              </span>
            ) : null}
          </div>
        </div>

        <div className="w-full max-w-[420px] space-y-2">
          {summary.distribution.map((item) => (
            <div key={item.star} className="grid grid-cols-[30px_1fr_26px] items-center gap-3 text-sm">
              <div className="font-medium text-zinc-700">{item.star}★</div>
              <div className="h-2 overflow-hidden rounded-full bg-zinc-200">
                <div className="h-full rounded-full bg-zinc-900 transition-all" style={{ width: `${item.percentage}%` }} />
              </div>
              <div className="text-right text-xs text-zinc-500">{item.count}</div>
            </div>
          ))}
        </div>
      </div>

      <div className="mt-8 grid gap-10 lg:grid-cols-[minmax(0,1fr)_340px] lg:gap-12">
        <div>
          {currentApprovedReviews.length === 0 ? (
            <div className="flex items-center gap-3 border-b border-zinc-200 py-8 text-sm text-zinc-500">
              <MessageSquareText className="h-5 w-5 text-zinc-300" />
              <span>Ainda não há comentários aprovados.</span>
            </div>
          ) : (
            <div>
              {currentApprovedReviews.map((review, index) => (
                <article
                  key={review.id}
                  className={`py-5 ${index === 0 ? "pt-0" : ""} border-b border-zinc-200`}
                >
                  <div className="flex items-start gap-3">
                    <div className="flex h-11 w-11 items-center justify-center overflow-hidden rounded-full bg-zinc-100">
                      {review.client_avatar_url ? (
                        <Image
                          src={review.client_avatar_url}
                          alt={review.client_name}
                          width={44}
                          height={44}
                          className="h-11 w-11 object-cover"
                          unoptimized
                        />
                      ) : (
                        <UserCircle2 className="h-6 w-6 text-zinc-400" />
                      )}
                    </div>

                    <div className="min-w-0 flex-1">
                      <div className="flex flex-col gap-1 sm:flex-row sm:items-center sm:justify-between">
                        <div className="min-w-0">
                          <div className="truncate text-sm font-semibold text-zinc-950">{review.client_name}</div>
                          <div className="mt-1 flex flex-wrap items-center gap-2">
                            <Stars value={review.rating} size={14} />
                            <span className="text-xs text-zinc-500">{formatReviewDate(review.created_at)}</span>
                          </div>
                        </div>
                      </div>

                      <p className="mt-3 text-sm leading-6 text-zinc-700">{review.comment}</p>
                    </div>
                  </div>
                </article>
              ))}
            </div>
          )}
        </div>

        <aside className="lg:sticky lg:top-24 lg:border-l lg:border-zinc-200 lg:pl-8">
          <div className="text-lg font-semibold tracking-[-0.03em] text-zinc-950">Avaliar produto</div>

          {!loggedClient?.id ? (
            <div className="mt-4 space-y-3 rounded-2xl bg-zinc-50 p-5">
              <div className="text-sm text-zinc-600">Entre para enviar sua nota e comentário.</div>
              <Link
                href={loginHref}
                className="inline-flex h-11 items-center justify-center rounded-xl bg-zinc-950 px-5 text-sm font-semibold text-white transition hover:opacity-90"
              >
                Entrar para avaliar
              </Link>
            </div>
          ) : (
            <form className="mt-4 space-y-5" onSubmit={handleSubmit}>
              <div className="flex items-center gap-3">
                <div className="flex h-11 w-11 items-center justify-center overflow-hidden rounded-full bg-zinc-100">
                  {loggedClient.avatar_url ? (
                    <Image
                      src={loggedClient.avatar_url}
                      alt={loggedClient.name}
                      width={44}
                      height={44}
                      className="h-11 w-11 object-cover"
                      unoptimized
                    />
                  ) : (
                    <UserCircle2 className="h-6 w-6 text-zinc-400" />
                  )}
                </div>
                <div className="min-w-0">
                  <div className="truncate text-sm font-semibold text-zinc-950">{loggedClient.name}</div>
                  <div className="text-xs text-zinc-500">
                    {currentOwnReview ? "Você pode ajustar este envio antes da aprovação." : "Sua avaliação passa por aprovação."}
                  </div>
                </div>
              </div>

              <div>
                <div className="mb-2 text-sm font-medium text-zinc-900">Sua nota</div>
                <Stars value={rating} interactive onChange={setRating} size={24} />
              </div>

              <div>
                <label htmlFor="review-comment" className="mb-2 block text-sm font-medium text-zinc-900">
                  Comentário
                </label>
                <textarea
                  id="review-comment"
                  value={comment}
                  onChange={(event) => setComment(event.target.value)}
                  rows={5}
                  className="w-full rounded-2xl border border-zinc-200 bg-white px-4 py-3 text-sm text-zinc-900 outline-none transition focus:border-zinc-400"
                  placeholder="Escreva sua opinião sobre o produto."
                />
              </div>

              {feedback ? (
                <div
                  className={`rounded-2xl px-4 py-3 text-sm ${
                    feedback.type === "success" ? "bg-emerald-50 text-emerald-700" : "bg-rose-50 text-rose-700"
                  }`}
                >
                  {feedback.text}
                </div>
              ) : null}

              <button
                type="submit"
                disabled={submitting}
                className="inline-flex h-11 w-full items-center justify-center gap-2 rounded-xl bg-zinc-950 px-5 text-sm font-semibold text-white transition hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-70"
              >
                {submitting ? <Loader2 className="h-4 w-4 animate-spin" /> : <Send className="h-4 w-4" />}
                {currentOwnReview ? "Atualizar envio" : "Enviar avaliação"}
              </button>
            </form>
          )}
        </aside>
      </div>
    </section>
  );
}
