import { inject, Injectable } from '@angular/core';
import { ToastrService } from 'ngx-toastr';
import { ActionType } from '@app/domain/action-type.util';

@Injectable({
  providedIn: 'root',
})
export class FeedbackService {
  private readonly toastr = inject(ToastrService);

  private readonly TOAST_CONFIG = {
    closeButton: true,
    progressAnimation: 'decreasing' as const,
    progressBar: true,
  };

  /**
   * @param action Le type d'action (UPDATE, CREATE...). Passer null pour une info générique.
   * @param message Le message à afficher.
   * @param hasError Si true, affiche une erreur générique.
   */
  notify(action: ActionType | null, message: string, hasError: boolean = false): void {
    if (hasError) {
      const userFriendlyMessage = this.handleErrorMessage(message);
      this.handleError(userFriendlyMessage);
    } else {
      this.handleSuccess(action, message);
    }
  }

  private handleError(message: string): void {
    this.toastr.error(`${message}`, `Erreur`, {
      ...this.TOAST_CONFIG,
      disableTimeOut: true,
      progressBar: false,
    });
  }

  private handleSuccess(action: ActionType | null, message: string): void {
    let title = 'Succès';

    switch (action) {
      case ActionType.UPDATE:
        title = 'Mise à jour';
        break;
      case ActionType.CREATE:
        title = 'Création';
        break;
      case ActionType.DELETE:
        title = 'Suppression';
        break;
    }

    this.toastr.success(message, title, this.TOAST_CONFIG);
  }

  private handleErrorMessage(messageError: string): string {
    const lowerMessage = messageError.toLowerCase();

    // Mapping des erreurs PocketBase courantes vers messages utilisateurs
    const errorMessages: Record<string, string> = {
      'failed to authenticate': `Votre email n'est pas valide ou votre mot de passe est incorrect`,
      'failed to auth': `Échec de l'authentification. Vérifiez vos identifiants.`,
      'invalid email': `L'adresse email n'est pas valide.`,
      'invalid password': `Le mot de passe ne respecte pas les critères de sécurité.`,
      'passwords do not match': `Les mots de passe saisis ne correspondent pas.`,
      'record not found': `La ressource demandée n'existe pas.`,
      'validation error': `Données invalides. Vérifiez les champs saisis.`,
      'network error': `Problème de connexion. Vérifiez votre réseau.`,
    };

    // Recherche du premier match
    for (const [errorKey, userMessage] of Object.entries(errorMessages)) {
      if (lowerMessage.includes(errorKey)) {
        return userMessage;
      }
    }

    // Message par défaut
    return `Une erreur s'est produite, veuillez réessayer ultérieurement`;
  }
}
