import { FilterConfig } from '../interfaces/domain-filter.interface';

/**
 * 🛠️ Domain Filter Utils - Utilitários para configuração de filtros
 * 
 * ✨ Facilita a configuração de filtros padrão nos domínios
 */
export class DomainFilterUtils {

  /**
   * 🗓️ Configuração padrão para filtros com período (date_start/date_end)
   * 
   * @param customConfig Configurações adicionais
   * @returns FilterConfig com filtro de período habilitado
   */
  static withDateRange(customConfig?: Partial<FilterConfig>): FilterConfig {
    return {
      dateRangeFilter: true,
      companyFilter: true,
      ...customConfig
    };
  }

  /**
   * 🏢 Configuração padrão apenas com filtro de empresa
   * 
   * @param customConfig Configurações adicionais
   * @returns FilterConfig apenas com empresa
   */
  static companyOnly(customConfig?: Partial<FilterConfig>): FilterConfig {
    return {
      dateRangeFilter: false,
      companyFilter: true,
      ...customConfig
    };
  }

  /**
   * 🎯 Configuração básica sem filtros especiais
   * 
   * @param customConfig Configurações adicionais
   * @returns FilterConfig básica
   */
  static basic(customConfig?: Partial<FilterConfig>): FilterConfig {
    return {
      dateRangeFilter: false,
      companyFilter: false,
      ...customConfig
    };
  }

  /**
   * 📊 Configuração completa com todos os filtros padrão
   * 
   * @param customConfig Configurações adicionais
   * @returns FilterConfig completa
   */
  static complete(customConfig?: Partial<FilterConfig>): FilterConfig {
    return {
      dateRangeFilter: true,
      companyFilter: true,
      specialFilters: [],
      defaultFilters: [],
      ...customConfig
    };
  }
}

/**
 * 🎯 Helpers rápidos para configurações comuns
 */
export const FilterPresets = {
  
  /**
   * 🚚 Para domínios de veículos/transporte (com período)
   */
  transport: () => DomainFilterUtils.withDateRange(),

  /**
   * 💰 Para domínios financeiros (com período)
   */
  financial: () => DomainFilterUtils.withDateRange(),

  /**
   * 👥 Para domínios de pessoas (sem período)
   */
  people: () => DomainFilterUtils.companyOnly(),

  /**
   * 📋 Para domínios de cadastro (básico)
   */
  registry: () => DomainFilterUtils.basic(),

  /**
   * 📊 Para relatórios (completo)
   */
  reports: () => DomainFilterUtils.complete()
};

/**
 * 🔧 Validadores para filtros de data
 */
export class DateFilterValidators {
  
  /**
   * ✅ Verificar se o range de datas é válido
   */
  static isValidDateRange(startDate?: string, endDate?: string): boolean {
    if (!startDate || !endDate) return true;
    
    const start = new Date(startDate);
    const end = new Date(endDate);
    
    return start <= end;
  }

  /**
   * 📅 Formatar data para API (YYYY-MM-DD)
   */
  static formatForApi(date: string): string {
    if (!date) return '';
    
    if (/^\d{4}-\d{2}-\d{2}$/.test(date)) {
      return date;
    }
    
    const dateObj = new Date(date);
    if (isNaN(dateObj.getTime())) {
      return date;
    }
    
    return dateObj.toISOString().split('T')[0];
  }
} 