import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';

export interface ConfirmationConfig {
  title: string;
  message: string;
  confirmText?: string;
  cancelText?: string;
  type?: 'warning' | 'danger' | 'info' | 'success';
  icon?: string;
  showIcon?: boolean;
}

export interface ConfirmationState {
  isVisible: boolean;
  config: ConfirmationConfig | null;
  resolve: ((value: boolean) => void) | null;
}

@Injectable({
  providedIn: 'root'
})
export class ConfirmationService {
  private stateSubject = new BehaviorSubject<ConfirmationState>({
    isVisible: false,
    config: null,
    resolve: null
  });

  public state$ = this.stateSubject.asObservable();

  constructor() { }

  /**
   * Mostra um diálogo de confirmação elegante
   */
  confirm(config: ConfirmationConfig): Promise<boolean> {
    return new Promise((resolve) => {
      const fullConfig: ConfirmationConfig = {
        confirmText: 'Confirmar',
        cancelText: 'Cancelar',
        type: 'warning',
        showIcon: true,
        icon: this.getDefaultIcon(config.type || 'warning'),
        ...config
      };

      this.stateSubject.next({
        isVisible: true,
        config: fullConfig,
        resolve
      });
    });
  }

  /**
   * Confirma a ação
   */
  confirmAction(): void {
    const currentState = this.stateSubject.value;
    if (currentState.resolve) {
      currentState.resolve(true);
    }
    this.close();
  }

  /**
   * Cancela a ação
   */
  cancelAction(): void {
    const currentState = this.stateSubject.value;
    if (currentState.resolve) {
      currentState.resolve(false);
    }
    this.close();
  }

  /**
   * Fecha o diálogo
   */
  private close(): void {
    this.stateSubject.next({
      isVisible: false,
      config: null,
      resolve: null
    });
  }

  /**
   * Obtém ícone padrão baseado no tipo
   */
  private getDefaultIcon(type: string): string {
    const icons = {
      'warning': 'fa-exclamation-triangle',
      'danger': 'fa-exclamation-circle',
      'info': 'fa-info-circle',
      'success': 'fa-check-circle'
    };
    return icons[type as keyof typeof icons] || 'fa-question-circle';
  }

  /**
   * Métodos de conveniência para diferentes tipos de confirmação
   */
  
  confirmDelete(itemName: string): Promise<boolean> {
    return this.confirm({
      title: 'Confirmar Exclusão',
      message: `Tem certeza que deseja excluir "${itemName}"? Esta ação não pode ser desfeita.`,
      confirmText: 'Excluir',
      cancelText: 'Cancelar',
      type: 'danger',
      icon: 'fa-trash'
    });
  }

  confirmUnsavedChanges(tabName: string): Promise<boolean> {
    return this.confirm({
      title: 'Alterações Não Salvas',
      message: `A aba "${tabName}" tem alterações não salvas. Deseja fechar mesmo assim? As alterações serão perdidas.`,
      confirmText: 'Fechar Mesmo Assim',
      cancelText: 'Continuar Editando',
      type: 'warning',
      icon: 'fa-exclamation-triangle'
    });
  }

  confirmNavigation(): Promise<boolean> {
    return this.confirm({
      title: 'Sair da Página',
      message: 'Você tem alterações não salvas. Deseja sair mesmo assim?',
      confirmText: 'Sair',
      cancelText: 'Ficar',
      type: 'warning'
    });
  }
} 