/**
 * Serviço para gerenciar produtos de venda via BFF
 * Integração com https://bff-dev.saveinmed.com.br/api/v1/produtos-venda
 */

const BFF_BASE_URL = process.env.NEXT_PUBLIC_BFF_API_URL!;

export interface ProdutoVendaResponse {
  id: string;
  catalogo_id: string;
  nome: string;
  preco_venda: number;
  observacoes?: string;
  data_validade?: string;
  empresa_id: string;
  createdAt: string;
  updatedAt: string;
}

export interface ProdutoCatalogoResponse {
  $id: string;
  descricao: string;
  nome?: string;
  "codigo-interno"?: string;
  "codigo-ean"?: string;
  "principio-ativo"?: string;
  concentracao?: string;
  "forma-farmaceutica"?: string;
  "registro-anvisa"?: string;
  prescricao?: string;
  observacoes?: string;
  laboratorios?: any;
  categorias?: any;
  "preco-base"?: number;
}

export interface ProdutoVendaData {
  id: string;
  catalogo_id: string;
  nome: string;
  descricao?: string;
  codigo_ean?: string;
  codigo_interno?: string;
  preco_base?: number;
  preco_venda: number;
  laboratorio?: string;
  categoria?: string;
  lab_nome?: string;
  cat_nome?: string;
  observacoes?: string;
  data_validade?: string;
  principio_ativo?: string;
  concentracao?: string;
  forma_farmaceutica?: string;
  registro_anvisa?: string;
  prescricao?: string;
}

export interface ApiResponse<T = any> {
  success: boolean;
  data?: T;
  error?: string;
}

export const produtoVendaService = {
  /**
   * Obtém o token de autenticação do localStorage
   */
  getAuthToken: (): string | null => {
    return localStorage.getItem('access_token');
  },

  /**
   * Busca dados do catálogo de produtos por ID
   */
  buscarCatalogoPorId: async (catalogoId: string): Promise<ProdutoCatalogoResponse | null> => {
    try {
      const token = produtoVendaService.getAuthToken();
      if (!token) {
        console.error('❌ Token de autenticação não encontrado');
        return null;
      }


      const response = await fetch(`${BFF_BASE_URL}/produtos-catalogo/${catalogoId}`, {
        method: 'GET',
        headers: {
          'accept': 'application/json',
          'Authorization': `Bearer ${token}`,
        },
      });

      if (response.ok) {
        const data = await response.json();
        return data;
      } else {
        const errorData = await response.json();
        console.error('❌ Erro ao buscar produto do catálogo:', errorData);
        return null;
      }
    } catch (error) {
      console.error('💥 Erro ao buscar produto do catálogo:', error);
      return null;
    }
  },

  /**
   * Busca um produto de venda por ID e complementa com dados do catálogo
   */
  buscarPorId: async (produtoId: string): Promise<ProdutoVendaData | null> => {
    try {
      const token = produtoVendaService.getAuthToken();
      if (!token) {
        console.error('❌ Token de autenticação não encontrado');
        return null;
      }


      // 1. Buscar dados do produto de venda
      const vendaResponse = await fetch(`${BFF_BASE_URL}/produtos-venda/${produtoId}`, {
        method: 'GET',
        headers: {
          'accept': 'application/json',
          'Authorization': `Bearer ${token}`,
        },
      });

      if (!vendaResponse.ok) {
        const errorData = await vendaResponse.json();
        console.error('❌ Erro ao buscar produto de venda:', errorData);
        return null;
      }

      const produtoVenda: ProdutoVendaResponse = await vendaResponse.json();

      // 2. Buscar dados complementares do catálogo
      let produtoCatalogo: ProdutoCatalogoResponse | null = null;
      if (produtoVenda.catalogo_id) {
        produtoCatalogo = await produtoVendaService.buscarCatalogoPorId(produtoVenda.catalogo_id);
      }

      // 3. Combinar os dados
      const produtoCompleto: ProdutoVendaData = {
        id: produtoVenda.id,
        catalogo_id: produtoVenda.catalogo_id,
        nome: produtoVenda.nome || produtoCatalogo?.nome || 'Produto sem nome',
        descricao: produtoCatalogo?.descricao || '',
        codigo_ean: produtoCatalogo?.['codigo-ean'] || '',
        codigo_interno: produtoCatalogo?.['codigo-interno'] || '',
        preco_base: produtoCatalogo?.['preco-base'] || 0,
        preco_venda: produtoVenda.preco_venda,
        laboratorio: produtoCatalogo?.laboratorios || '',
        categoria: produtoCatalogo?.categorias || '',
        lab_nome: '', // Será preenchido se necessário
        cat_nome: '', // Será preenchido se necessário
        observacoes: produtoVenda.observacoes,
        data_validade: produtoVenda.data_validade,
        principio_ativo: produtoCatalogo?.['principio-ativo'] || '',
        concentracao: produtoCatalogo?.concentracao || '',
        forma_farmaceutica: produtoCatalogo?.['forma-farmaceutica'] || '',
        registro_anvisa: produtoCatalogo?.['registro-anvisa'] || '',
        prescricao: produtoCatalogo?.prescricao || '',
      };

      return produtoCompleto;

    } catch (error) {
      console.error('💥 Erro ao buscar produto de venda:', error);
      return null;
    }
  },

  /**
   * Busca múltiplos produtos de venda por IDs
   */
  buscarMultiplosPorIds: async (produtoIds: string[]): Promise<ProdutoVendaData[]> => {
    try {

      const produtosPromises = produtoIds.map(id => produtoVendaService.buscarPorId(id));
      const produtosResults = await Promise.all(produtosPromises);

      const produtosValidos = produtosResults.filter(produto => produto !== null) as ProdutoVendaData[];

      return produtosValidos;

    } catch (error) {
      console.error('💥 Erro ao buscar múltiplos produtos de venda:', error);
      return [];
    }
  }
};