import { Controller } from '@hotwired/stimulus';

/* Picker inline (sans POST) : utilisé sur la page scan pour choisir les concessions
   uniquement pour la session en cours. Les concessions cochées sont lues à la volée
   par scan_controller via getSelectedConcessions(). */
export default class extends Controller {
    static targets = ['search', 'item', 'checkbox', 'count', 'empty', 'badge'];

    connect() {
        this.updateBadge();
    }

    filter() {
        const q = this.searchTarget.value.trim().toLowerCase();
        let visible = 0;
        this.itemTargets.forEach((item) => {
            const match = !q || item.dataset.name.includes(q);
            item.classList.toggle('hidden', !match);
            if (match) visible++;
        });
        this.emptyTarget.classList.toggle('hidden', visible > 0);
        this.emptyTarget.classList.toggle('flex', visible === 0);
        this.countTarget.textContent = q
            ? `${visible} résultat${visible > 1 ? 's' : ''}`
            : `${this.itemTargets.length} concessions`;
    }

    visibleCheckboxes() {
        return this.itemTargets
            .filter((item) => !item.classList.contains('hidden'))
            .map((item) => item.querySelector('input[type=checkbox]'));
    }

    selectAll() {
        this.visibleCheckboxes().forEach((cb) => { cb.checked = true; });
        this.updateBadge();
    }

    clearAll() {
        this.visibleCheckboxes().forEach((cb) => { cb.checked = false; });
        this.updateBadge();
    }

    updateBadge() {
        const n = this.checkboxTargets.filter((cb) => cb.checked).length;
        this.badgeTarget.textContent = n === 0
            ? 'aucune sélectionnée'
            : `${n} sélectionnée${n > 1 ? 's' : ''}`;
        this.badgeTarget.classList.toggle('text-red-brand', n === 0);
        this.badgeTarget.classList.toggle('font-medium', n === 0);
    }

    /** Appelée par scan_controller via this.application.getControllerForElementAndIdentifier */
    selected() {
        return this.checkboxTargets.filter((cb) => cb.checked).map((cb) => cb.value);
    }
}
