import { useState, useEffect } from "react";
import { Download, Sparkles } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
  Dialog,
  DialogContent,
  DialogDescription,
  DialogHeader,
  DialogTitle,
} from "@/components/ui/dialog";
import { Input } from "@/components/ui/input";
import { Textarea } from "@/components/ui/textarea";
import { Label } from "@/components/ui/label";
import { ScrollArea } from "@/components/ui/scroll-area";
import { useToast } from "@/hooks/use-toast";
import { ToastAction } from "@/components/ui/toast";
import { agentService, OpinionRecord } from "@/services/agent";

interface OpinionDialogProps {
  open: boolean;
  onOpenChange: (open: boolean) => void;
  selectedOpinion: OpinionRecord | null;
  onOpinionCreated: () => void;
  onOpinionCreating?: (tempOpinion: OpinionRecord) => void; // Callback para adicionar registro temporário
}

export const OpinionDialog = ({
  open,
  onOpenChange,
  selectedOpinion,
  onOpinionCreated,
  onOpinionCreating,
}: OpinionDialogProps) => {
  const [title, setTitle] = useState("");
  const [category, setCategory] = useState("");
  const [instructions, setInstructions] = useState("");
  const [isGenerating, setIsGenerating] = useState(false);
  const [createdOpinion, setCreatedOpinion] = useState<OpinionRecord | null>(null);
  const { toast } = useToast();

  useEffect(() => {
    if (selectedOpinion) {
      setTitle(selectedOpinion.titulo);
      setCategory(selectedOpinion.categoria || "");
      setInstructions(selectedOpinion.instrucoes || "");
      setCreatedOpinion(selectedOpinion);
    } else {
      setTitle("");
      setCategory("");
      setInstructions("");
      setCreatedOpinion(null);
    }
  }, [selectedOpinion, open]);

  const handleGenerate = async () => {
    if (!instructions.trim()) {
      toast({
        title: "Instruções necessárias",
        description: "Por favor, forneça instruções para gerar o parecer.",
        variant: "destructive",
      });
      return;
    }

    if (!title.trim()) {
      toast({
        title: "Título necessário",
        description: "Por favor, forneça um título para o parecer.",
        variant: "destructive",
      });
      return;
    }

    // Criar registro temporário para adicionar na tabela imediatamente
    const tempId = `temp-${Date.now()}`;
    const tempOpinion: OpinionRecord = {
      id: tempId,
      estabelecimento_id: 0,
      user_email: '',
      titulo: title,
      categoria: category,
      instrucoes: instructions,
      file_url: '',
      file_url_melhoria: '',
      created_at: new Date().toISOString(),
      status: 'processando',
      isLocalPending: true,
    };

    // Adiciona o registro temporário na tabela
    if (onOpinionCreating) {
      onOpinionCreating(tempOpinion);
    }

    // Criar toast de progresso que não fecha automaticamente
    const loadingToast = toast({
      title: "Gerando parecer jurídico...",
      description: "O parecer está sendo processado. Isso pode levar alguns minutos.",
      duration: Infinity, // Toast não fecha automaticamente
    });

    // Fecha o dialog imediatamente
    setIsGenerating(false);
    onOpenChange(false);

    // Limpa os campos
    setTitle("");
    setCategory("");
    setInstructions("");
    setCreatedOpinion(null);

    // Executar requisição em background
    try {
      const response = await agentService.createOpinion({
        titulo: tempOpinion.titulo,
        categoria: tempOpinion.categoria,
        instrucoes: tempOpinion.instrucoes,
      });

      if (response.success) {
        // Recarrega a lista para pegar o parecer real da API
        onOpinionCreated();

        // Atualizar toast para sucesso
        loadingToast.update({
          id: loadingToast.id,
          title: "Parecer gerado com sucesso!",
          description: "O parecer foi criado e está disponível para download.",
          duration: 8000, // Toast fecha após 8 segundos
          action: (
            <ToastAction altText="Fechar notificação" onClick={() => loadingToast.dismiss()}>
              OK
            </ToastAction>
          ),
        });
      } else {
        throw new Error('Falha ao criar parecer');
      }
    } catch (error: any) {
      console.error("Erro ao gerar parecer:", error);

      const errorMessage = error.message || "Não foi possível gerar o parecer. Tente novamente.";

      // Recarrega a lista para remover o registro temporário e tentar pegar dados reais
      onOpinionCreated();

      // Atualizar toast para erro
      loadingToast.update({
        id: loadingToast.id,
        title: "Erro ao gerar parecer",
        description: errorMessage,
        variant: "destructive",
        duration: 10000, // Toast de erro fecha após 10 segundos
      });
    }
  };

  const handleDownloadVersion = async (version: 'v1' | 'v2') => {
    if (!createdOpinion && !selectedOpinion) {
      toast({
        title: "Nenhum parecer disponível",
        description: "Por favor, gere um parecer primeiro.",
        variant: "destructive",
      });
      return;
    }

    const opinion = createdOpinion || selectedOpinion;
    if (!opinion) return;

    const fileUrl = version === 'v1' ? opinion.file_url : opinion.file_url_melhoria;

    if (!fileUrl) {
      toast({
        title: "Arquivo não disponível",
        description: `A ${version === 'v1' ? 'versão 1' : 'versão melhorada'} ainda não está disponível.`,
        variant: "destructive",
      });
      return;
    }

    try {
      const fileName = `${opinion.titulo}_${version === 'v1' ? 'v1' : 'melhorada'}.docx`;
      await agentService.downloadOpinion(fileUrl, fileName);

      toast({
        title: "Download iniciado",
        description: "O parecer está sendo baixado.",
      });
    } catch (error: any) {
      toast({
        title: "Erro ao fazer download",
        description: error.message || "Não foi possível baixar o arquivo.",
        variant: "destructive",
      });
    }
  };

  return (
    <Dialog open={open} onOpenChange={onOpenChange}>
      <DialogContent className="max-w-[95vw] md:max-w-4xl max-h-[90vh]">
        <DialogHeader>
          <DialogTitle>
            {selectedOpinion ? "Visualizar Parecer" : "Novo Parecer Jurídico"}
          </DialogTitle>
          <DialogDescription>
            {selectedOpinion
              ? "Visualize os detalhes do parecer e faça o download das versões disponíveis"
              : "Preencha os dados e instruções para gerar um novo parecer com IA"}
          </DialogDescription>
        </DialogHeader>

        <ScrollArea className="max-h-[calc(90vh-120px)] pr-4">
          <div className="space-y-4 py-4">
            <div className="space-y-2">
              <Label htmlFor="title">Título do Parecer *</Label>
              <Input
                id="title"
                value={title}
                onChange={(e) => setTitle(e.target.value)}
                placeholder="Ex: Análise sobre Contrato de Prestação de Serviços"
                disabled={!!selectedOpinion}
              />
            </div>

            <div className="space-y-2">
              <Label htmlFor="category">Categoria</Label>
              <Input
                id="category"
                value={category}
                onChange={(e) => setCategory(e.target.value)}
                placeholder="Ex: Direito Civil, Trabalhista, etc."
                disabled={!!selectedOpinion}
              />
            </div>

            <div className="space-y-2">
              <Label htmlFor="instructions">
                Instruções para gerar o parecer *
              </Label>
              <Textarea
                id="instructions"
                value={instructions}
                onChange={(e) => setInstructions(e.target.value)}
                placeholder="Descreva os detalhes, contexto e aspectos legais que devem ser considerados no parecer..."
                className="min-h-[150px]"
              />
            </div>

            {!selectedOpinion && (
              <Button
                onClick={handleGenerate}
                disabled={isGenerating}
                className="w-full gap-2"
              >
                {isGenerating ? (
                  <>Gerando parecer...</>
                ) : (
                  <>
                    <Sparkles className="w-4 h-4" />
                    Gerar Parecer com IA
                  </>
                )}
              </Button>
            )}

            {selectedOpinion && (
              <div className="space-y-3 pt-4 border-t">
                <Label>Downloads Disponíveis</Label>
                <div className="flex flex-col gap-2">
                  <Button
                    onClick={() => handleDownloadVersion('v1')}
                    variant="outline"
                    className="w-full gap-2 justify-start"
                    disabled={!selectedOpinion.file_url}
                  >
                    <Download className="w-4 h-4" />
                    Baixar Versão 1
                  </Button>
                  <Button
                    onClick={() => handleDownloadVersion('v2')}
                    variant="outline"
                    className="w-full gap-2 justify-start"
                    disabled={!selectedOpinion.file_url_melhoria}
                  >
                    <Download className="w-4 h-4" />
                    Baixar Versão Melhorada
                  </Button>
                </div>
              </div>
            )}
          </div>
        </ScrollArea>
      </DialogContent>
    </Dialog>
  );
};
