import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
import { CTA } from '../../../core/models';

/**
 * Barre d'outils d'actions réutilisable
 * Affiche les boutons d'action selon les permissions
 */
@Component({
  selector: 'app-action-toolbar',
  templateUrl: './action-toolbar.component.html',
  styleUrls: ['./action-toolbar.component.scss'],
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class ActionToolbarComponent {
  
  @Input() ctas: CTA[] = [];
  @Input() selectedCount: number = 0;
  @Input() totalCount: number = 0;
  @Input() loading: boolean = false;

  @Output() actionTriggered = new EventEmitter<string>();

  /**
   * Déclenche une action
   */
  onActionClick(action: string): void {
    if (!this.loading) {
      this.actionTriggered.emit(action);
    }
  }

  /**
   * Vérifie si une action nécessite une sélection
   */
  requiresSelection(action: string): boolean {
    const selectionRequiredActions = ['update', 'delete', 'execute'];
    return selectionRequiredActions.includes(action);
  }

  /**
   * Vérifie si une action est disponible
   */
  isActionAvailable(cta: CTA): boolean {
    if (this.loading) return false;
    
    if (this.requiresSelection(cta.action)) {
      return this.selectedCount > 0;
    }
    
    return true;
  }

  /**
   * Retourne la couleur du bouton selon l'action
   */
  getButtonColor(action: string): string {
    switch (action) {
      case 'create':
        return 'primary';
      case 'delete':
        return 'warn';
      default:
        return '';
    }
  }

  /**
   * Retourne le type de bouton selon l'action
   */
  getButtonType(action: string): string {
    switch (action) {
      case 'create':
      case 'delete':
        return 'raised';
      case 'export':
      case 'import':
        return 'stroked';
      default:
        return 'raised';
    }
  }

  /**
   * TrackBy function pour optimiser le rendu des CTAs
   */
  trackByCta(index: number, cta: CTA): string {
    return cta.action || index.toString();
  }
}

