import { Injectable } from '@angular/core';
import { MatDialog, MatDialogConfig } from '@angular/material/dialog';
import { Observable } from 'rxjs';
import {
  ConfirmDialogComponent,
  ConfirmDialogData,
} from '../components/confirm-dialog/confirm-dialog.component';
import {
  FormDialogComponent,
  FormDialogData,
} from '../components/form-dialog/form-dialog.component';

/**
 * Service centralisé pour gérer tous les modals
 * Remplace les appels directs aux modals individuels
 */
@Injectable({
  providedIn: 'root',
})
export class DialogService {
  constructor(private dialog: MatDialog) {}

  /**
   * Ouvre un modal de confirmation
   */
  confirm(data: ConfirmDialogData, config?: MatDialogConfig): Observable<boolean> {
    const dialogRef = this.dialog.open(ConfirmDialogComponent, {
      width: '500px',
      ...config,
      data,
    });

    return dialogRef.afterClosed();
  }

  /**
   * Ouvre un modal de suppression
   */
  confirmDelete(itemName: string, count: number = 1): Observable<boolean> {
    return this.confirm({
      title: 'Confirmer la suppression',
      message: `Êtes-vous sûr de vouloir supprimer ${count > 1 ? `ces ${count}` : 'cet'} ${itemName}${count > 1 ? 's' : ''} ?<br><br>Cette action est irréversible.`,
      confirmText: 'Supprimer',
      cancelText: 'Annuler',
      confirmColor: 'warn',
      type: 'warning',
    });
  }

  /**
   * Ouvre un modal d'alerte
   */
  alert(title: string, message: string): Observable<boolean> {
    return this.confirm({
      title,
      message,
      confirmText: 'OK',
      cancelText: '',
      type: 'alert',
    });
  }

  /**
   * Ouvre un modal d'erreur
   */
  error(title: string, message: string): Observable<boolean> {
    return this.confirm({
      title,
      message,
      confirmText: 'Fermer',
      cancelText: '',
      type: 'error',
    });
  }

  /**
   * Ouvre un modal de session expirée
   */
  sessionExpired(): Observable<boolean> {
    return this.confirm({
      title: 'Session expirée',
      message: 'Votre session a expiré. Veuillez vous reconnecter.',
      confirmText: 'Se reconnecter',
      cancelText: '',
      type: 'warning',
    });
  }

  /**
   * Ouvre un modal de déconnexion
   */
  confirmLogout(): Observable<boolean> {
    return this.confirm({
      title: 'Déconnexion',
      message: 'Voulez-vous vraiment vous déconnecter ?',
      confirmText: 'Déconnecter',
      cancelText: 'Annuler',
      type: 'confirm',
    });
  }

  /**
   * Ouvre un modal avec formulaire
   */
  form(data: FormDialogData, config?: MatDialogConfig): Observable<any> {
    const dialogRef = this.dialog.open(FormDialogComponent, {
      width: data.width || '600px',
      ...config,
      data,
    });

    return dialogRef.afterClosed();
  }

  /**
   * Ouvre un modal d'export de données
   */
  dataExport(): Observable<any> {
    return this.form({
      title: 'Exporter les données',
      submitText: 'Exporter',
      fields: [
        {
          name: 'format',
          label: 'Format',
          type: 'select',
          required: true,
          options: [
            { value: 'excel', label: 'Excel (.xlsx)' },
            { value: 'csv', label: 'CSV (.csv)' },
            { value: 'pdf', label: 'PDF (.pdf)' },
          ],
          value: 'excel',
        },
        {
          name: 'includeHeaders',
          label: 'Inclure les en-têtes',
          type: 'checkbox',
          value: true,
        },
        {
          name: 'dateRange',
          label: 'Période',
          type: 'select',
          options: [
            { value: 'all', label: 'Toutes les données' },
            { value: 'month', label: 'Mois en cours' },
            { value: 'year', label: 'Année en cours' },
            { value: 'custom', label: 'Personnalisée' },
          ],
          value: 'all',
        },
      ],
    });
  }

  /**
   * Ferme tous les modals
   */
  closeAll(): void {
    this.dialog.closeAll();
  }
}
