import { Injectable, ComponentRef, createComponent, EnvironmentInjector, ApplicationRef } from '@angular/core';
import { AlertDialogComponent, AlertDialogOptions } from '../components/alert-dialog/alert-dialog.component';

@Injectable({
  providedIn: 'root'
})
export class AlertService {
  private alertRef: ComponentRef<AlertDialogComponent> | null = null;

  constructor(
    private injector: EnvironmentInjector,
    private appRef: ApplicationRef
  ) {}

  /**
   * Muestra un mensaje de alerta tipo Sweet Alert
   * @param options Opciones de configuración del alert
   * @returns Una promesa que se resuelve con true (confirmar) o false (cancelar)
   */
  show(options: Partial<AlertDialogOptions> = {}): Promise<boolean> {
    return new Promise((resolve) => {
      // Si ya existe un alert, lo eliminamos
      this.closeCurrentAlert();

      // Creamos el componente dinámicamente
      this.alertRef = createComponent(AlertDialogComponent, {
        environmentInjector: this.injector,
      });

      // Agregamos a la aplicación y al DOM
      document.body.appendChild(this.alertRef.location.nativeElement);
      this.appRef.attachView(this.alertRef.hostView);

      // Configuramos las opciones y mostramos
      this.alertRef.instance.show(options);

      // Manejamos la respuesta
      const subscription = this.alertRef.instance.onConfirm.subscribe((result) => {
        subscription.unsubscribe();
        this.closeCurrentAlert();
        resolve(result);
      });
    });
  }

  /**
   * Muestra un mensaje de éxito
   * @param message Mensaje a mostrar
   * @param title Título del alert (opcional)
   */
  success(message: string, title: string = '¡Operación exitosa!'): Promise<boolean> {
    return this.show({
      title,
      message,
      icon: 'success',
      showCancelButton: false
    });
  }

  /**
   * Muestra un mensaje de error
   * @param message Mensaje a mostrar
   * @param title Título del alert (opcional)
   */
  error(message: string, title: string = 'Error'): Promise<boolean> {
    return this.show({
      title,
      message,
      icon: 'error',
      showCancelButton: false
    });
  }

  /**
   * Muestra un mensaje de advertencia
   * @param message Mensaje a mostrar
   * @param title Título del alert (opcional)
   */
  warning(message: string, title: string = 'Advertencia'): Promise<boolean> {
    return this.show({
      title,
      message,
      icon: 'warning',
      showCancelButton: false
    });
  }

  /**
   * Muestra un mensaje informativo
   * @param message Mensaje a mostrar
   * @param title Título del alert (opcional)
   */
  info(message: string, title: string = 'Información'): Promise<boolean> {
    return this.show({
      title,
      message,
      icon: 'info',
      showCancelButton: false
    });
  }

  /**
   * Muestra un diálogo de confirmación
   * @param message Mensaje a mostrar
   * @param title Título del alert (opcional)
   */
  confirm(message: string, title: string = '¿Está seguro?'): Promise<boolean> {
    return this.show({
      title,
      message,
      icon: 'question',
      showCancelButton: true,
      confirmButtonText: 'Sí, confirmar',
      cancelButtonText: 'Cancelar'
    });
  }

  /**
   * Cierra el alert actual si existe
   */
  private closeCurrentAlert(): void {
    if (this.alertRef) {
      this.appRef.detachView(this.alertRef.hostView);
      this.alertRef.location.nativeElement.remove();
      this.alertRef = null;
    }
  }
}