import { Injectable } from '@angular/core';
import { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog';
import { Observable } from 'rxjs';

import { CsvImporterModalComponent } from './csv-importer-modal.component';
import { CsvImporterConfig, CsvImporterModalData, ImportResult } from './csv-importer.interface';

/**
 * 🪟 CsvImporterDialogService
 * 
 * Service para facilitar a abertura do CSV Importer como modal dialog.
 * Segue o mesmo padrão do DialogService existente no projeto.
 */
@Injectable({
  providedIn: 'root'
})
export class CsvImporterDialogService {

  constructor(private dialog: MatDialog) {}

  /**
   * 📊 Abre o CSV Importer como modal
   * 
   * @param config Configuração do importador
   * @param options Opções adicionais do modal
   * @returns Observable com o resultado da importação
   */
  openCsvImporter(
    config?: Partial<CsvImporterConfig>,
    options?: {
      title?: string;
      subtitle?: string;
      width?: string;
      height?: string;
      maxWidth?: string;
      maxHeight?: string;
      disableClose?: boolean;
    }
  ): Observable<any> {
    
    // Configuração padrão para account-payable
    const defaultConfig: CsvImporterConfig = {
      maxSizeMb: 10,
      allowedExtensions: ['.csv'],
      allowMultiple: false,
      showPreview: true,
      autoUpload: false,
      validateEndpoint: 'account-payable/validate/csv',
      importEndpoint: 'account-payable/import/csv',
      modalTitle: 'Importar Contas a Pagar',
      acceptMessage: 'Arraste um arquivo CSV aqui ou clique para selecionar'
    };

    // Merge das configurações
    const finalConfig: CsvImporterConfig = {
      ...defaultConfig,
      ...config
    };

    // Dados para o modal
    const modalData: CsvImporterModalData = {
      config: finalConfig,
      title: options?.title || finalConfig.modalTitle,
      subtitle: options?.subtitle || 'Selecione um arquivo CSV para importar dados de contas a pagar'
    };

    // Configuração do dialog
    const dialogConfig: MatDialogConfig = {
      width: options?.width || '700px',
      maxWidth: options?.maxWidth || '90vw',
      maxHeight: options?.maxHeight || '90vh',
      height: options?.height || 'auto',
      data: modalData,
      panelClass: 'csv-importer-dialog-container',
      disableClose: options?.disableClose ?? true, // Evitar fechamento acidental
      hasBackdrop: true,
      backdropClass: 'csv-importer-dialog-backdrop'
    };

    // Abrir modal
    const dialogRef: MatDialogRef<CsvImporterModalComponent> = this.dialog.open(
      CsvImporterModalComponent, 
      dialogConfig
    );

    console.log('🪟 CSV Importer Modal aberto com configuração:', finalConfig);

    // Retornar observable do resultado
    return dialogRef.afterClosed();
  }

  /**
   * 📊 Método específico para Account Payable (conveniência)
   */
  openAccountPayableCsvImporter(): Observable<any> {
    return this.openCsvImporter(
      {
        validateEndpoint: 'account-payable/validate/csv',
        importEndpoint: 'account-payable/import/csv',
        modalTitle: 'Importar Contas a Pagar',
        acceptMessage: 'Selecione um arquivo CSV com os dados das contas a pagar'
      },
      {
        title: 'Importar Contas a Pagar',
        subtitle: 'Faça upload de um arquivo CSV para importar múltiplas contas',
        width: '650px'
      }
    );
  }

  /**
   * 🛠️ Método genérico para outros domínios (futuro)
   */
  openGenericCsvImporter(
    domain: string,
    options?: {
      title?: string;
      validateEndpoint?: string;
      importEndpoint?: string;
      acceptMessage?: string;
    }
  ): Observable<any> {
    return this.openCsvImporter(
      {
        validateEndpoint: options?.validateEndpoint || `${domain}/validate/csv`,
        importEndpoint: options?.importEndpoint || `${domain}/import/csv`,
        modalTitle: options?.title || `Importar ${domain}`,
        acceptMessage: options?.acceptMessage || `Selecione um arquivo CSV para importar dados de ${domain}`
      },
      {
        title: options?.title || `Importar ${domain}`,
        width: '700px'
      }
    );
  }

  /**
   * 🔍 Verifica se algum modal está aberto
   */
  hasOpenDialogs(): boolean {
    return this.dialog.openDialogs.length > 0;
  }

  /**
   * 🔒 Fecha todos os modals CSV
   */
  closeAll(): void {
    this.dialog.closeAll();
  }
} 