import { Component, ChangeDetectorRef } from "@angular/core";
import { CommonModule, DatePipe } from "@angular/common";

import { TitleService } from "../../shared/services/theme/title.service";
import { HeaderActionsService } from "../../shared/services/header-actions.service";
import { SupplierService } from "./supplier.service";
import { Supplier, SupplierType, SupplierGender, SupplierSegment, SupplierTag } from "./supplier.interface";

import { TabSystemComponent } from "../../shared/components/tab-system/tab-system.component";
import { BaseDomainComponent, DomainConfig } from "../../shared/components/base-domain/base-domain.component";
import { TabFormConfig } from "../../shared/interfaces/generic-tab-form.interface";
import { TabFormConfigService } from "../../shared/components/tab-system/services/tab-form-config.service";
import { PersonService } from '../../shared/services/person.service';
import { Person } from '../../shared/interfaces/person.interface';
import { Observable } from "rxjs";

/**
 * 🎯 SupplierComponent - Gestão de Fornecedores
 * 
 * ✨ Implementa BaseDomainComponent + Registry Pattern
 * 🚀 Auto-registro de configurações para escalabilidade infinita!
 * 
 * 🆕 V2.0 Features:
 * - Tabela completa com todos os campos da API
 * - Formulário organizado em sub-abas lógicas
 * - Enums para validação de dados
 * - Dashboard Tab habilitado
 */
@Component({
  selector: 'app-supplier',
  standalone: true,
  imports: [CommonModule, TabSystemComponent],
  providers: [DatePipe],
  templateUrl: './supplier.component.html',
  styleUrl: './supplier.component.scss'
})
export class SupplierComponent extends BaseDomainComponent<Supplier> {

  constructor(
    private supplierService: SupplierService,
    titleService: TitleService,
    headerActionsService: HeaderActionsService,
    cdr: ChangeDetectorRef,
    private datePipe: DatePipe,
    private tabFormConfigService: TabFormConfigService,
    private personService: PersonService
  ) {
    super(titleService, headerActionsService, cdr, supplierService);
    this.registerFormConfig();
  }

  private registerFormConfig(): void {
    this.tabFormConfigService.registerFormConfig('supplier', () => this.getFormConfig());
  }

  // ========================================
  // 🎯 CONFIGURAÇÃO DO DOMÍNIO SUPPLIER
  // ========================================
  protected override getDomainConfig(): DomainConfig {
    return {
      domain: 'supplier',
      title: 'Fornecedores',
      entityName: 'fornecedor',
      pageSize: 50,
      subTabs: ['dados', 'endereco', 'financeiro', 'documentos'],
      showDashboardTab: true, // ✅ Dashboard habilitado
      filterConfig: {
        dateRangeFilter: false,
        companyFilter: false,
        specialFilters: [
          {
            id: 'name',
            label: 'Nome do Fornecedor',
            type: 'custom-select',
            config: {
              searchField: 'name', // Campo que será enviado para API
              placeholder: 'Buscar por nome...',
              minLength: 2
            }
          },
          {
            id: 'cpf',
            label: 'CPF',
            type: 'custom-select',
            config: {
              searchField: 'cpf', // Campo CPF individual
              placeholder: 'Digite o CPF (000.000.000-00)...',
              mask: '000.000.000-00',
              minLength: 11
            }
          },
          {
            id: 'cnpj',
            label: 'CNPJ',
            type: 'custom-select',
            config: {
              searchField: 'cnpj', // Campo CNPJ individual
              placeholder: 'Digite o CNPJ (00.000.000/0000-00)...',
              mask: '00.000.000/0000-00',
              minLength: 14
            }
          }
        ]
      },
      dashboardConfig: {
        title: 'Dashboard de Fornecedores',
        customKPIs: [
          {
            id: 'active-suppliers',
            label: 'Fornecedores Ativos',
            value: '85%',
            icon: 'fas fa-check-circle',
            color: 'success',
            trend: 'up',
            change: '+3%'
          },
          {
            id: 'blacklisted-suppliers',
            label: 'Lista Negra',
            value: '2%',
            icon: 'fas fa-exclamation-triangle',
            color: 'warning',
            trend: 'down',
            change: '-1%'
          }
        ]
      },
      columns: [
        { 
          field: "id", 
          header: "Id", 
          sortable: true,   
          filterable: true, 
          searchType: "number"
        },
        { 
          field: "name", 
          header: "Nome", 
          sortable: true,
          search: true, 
          filterable: true, 
          searchType: "text"
        },
        {
          field: "type",
          header: "Tipo pessoa",
          sortable: true,
          filterable: true,
          searchType: "select",
          searchOptions: [
            { value: 'Individual', label: 'Física' },
            { value: 'Busi', label: 'Jurídica' }  
          ],
          label: (value: any) => {
            return value === 'Individual' ? 'Física' : 'Jurídica';
          }
        },
        {
          field: "cnpj",
          header: "CNPJ",
          sortable: true,
          filterable: true,
          search: true,
          searchType: "text"
        },
        {
          field: "segment",
          header: "Segmentos",
          sortable: false,
          filterable: true,
          allowHtml: false,
          label: (value: any) => {
            if (!value || !Array.isArray(value)) return '-';
            return value.map((seg: string) => this.translateSegment(seg)).join(', ');
          }
        },
        {
          field: "tags",
          header: "Tags",
          sortable: false,
          filterable: true,
          allowHtml: false,
          label: (value: any) => {
            if (!value || !Array.isArray(value)) return '-';
            return value.map((tag: string) => this.translateTag(tag)).join(', ');
          }
        },
        {
          field: "is_active",
          header: "Status",
          sortable: true,
          filterable: true,
          allowHtml: true,
          searchType: "select",
          searchOptions: [
            { value: 'true', label: 'Ativo' },
            { value: 'false', label: 'Inativo' }
          ],
          label: (value: any) => {
            const isActive = value === true || value === 'true';
            const statusClass = isActive ? 'status-success' : 'status-danger';
            const statusLabel = isActive ? 'ATIVO' : 'INATIVO';
            const statusIcon = isActive ? 'fas fa-check-circle' : 'fas fa-times-circle';
            return `<span class="status-badge ${statusClass}"><i class="${statusIcon}"></i> ${statusLabel}</span>`;
          }
        },
        // {
        //   field: "rating",
        //   header: "Avaliação",
        //   sortable: true,
        //   filterable: true,
        //   searchType: "number",
        //   label: (value: any) => {
        //     if (value === null || value === undefined) return '-';
        //     return `${value}/5 ⭐`;
        //   }
        // },
        {
          field: "credit_limit",
          header: "Limite Crédito",
          sortable: true,
          filterable: true,
          searchType: "number",
          label: (value: any) => {
            if (value === null || value === undefined) return '-';
            return `R$ ${value.toLocaleString('pt-BR')}`;
          }
        },
        {
          field: "createdAt",
          header: "Criado em",
          sortable: true,
          filterable: true,
          searchType: "date",
          label: (date: any) => this.datePipe.transform(date, "dd/MM/yyyy HH:mm") || "-"
        }
      ]
    };
  }

  // ========================================
  // 📋 CONFIGURAÇÃO COMPLETA DO FORMULÁRIO
  // ========================================
  getFormConfig(): TabFormConfig {
    return {
      title: 'Dados do Fornecedor',
      entityType: 'supplier',
      fields: [
        {
          key: 'personId',
          label: 'Person ID (Interno)',
          type: 'text', 
          required: false,
          readOnly: true, 
          placeholder: 'ID interno da pessoa (preenchido automaticamente)'
        }
      ],
      submitLabel: 'Salvar Fornecedor',
      showCancelButton: true,
      subTabs: [
        {
          id: 'dados',
          label: 'Dados Básicos',
          icon: 'fa-info-circle',
          enabled: true,
          order: 1,
          templateType: 'fields',
          requiredFields: ['name', 'type', 'cnpj', 'segment', 'tags', 'is_active'],
          fields: [
            {
              key: 'name',
              label: 'Nome Completo',
              type: 'text',
              required: true,
              placeholder: 'Digite o nome completo'
            },
            {
              key: 'type',
              label: 'Tipo',
              type: 'select',
              required: true,
              options: [
                { value: 'Individual', label: 'Pessoa Física' },
                { value: 'Business', label: 'Pessoa Jurídica' }
              ],
              onValueChange: (value: string, formGroup: any) => {
                // 🎯 Validação condicional: Limpa campos opostos baseado no tipo selecionado
                if (value === 'Individual') {
                  // Se tipo Individual: limpa CNPJ e torna CPF obrigatório
                  if (formGroup.get('cnpj')) {
                    formGroup.get('cnpj').setValue('');
                  }
                } else if (value === 'Business') {
                  // Se tipo Business: limpa CPF e torna CNPJ obrigatório
                  if (formGroup.get('cpf')) {
                    formGroup.get('cpf').setValue('');
                  }
                }
              }
            },
            {
              key: 'gender',
              label: 'Gênero',
              type: 'select',
              required: false,
              options: [
                { value: 'male', label: 'Masculino' },
                { value: 'female', label: 'Feminino' },
                { value: 'other', label: 'Outro' }
              ]
            },
            {
              key: 'birth_date',
              label: 'Data de Nascimento',
              type: 'date',
              required: false
            },
            {
              key: 'cnpj',
              label: 'CNPJ',
              type: 'text',
              required: false,
              placeholder: '00.000.000/0000-00',
              mask: '00.000.000/0000-00',
              conditional: {
                field: 'type',
                value: 'Business'
              },
              onValueChange: (value: string, formGroup: any) => {
                // 🔍 Busca automática de pessoa por CNPJ quando valor é alterado
                const cleanCnpj = value?.replace(/\D/g, '') || '';
                if (cleanCnpj.length === 14) {
                  this.searchPersonByDocument(value, 'cnpj', formGroup);
                }
              }
            },
            {
              key: 'cpf',
              label: 'CPF',
              type: 'text',
              required: false,
              placeholder: '000.000.000-00',
              mask: '000.000.000-00',
              conditional: {
                field: 'type',
                value: 'Individual'
              },
              onValueChange: (value: string, formGroup: any) => {
                // 🔍 Busca automática de pessoa por CPF quando valor é alterado
                const cleanCpf = value?.replace(/\D/g, '') || '';
                if (cleanCpf.length === 11) {
                  this.searchPersonByDocument(value, 'cpf', formGroup);
                }
              }
            },
            {
              key: 'phone',
              label: 'Telefone',
              type: 'text',
              required: false,
              placeholder: '(00) 00000-0000',
              mask: '(00) 00000-0000'
            },
            {
              key: 'email',
              label: 'E-mail',
              type: 'email',
              required: false,
              placeholder: 'exemplo@email.com'
            },
            {
              key: 'segment',
              label: 'Segmentos de Atuação',
              type: 'multi-select',
              required: true,
              options: [
                { value: 'officine', label: 'Oficinas' },
                { value: 'finance', label: 'Financeiro' },
                { value: 'transport', label: 'Transporte' },
                { value: 'tech', label: 'Tecnologia' },
                { value: 'alimentation', label: 'Alimentação' },
                { value: 'insurance', label: 'Seguros' },
                { value: 'legal', label: 'Jurídico' },
                { value: 'logistics', label: 'Logística' },
                { value: 'marketing', label: 'Marketing' },
                { value: 'medical', label: 'Médico' },
                { value: 'publicservice', label: 'Serviços Públicos' },
                { value: 'gasstation', label: 'Posto de Gasolina' },
                { value: 'other', label: 'Outros' }
              ]
            },
            {
              key: 'tags',
              label: 'Tags/Categorias',
              type: 'multi-select',
              required: true,
              options: [
                { value: 'bank', label: 'Banco' },
                { value: 'sdc', label: 'SDC' },
                { value: 'app', label: 'Aplicativo' },
                { value: 'ia', label: 'Inteligência Artificial' },
                { value: 'other', label: 'Outros' }
              ]
            },
            {
              key: 'is_active',
              label: 'Status',
              type: 'select',
              required: true,
              options: [
                { value: true, label: 'Ativo' },
                { value: false, label: 'Inativo' }
              ]
            },
            {
              key: 'is_blacklisted',
              label: 'Bloqueado',
              type: 'select',
              required: false,
              options: [
                { value: false, label: 'Não' },
                { value: true, label: 'Sim' }
              ]
            },
            {
              key: 'blacklist_reason',
              label: 'Motivo do Bloqueio',
              type: 'text',
              required: false,
              placeholder: 'Motivo do bloqueio'
            }
          ]
        },
        {
          id: 'endereco',
          label: 'Endereço',
          icon: 'fa-map-marker-alt',
          enabled: true,
          order: 2,
          templateType: 'fields',
          requiredFields: ['address_number'],
          fields: [
            {
              key: 'address_cep',
              label: 'CEP',
              type: 'text',
              required: false,
              placeholder: '00000-000',
              mask: '00000-000'
            },
            {
              key: 'address_street',
              label: 'Rua',
              type: 'text',
              required: false,
              placeholder: 'Será preenchido automaticamente',
              readOnly: true
            },
            {
              key: 'address_neighborhood',
              label: 'Bairro',
              type: 'text',
              required: false,
              placeholder: 'Será preenchido automaticamente',
              readOnly: true
            },
            {
              key: 'address_city',
              label: 'Cidade',
              type: 'text',
              required: false,
              placeholder: 'Será preenchido automaticamente',
              readOnly: true
            },
            {
              key: 'address_uf',
              label: 'Estado (UF)',
              type: 'text',
              required: false,
              placeholder: 'Será preenchido automaticamente',
              readOnly: true
            },
            {
              key: 'address_number',
              label: 'Número',
              type: 'text',
              required: false,
              placeholder: 'Digite o número'
            },
            {
              key: 'address_complement',
              label: 'Complemento',
              type: 'text',
              required: false,
              placeholder: 'Apartamento, sala, etc.'
            }
          ]
        },
        {
          id: 'financeiro',
          label: 'Financeiro',
          icon: 'fa-dollar-sign',
          enabled: true,
          order: 3,
          templateType: 'fields',
          requiredFields: [],
          fields: [
            {
              key: 'rating',
              label: 'Avaliação',
              type: 'number',
              required: false,
              min: 0,
              max: 5,
              placeholder: '0-5'
            },
            {
              key: 'credit_limit',
              label: 'Limite de Crédito',
              type: 'number',
              required: false,
              min: 0,
              placeholder: 'R$ 0,00'
            },
            {
              key: 'payment_terms',
              label: 'Condições de Pagamento',
              type: 'text',
              required: false,
              placeholder: 'Ex: 30/60/90 dias'
            },
            {
              key: 'contract_number',
              label: 'Número do Contrato',
              type: 'text',
              required: false,
              placeholder: 'Digite o número do contrato'
            },
            {
              key: 'pix_key',
              label: 'Chave PIX',
              type: 'text',
              required: false,
              placeholder: 'Digite a chave PIX'
            }
          ]
        },

        {
          id: 'documentos',
          label: 'Documentos',
          icon: 'fa-file-alt',
          enabled: true,
          order: 4,
          templateType: 'fields',
          requiredFields: [],
          fields: [
            {
              key: 'license_number',
              label: 'Número da Licença',
              type: 'text',
              required: false,
              placeholder: 'Digite o número da licença'
            },
            {
              key: 'license_expires',
              label: 'Data de Expiração da Licença',
              type: 'date',
              required: false
            },
            {
              key: 'notes',
              label: 'Observações',
              type: 'textarea',
              required: false,
              placeholder: 'Digite observações adicionais'
            }
          ]
        }
      ]
    };
  }

  // ========================================
  // 🌐 MÉTODOS DE TRADUÇÃO PARA SEGMENTOS E TAGS
  // ========================================


  private translateSegment(segment: string): string {
    const segmentTranslations: { [key: string]: string } = {
      'officine': 'Oficinas',
      'finance': 'Financeiro',
      'transport': 'Transporte',
      'tech': 'Tecnologia',
      'alimentation': 'Alimentação',
      'insurance': 'Seguros',
      'legal': 'Jurídico',
      'logistics': 'Logística',
      'marketing': 'Marketing',
      'medical': 'Médico',
      'publicservice': 'Serviços Públicos',
      'gasstation': 'Posto de Gasolina',
      'other': 'Outros'
    };
    return segmentTranslations[segment] || segment;
  }

  private translateTag(tag: string): string {
    const tagTranslations: { [key: string]: string } = {
      'bank': 'Banco',
      'sdc': 'SDC',
      'app': 'Aplicativo',
      'ia': 'Inteligência Artificial',
      'other': 'Outros'
    };
    return tagTranslations[tag] || tag;
  }


  protected override getNewEntityData(): Partial<Supplier> {
    return {
      name: '',
      email: '',
      gender: SupplierGender.MALE,
      type: SupplierType.INDIVIDUAL,
      segment: [],
      tags: [],
      is_active: true,
      is_blacklisted: false,
      personId: undefined, 
    };
  }

  // ========================================
  // 🔍 BUSCA DE PESSOA POR DOCUMENTO (CPF OU CNPJ)
  // ========================================
  /**
   * 🎯 Busca pessoa por documento (CPF ou CNPJ) e preenche automaticamente os campos do formulário
   * Usado quando o usuário digita um documento no campo CPF ou CNPJ do novo fornecedor
   * 
   * @param document CPF ou CNPJ da pessoa (pode incluir formatação)
   * @param documentType Tipo do documento: 'cpf' ou 'cnpj'
   * @param formGroup FormGroup do formulário para preenchimento automático
   */
  searchPersonByDocument(document: string, documentType: 'cpf' | 'cnpj', formGroup: any): void {
    const cleanDocument = document.replace(/\D/g, '');
    const isValidLength = (documentType === 'cpf' && cleanDocument.length === 11) || 
                         (documentType === 'cnpj' && cleanDocument.length === 14);
    if (!isValidLength) {
      return;
    }

    this.personService.searchByDocument(cleanDocument, documentType).subscribe({
      next: (response) => {
        // Se encontrou pessoa, preenche os campos automaticamente
        if (response.data && response.data.length > 0) {
          const person: Person = response.data[0];
          
          const supplierData = this.mapPersonToSupplier(person);

          Object.keys(supplierData).forEach(key => {
            const supplierKey = key as keyof typeof supplierData;
            const value = supplierData[supplierKey];
            if (formGroup.get(key) && value !== null && value !== undefined) {
              formGroup.get(key).setValue(value);
            }
          });
        }
      },
      error: (error) => {
        console.error(`❌ Erro ao buscar pessoa por ${documentType.toUpperCase()}:`, error);
      }
    });
  }

  /**
   * 🔄 Mapeia dados de Person para Supplier
   * Converte os campos da interface Person para os campos esperados na interface Supplier
   * Inclui o person_id para referência
   * 
   * @param person Dados da pessoa encontrada
   * @returns Dados formatados para o supplier
   */
  private mapPersonToSupplier(person: Person): Partial<Supplier> {
    return {
      // 🆔 Mantém referência à pessoa original (salvo no backend, não mostrado no front)
      personId: person.id, 
      
      // 👤 Dados pessoais
      name: person.name || '',
      email: person.email || '',
      cpf: person.cpf || '',
      cnpj: person.cnpj || '',
      birth_date: person.birth_date.toISOString() || '',
      gender: person.gender as SupplierGender || undefined,
      phone: person.phone || '',
      father_name: person.father_name || '',
      mother_name: person.mother_name || '',
      pix_key: person.pix_key || '',
      
      // 🏠 Dados de endereço
      address_street: person.address_street || '',
      address_city: person.address_city || '',
      address_cep: person.address_cep || '',
      address_uf: person.address_uf || '',
      address_number: person.address_number || '',
      address_complement: person.address_complement || '',
      address_neighborhood: person.address_neighborhood || '',
      
      // 📝 Observações
      notes: person.notes || '',
      
      // 📸 Fotos (mantém como number[])
      photoIds: person.photoIds || [],
      
      // 🏢 Campos específicos de fornecedor (mantém vazios para preenchimento manual)
      type: SupplierType.INDIVIDUAL,
      segment: [],
      tags: [],
      is_active: true,
      is_blacklisted: false,
      rating: 0,
      credit_limit: 0
    };
  }

  // ========================================
  // 🎯 VALIDAÇÃO E PROCESSAMENTO DE DADOS
  // ========================================
  /**
   * 🔒 Processa dados do fornecedor antes do envio para o backend
   * Implementa validação: se tipo for BUSINESS, não envia CPF; se INDIVIDUAL, não envia CNPJ
   * 
   * @param data Dados do formulário
   * @returns Dados processados e validados
   */
  private processSupplierData(data: any): any {
    const processedData = { ...data };
    
    // 🎯 VALIDAÇÃO: Controle de CPF/CNPJ baseado no tipo
    if (data.type === SupplierType.BUSINESS) {
      // ✅ Tipo Business: Remove CPF, mantém CNPJ
      delete processedData.cpf;
      console.log('🔒 Tipo Business: CPF removido, CNPJ mantido');
    } else if (data.type === SupplierType.INDIVIDUAL) {
      // ✅ Tipo Individual: Remove CNPJ, mantém CPF
      delete processedData.cnpj;
      console.log('🔒 Tipo Individual: CNPJ removido, CPF mantido');
    }
    
    console.log('✅ Dados processados para envio:', processedData);
    return processedData;
  }

  // ========================================
  // 🚀 SOBRESCRITA DOS MÉTODOS DE SALVAMENTO
  // ========================================
  /**
   * 🎯 Cria novo fornecedor com validação de CPF/CNPJ
   * Sobrescreve método da BaseDomainComponent para aplicar regras específicas
   */
  protected override createEntity(data: any): Observable<any> | null {
    const processedData = this.processSupplierData(data);
    return this.supplierService.create(processedData);
  }

  /**
   * 🎯 Atualiza fornecedor existente com validação de CPF/CNPJ
   * Sobrescreve método da BaseDomainComponent para aplicar regras específicas
   */
  protected override updateEntity(id: any, data: any): Observable<any> | null {
    const processedData = this.processSupplierData(data);
    return this.supplierService.update(id, processedData);
  }
}