import { Injectable } from '@angular/core';
import { TabFormConfig, TabFormField, SubTabConfig, EntityPresetConfig, EntityFormConfiguration, GenericFormConfigOptions } from '../../../interfaces/generic-tab-form.interface';
import { Observable, of } from 'rxjs';

// 🚀 NOVA ABORDAGEM: Registry Pattern para configurações descentralizadas
type FormConfigFactory = () => TabFormConfig;

/**
 * 🎯 TabFormConfigService - REFATORADO PARA ARQUITETURA ESCALÁVEL
 * 
 * ✅ ANTES (PROBLEMA):
 * - Service gigantesco com configurações de todos os domínios
 * - Difícil manutenção e escalabilidade
 * - Responsabilidades misturadas
 * 
 * ✅ AGORA (SOLUÇÃO):
 * - Registry Pattern: Componentes registram suas próprias configurações
 * - Service apenas como fallback genérico
 * - Cada domínio é responsável por sua configuração
 * - Escalável para centenas de domínios
 * 
 * 🔄 FLUXO:
 * 1. DriversComponent.constructor() → registra configuração
 * 2. TabSystemService → solicita configuração
 * 3. TabFormConfigService → consulta registry primeiro
 * 4. Se não encontrar → usa fallback genérico
 */
@Injectable({
  providedIn: 'root'
})
export class TabFormConfigService {

  // 🎯 Registry de configurações por componente
  private formConfigRegistry: Map<string, FormConfigFactory> = new Map();

  constructor() { }

  /**
   * 🎯 Registry de configurações por componente
   * Permite que cada componente registre sua própria configuração
   */
  registerFormConfig(entityType: string, configFactory: () => TabFormConfig): void {
    this.formConfigRegistry.set(entityType, configFactory);
  }

  /**
   * 🔄 ATUALIZADO: Prioriza configurações registradas pelos componentes
   * Fallback para configurações genéricas do service
   */
  getFormConfig(entityType: string): TabFormConfig {
    // 🎯 PRIORIDADE 1: Configuração registrada pelo componente
    const registeredConfig = this.formConfigRegistry.get(entityType);
    if (registeredConfig) {
      return registeredConfig();
    }

    // 🎯 PRIORIDADE 2: Configurações genéricas do service
    switch (entityType) {
      // case 'vehicle':
      //   return this.getVehicleFormConfig();
      case 'profile':
        return this.getUserFormConfig();
      case 'client':
        return this.getClientFormConfig();
      case 'company':
        return this.getCompanyFormConfig();
      case 'product':
        return this.getProductFormConfig();
      default:
        return this.getDefaultFormConfig(entityType);
    }
  }


  /**
   * Configuração padrão para entidades não mapeadas
   */
  private getDefaultFormConfig(entityType: string): TabFormConfig {
    return {
      title: 'Dados do Item',
      entityType,
      fields: [
        {
          key: 'name',
          label: 'Nome',
          type: 'text',
          required: true
        },
        {
          key: 'description',
          label: 'Descrição',
          type: 'textarea'
        },
        {
          key: 'status',
          label: 'Status',
          type: 'select',
          options: [
            { value: 'active', label: 'Ativo' },
            { value: 'inactive', label: 'Inativo' }
          ],
          defaultValue: 'active'
        }
      ],
      submitLabel: 'Salvar',
      showCancelButton: true
    };
  }

  /**
   * Cria uma configuração personalizada
   */
  createCustomConfig(entityType: string, fields: TabFormField[], options?: Partial<TabFormConfig>): TabFormConfig {
    return {
      title: options?.title || `Dados do ${entityType}`,
      entityType,
      fields,
      submitLabel: options?.submitLabel || 'Salvar',
      cancelLabel: options?.cancelLabel || 'Cancelar',
      showCancelButton: options?.showCancelButton !== false,
      uppercase: options?.uppercase || false
    };
  }

  /**
   * Obtém as opções para um campo select baseado no tipo de entidade e campo
   */
  getSelectOptions(entityType: string, fieldKey: string): { value: any; label: string }[] {
    // Implementar lógica para buscar opções dinamicamente
    // Por exemplo, de uma API ou cache local
    return [];
  }

  /**
   * Obtém função de busca para campos select-api
   */
  getApiFetchFunction(entityType: string, fieldKey: string): ((search: string) => Observable<{ value: any; label: string }[]>) | undefined {
    // Implementar lógica para retornar função de busca API
    // baseada no tipo de entidade e campo
    return undefined;
  }

  /**
   * ========================================
   * 🚀 MÉTODOS GENÉRICOS PARA QUALQUER ENTIDADE
   * ========================================
   */

  /**
   * 🚀 REFATORADO: Retorna configuração customizada para qualquer entidade com sub-abas específicas
   * Agora prioriza configurações vindas dos componentes de domínio
   */
  getFormConfigWithSubTabs(
    entityType: string, 
    enabledSubTabs: string[] = ['dados'],
    options?: Partial<GenericFormConfigOptions>
  ): TabFormConfig {
    const baseConfig = this.getFormConfig(entityType);
    
    // 🎯 PRIORIDADE 1: Sub-abas customizadas passadas como opção
    // 🎯 PRIORIDADE 2: Sub-abas já definidas no baseConfig (vindas do componente registrado)
    // 🎯 PRIORIDADE 3: Sub-abas padrão do service (fallback)
    let availableSubTabs = options?.customSubTabs || 
                          baseConfig.subTabs || 
                          this.getDefaultSubTabsForEntity(entityType);
    
    // Filtrar apenas sub-abas habilitadas
    const filteredSubTabs = availableSubTabs.filter((tab: SubTabConfig) => 
      enabledSubTabs.includes(tab.id)
    );
    
    return {
      ...baseConfig,
      subTabs: filteredSubTabs,
      // Sobrescrever campos se especificado
      ...(options?.baseFields && { fields: options.baseFields })
    };
  }

  /**
   * 🧹 SIMPLIFICADO: Configurações pré-definidas genéricas para diferentes cenários
   */
  getFormPresets(entityType: string): EntityPresetConfig {
    // 🎯 Usar presets genéricos para todas as entidades
    // Configurações específicas agora ficam nos componentes de domínio
    return this.getGenericFormPresets(entityType);
  }

  /**
   * Abre aba com preset específico para qualquer entidade
   */
  getFormConfigByPreset(
    entityType: string, 
    preset: string
  ): TabFormConfig | null {
    const presets = this.getFormPresets(entityType);
    const presetFunction = presets[preset];
    
    if (presetFunction && typeof presetFunction === 'function') {
      return presetFunction();
    }
    
    return null;
  }

  /**
   * 🧹 SIMPLIFICADO: Retorna apenas fallback básico para entidades sem configuração específica
   * A responsabilidade das sub-abas agora está nos componentes de domínio
   */
  private getDefaultSubTabsForEntity(entityType: string): SubTabConfig[] {
    // 🎯 FALLBACK UNIVERSAL: Apenas aba básica de dados
    return [
      {
        id: 'dados',
        label: 'Dados Básicos',
        icon: 'fa-info-circle',
        enabled: true,
        order: 1
      }
    ];
  }

  /**
   * 🧹 SIMPLIFICADO: Presets genéricos - configurações específicas agora ficam nos componentes
   */
  private getGenericFormPresets(entityType: string): EntityPresetConfig {
    return {
      basic: () => this.getFormConfigWithSubTabs(entityType, ['dados']),
      complete: () => this.getFormConfig(entityType) // Usa configuração completa do componente registrado
    };
  }


  /**
   * Configuração para formulário de veículos
   */
  private getVehicleFormConfig(): TabFormConfig {
    return {
      title: 'Dados do Veículo',
      entityType: 'vehicle',
      fields: [
        {
          key: 'brand',
          label: 'Marca',
          type: 'text',
          required: true,
          placeholder: 'Ex: Toyota, Ford, Chevrolet'
        },
        {
          key: 'model',
          label: 'Modelo',
          type: 'text',
          required: true,
          placeholder: 'Ex: Corolla, Focus, Onix'
        },
        {
          key: 'year',
          label: 'Ano',
          type: 'number',
          required: true,
          placeholder: '2023'
        },
        {
          key: 'plate',
          label: 'Placa',
          type: 'text',
          required: true,
          mask: 'AAA-0000',
          placeholder: 'ABC-1234'
        },
        {
          key: 'color',
          label: 'Cor',
          type: 'text',
          placeholder: 'Ex: Branco, Preto, Prata'
        },
        {
          key: 'fuel_type',
          label: 'Tipo de Combustível',
          type: 'select',
          options: [
            { value: 'gasoline', label: 'Gasolina' },
            { value: 'ethanol', label: 'Etanol' },
            { value: 'diesel', label: 'Diesel' },
            { value: 'flex', label: 'Flex' },
            { value: 'electric', label: 'Elétrico' },
            { value: 'hybrid', label: 'Híbrido' }
          ]
        },
        {
          key: 'status',
          label: 'Status',
          type: 'select',
          options: [
            { value: 'active', label: 'Ativo' },
            { value: 'inactive', label: 'Inativo' },
            { value: 'maintenance', label: 'Em Manutenção' }
          ],
          defaultValue: 'active'
        }
      ],
      submitLabel: 'Salvar Veículo',
      showCancelButton: true
    };
  }

  /**
   * Configuração para formulário de usuários
   */
  private getUserFormConfig(): TabFormConfig {
    return {
      title: 'Dados do Usuário',
      entityType: 'user',
      fields: [
        {
          key: 'name',
          label: 'Nome Completo',
          type: 'text',
          required: true
        },
        {
          key: 'email',
          label: 'Email',
          type: 'email',
          required: true
        },
        {
          key: 'phone',
          label: 'Telefone',
          type: 'tel',
          mask: '(00) 00000-0000'
        },
        {
          key: 'role',
          label: 'Função',
          type: 'select',
          required: true,
          options: [
            { value: 'admin', label: 'Administrador' },
            { value: 'manager', label: 'Gerente' },
            { value: 'operator', label: 'Operador' },
            { value: 'viewer', label: 'Visualizador' }
          ]
        },
        {
          key: 'status',
          label: 'Status',
          type: 'select',
          options: [
            { value: 'active', label: 'Ativo' },
            { value: 'inactive', label: 'Inativo' }
          ],
          defaultValue: 'active'
        }
      ],
      submitLabel: 'Salvar Usuário',
      showCancelButton: true
    };
  }

  /**
   * Configuração para formulário de clientes
   */
  private getClientFormConfig(): TabFormConfig {
    return {
      title: 'Dados do Cliente',
      entityType: 'client',
      fields: [
        {
          key: 'name',
          label: 'Nome/Razão Social',
          type: 'text',
          required: true
        },
        {
          key: 'document',
          label: 'CPF/CNPJ',
          type: 'text',
          required: true,
          placeholder: 'Digite CPF ou CNPJ'
        },
        {
          key: 'email',
          label: 'Email',
          type: 'email',
          required: true
        },
        {
          key: 'phone',
          label: 'Telefone',
          type: 'tel',
          mask: '(00) 00000-0000'
        },
        {
          key: 'address',
          label: 'Endereço',
          type: 'textarea'
        },
        {
          key: 'client_type',
          label: 'Tipo de Cliente',
          type: 'select',
          options: [
            { value: 'individual', label: 'Pessoa Física' },
            { value: 'company', label: 'Pessoa Jurídica' }
          ],
          defaultValue: 'individual'
        }
      ],
      submitLabel: 'Salvar Cliente',
      showCancelButton: true
    };
  }

  /**
   * Configuração para formulário de empresas
   */
  private getCompanyFormConfig(): TabFormConfig {
    return {
      title: 'Dados da Empresa',
      entityType: 'company',
      fields: [
        {
          key: 'company_name',
          label: 'Razão Social',
          type: 'text',
          required: true
        },
        {
          key: 'trade_name',
          label: 'Nome Fantasia',
          type: 'text'
        },
        {
          key: 'cnpj',
          label: 'CNPJ',
          type: 'text',
          required: true,
          mask: '00.000.000/0000-00'
        },
        {
          key: 'email',
          label: 'Email',
          type: 'email',
          required: true
        },
        {
          key: 'phone',
          label: 'Telefone',
          type: 'tel',
          mask: '(00) 0000-0000'
        },
        {
          key: 'address',
          label: 'Endereço',
          type: 'textarea'
        },
        {
          key: 'contact_person',
          label: 'Pessoa de Contato',
          type: 'text'
        }
      ],
      submitLabel: 'Salvar Empresa',
      showCancelButton: true
    };
  }

  /**
   * Configuração para formulário de produtos
   */
  private getProductFormConfig(): TabFormConfig {
    return {
      title: 'Dados do Produto',
      entityType: 'product',
      fields: [
        {
          key: 'name',
          label: 'Nome do Produto',
          type: 'text',
          required: true
        },
        {
          key: 'description',
          label: 'Descrição',
          type: 'textarea',
          placeholder: 'Descrição detalhada do produto'
        },
        {
          key: 'code',
          label: 'Código',
          type: 'text',
          placeholder: 'Código interno do produto'
        },
        {
          key: 'price',
          label: 'Preço',
          type: 'number',
          placeholder: '0.00'
        },
        {
          key: 'category',
          label: 'Categoria',
          type: 'text',
          placeholder: 'Categoria do produto'
        },
        {
          key: 'status',
          label: 'Status',
          type: 'select',
          options: [
            { value: 'active', label: 'Ativo' },
            { value: 'inactive', label: 'Inativo' }
          ],
          defaultValue: 'active'
        }
      ],
      submitLabel: 'Salvar Produto',
      showCancelButton: true
    };
  }

  // ========================================
  // 🔄 MÉTODOS ESPECÍFICOS MANTIDOS PARA COMPATIBILIDADE
  // ========================================

  /**
   * ⚠️ REMOVIDOS: Métodos específicos para drivers
   * 
   * ANTES:
   * - getDriverFormConfigWithSubTabs()
   * - getDriverFormPresets()
   * 
   * AGORA: 
   * - Use DriversComponent.getDriverFormConfig() diretamente
   * - Cada domínio gerencia sua própria configuração
   * 
   * BENEFÍCIOS:
   * ✅ Arquivo menor e mais fácil de manter
   * ✅ Responsabilidade no local correto  
   * ✅ Escalabilidade para novos domínios
   * ✅ Redução de acoplamento
   */
} 