import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
import { of } from 'rxjs';

export interface CnaesSecundarios {
  codigo: number;
  descricao: string;
}

export interface Qsa {
  pais: string | null;
  nome_socio: string;
  codigo_pais: string | null;
  faixa_etaria: string;
  cnpj_cpf_do_socio: string;
  qualificacao_socio: string;
  codigo_faixa_etaria: number;
  data_entrada_sociedade: string;
  identificador_de_socio: number;
  cpf_representante_legal: string;
  nome_representante_legal: string;
  codigo_qualificacao_socio: number;
  qualificacao_representante_legal: string;
  codigo_qualificacao_representante_legal: number;
}

export interface RegimeTributario {
  ano: number;
  cnpj_da_scp: string | null;
  forma_de_tributacao: string;
  quantidade_de_escrituracoes: number;
}

export type NaturezaJuridica = 
  | 'Empresário (Individual)'
  | 'Microempreendedor Individual (MEI)'
  | 'Sociedade Limitada Unipessoal (SLU)'
  | 'Sociedade Limitada (LTDA)'
  | 'Sociedade Anônima (SA)'
  | 'Empresa Pública (EP)'
  | 'Empresa de Economia Mista (EMS)'
  | 'Sociedade Unipessoal (SU)';

export interface CnpjResponse {
  id: number;
  uf: string;
  cep: string;
  qsa: Qsa[];
  cnpj: string;
  pais: string | null;
  email: string | null;
  porte: string;
  bairro: string;
  numero: string;
  ddd_fax: string;
  municipio: string;
  logradouro: string;
  cnae_fiscal: number;
  codigo_pais: string | null;
  complemento: string;
  codigo_porte: number;
  razao_social: string;
  nome_fantasia: string;
  capital_social: number;
  ddd_telefone_1: string;
  ddd_telefone_2: string;
  opcao_pelo_mei: boolean | null;
  descricao_porte: string;
  codigo_municipio: number;
  cnaes_secundarios: CnaesSecundarios[];
  natureza_juridica: string;
  regime_tributario: RegimeTributario[];
  situacao_especial: string;
  opcao_pelo_simples: boolean | null;
  situacao_cadastral: number;
  data_opcao_pelo_mei: string | null;
  data_exclusao_do_mei: string | null;
  cnae_fiscal_descricao: string;
  codigo_municipio_ibge: number;
  data_inicio_atividade: string;
  data_situacao_especial: string | null;
  data_opcao_pelo_simples: string | null;
  data_situacao_cadastral: string;
  nome_cidade_no_exterior: string;
  codigo_natureza_juridica: number;
  data_exclusao_do_simples: string | null;
  motivo_situacao_cadastral: number;
  ente_federativo_responsavel: string;
  identificador_matriz_filial: number;
  qualificacao_do_responsavel: number;
  descricao_situacao_cadastral: string;
  descricao_tipo_de_logradouro: string;
  descricao_motivo_situacao_cadastral: string;
  descricao_identificador_matriz_filial: string;
  name: string;
}

@Injectable({ providedIn: 'root' })
export class CnpjService {
  private readonly baseUrl = 'https://brasilapi.com.br/api/cnpj/v1';

  constructor(private http: HttpClient) {}

  /**
   * Consulta dados da empresa pelo CNPJ
   * @param cnpj - CNPJ da empresa (com ou sem formatação)
   * @returns Observable com os dados da empresa
   */
  search(cnpj: string): Observable<CnpjResponse | null> {
    const cleanCnpj = this.cleanCnpj(cnpj);
    
    if (!this.isValidCnpj(cleanCnpj)) {
      console.warn('CNPJ inválido:', cnpj);
      return of(null);
    }

    return this.http.get<CnpjResponse>(`${this.baseUrl}/${cleanCnpj}`).pipe(
      map(response => {
        console.log('✅ Dados da empresa encontrados:', response);
        return response;
      }),
      catchError(error => {
        console.error('❌ Erro ao consultar CNPJ:', error);
        return of(null);
      })
    );
  }

  /**
   * Remove formatação do CNPJ (pontos, barras e hífens)
   * @param cnpj - CNPJ com ou sem formatação
   * @returns CNPJ apenas com números
   */
  private cleanCnpj(cnpj: string): string {
    return cnpj.replace(/\D/g, '');
  }

  /**
   * Valida se o CNPJ tem 14 dígitos
   * @param cnpj - CNPJ limpo (apenas números)
   * @returns true se válido, false caso contrário
   */
  private isValidCnpj(cnpj: string): boolean {
    return cnpj.length === 14 && /^\d{14}$/.test(cnpj);
  }

  /**
   * Formata CNPJ para exibição (XX.XXX.XXX/XXXX-XX)
   * @param cnpj - CNPJ sem formatação
   * @returns CNPJ formatado
   */
  formatCnpj(cnpj: string): string {
    const cleanCnpj = this.cleanCnpj(cnpj);
    
    if (!this.isValidCnpj(cleanCnpj)) {
      return cnpj;
    }

    return cleanCnpj.replace(
      /^(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/,
      '$1.$2.$3/$4-$5'
    );
  }

  /**
   * Extrai informações essenciais da resposta da API
   * @param response - Resposta da API do Brasil API
   * @returns Objeto com informações essenciais
   */
  extractEssentialInfo(response: CnpjResponse): {
    cnpj: string;
    name: string;
    razaoSocial: string;
    nomeFantasia: string;
    situacao: string;
    endereco: string;
    telefone: string;
    email: string;
    porte: string;
    atividade: string;
    naturezaJuridica: NaturezaJuridica | string;
    dataInicioAtividade: string;
    capitalSocial: number;
    socios: Qsa[];
    cnaeFiscal: number;
    cnaesSecundarios: string[];
    id: number;
  } | null {
    if (!response) return null;

  

    // Montar endereço completo
    const endereco = [
      response.descricao_tipo_de_logradouro,
      response.logradouro,
      response.numero,
      response.complemento,
      response.bairro,
      response.municipio,
      response.uf,
      this.formatCep(response.cep)
    ].filter(Boolean).join(', ');

    // Extrair nomes dos sócios
    const socios = response.qsa?.map(socio => socio.nome_socio) || [];

    // Extrair CNAEs secundários
    const cnaesSecundarios = response.cnaes_secundarios?.map(cnae => cnae.descricao) || [];

    return {
      id: response.id,
      cnpj: this.formatCnpj(response.cnpj),
      name: response.nome_fantasia || response.razao_social || response.name || 'Não informado',
      razaoSocial: response.razao_social || response.nome_fantasia || response.name ||'Não informado',
      nomeFantasia: response.nome_fantasia || response.razao_social || response.name || 'Não informado',
      situacao: response.descricao_situacao_cadastral || 'Não informado',
      endereco: endereco || 'Não informado',
      telefone: response.ddd_telefone_1 || 'Não informado',
      email: response.email || 'Não informado',
      porte: response.porte || 'Não informado',
      atividade: response.cnae_fiscal_descricao || 'Não informado',
      naturezaJuridica: response.natureza_juridica || 'Não informado',
      dataInicioAtividade: this.formatDate(response.data_inicio_atividade) || 'Não informado',
      capitalSocial: response.capital_social || 0,
      socios: [],
      cnaeFiscal: response.cnae_fiscal || 0,
      cnaesSecundarios: cnaesSecundarios
    };
  }

  /**
   * Formata CEP para exibição (XXXXX-XXX)
   * @param cep - CEP sem formatação
   * @returns CEP formatado
   */
  private formatCep(cep: string): string {
    if (!cep || cep.length !== 8) return cep;
    return cep.replace(/^(\d{5})(\d{3})$/, '$1-$2');
  }

  /**
   * Formata data para exibição (DD/MM/AAAA)
   * @param dateString - Data no formato AAAA-MM-DD
   * @returns Data formatada
   */
  private formatDate(dateString: string): string {
    if (!dateString) return '';
    
    try {
      const date = new Date(dateString);
      return date.toLocaleDateString('pt-BR');
    } catch {
      return dateString;
    }
  }
}
