import { useState, useCallback } from 'react';
import { Models } from 'appwrite';

export interface ItemCarrinhoCompras {
  produto: Models.Document;
  quantidade: number;
  precoUnitario: number;
}

export interface UseCarrinhoComprasReturn {
  itens: ItemCarrinhoCompras[];
  total: number;
  quantidade: number;
  adicionarItem: (produto: Models.Document, quantidade?: number) => void;
  removerItem: (produtoId: string) => void;
  atualizarQuantidade: (produtoId: string, novaQuantidade: number) => void;
  limparCarrinho: () => void;
  finalizarCompra: () => Promise<boolean>;
}

export const useCarrinhoCompras = (): UseCarrinhoComprasReturn => {
  const [itens, setItens] = useState<ItemCarrinhoCompras[]>([]);

  const adicionarItem = useCallback((produto: Models.Document, quantidade = 1) => {
    // Usar os campos corretos do Appwrite - priorizar PMC, depois preço fábrica
    const precoUnitario = produto.pmc || produto.preco_fabrica || produto.preco_nf || produto["preco-unitario"] || 0;
    
    setItens(itensAtuais => {
      const itemExistente = itensAtuais.find(item => item.produto.$id === produto.$id);
      
      if (itemExistente) {
        return itensAtuais.map(item =>
          item.produto.$id === produto.$id
            ? { ...item, quantidade: item.quantidade + quantidade }
            : item
        );
      } else {
        return [...itensAtuais, { produto, quantidade, precoUnitario }];
      }
    });
  }, []);

  const removerItem = useCallback((produtoId: string) => {
    setItens(itensAtuais => itensAtuais.filter(item => item.produto.$id !== produtoId));
  }, []);

  const atualizarQuantidade = useCallback((produtoId: string, novaQuantidade: number) => {
    if (novaQuantidade <= 0) {
      removerItem(produtoId);
      return;
    }
    
    setItens(itensAtuais =>
      itensAtuais.map(item =>
        item.produto.$id === produtoId
          ? { ...item, quantidade: novaQuantidade }
          : item
      )
    );
  }, [removerItem]);

  const limparCarrinho = useCallback(() => {
    setItens([]);
  }, []);

  const finalizarCompra = useCallback(async (): Promise<boolean> => {
    try {
      // Aqui você implementaria a lógica de finalização da compra
      // Por exemplo, enviar para o backend, processar pagamento, etc.
      console.log('Finalizando compra:', itens);
      
      // Simular sucesso
      limparCarrinho();
      return true;
    } catch (error) {
      console.error('Erro ao finalizar compra:', error);
      return false;
    }
  }, [itens, limparCarrinho]);

  const total = itens.reduce((acc, item) => acc + (item.precoUnitario * item.quantidade), 0);
  const quantidade = itens.reduce((acc, item) => acc + item.quantidade, 0);

  return {
    itens,
    total,
    quantidade,
    adicionarItem,
    removerItem,
    atualizarQuantidade,
    limparCarrinho,
    finalizarCompra
  };
};