/**
 * Composable de chargement du referentiel CategoryType (M0 — Gestion des
 * categories).
 *
 * Apres ERP-73 (composable de liste paginee), la liste des categories
 * elle-meme passe par `usePaginatedList<Category>` directement dans
 * `admin/categories.vue` — c'est un etat propre a la page (pagination,
 * filtres, tri locaux). Ce composable se concentre donc sur le
 * referentiel CategoryType : petite collection lue une fois et reutilisee
 * dans le drawer (select de type) → singleton volontaire pour eviter de
 * la recharger a chaque ouverture du drawer.
 *
 * State singleton au niveau module : reset automatique au logout via
 * `onAuthSessionCleared` (cf. CLAUDE.md regle frontend.md), et reset
 * explicite via `resetCategoriesAdmin()` appele depuis logout.vue.
 */
import { ref } from 'vue'
import type { CategoryType } from '~/modules/catalog/types/category'
import type { HydraCollection } from '~/shared/utils/api'
import { onAuthSessionCleared } from '~/shared/stores/auth'

/**
 * CategoryType est un referentiel lecture-seule (RG-1.06) avec une
 * cardinalite minuscule (≤ 5 entrees connues). On force `pagination=false`
 * pour recuperer toutes les entrees en un appel et alimenter le select du
 * drawer sans pagination — echappatoire prevue par
 * `pagination_client_enabled: true` cote API Platform.
 */
const NO_PAGINATION_QUERY = { pagination: 'false' } as const

const types = ref<CategoryType[]>([])
const loadingTypes = ref(false)
const error = ref<string | null>(null)

function resetCategoriesAdminState(): void {
    types.value = []
    loadingTypes.value = false
    error.value = null
}

// Auto-enregistrement singleton : purge le state sur 401/clearSession
// pour eviter qu'un user suivant (connecte sur le meme onglet) voie le
// referentiel de l'ancien tenant. Le logout volontaire (page logout.vue)
// appelle directement `resetCategoriesAdmin()` ci-dessous.
onAuthSessionCleared(resetCategoriesAdminState)

export function useCategoriesAdmin() {
    const api = useApi()

    /**
     * Charge le referentiel CategoryType. Appele a l'ouverture de la page
     * admin pour que le select du drawer ait deja les options pretes au
     * moment de la creation/edition.
     *
     * Toast desactive : on stocke l'erreur dans `error` plutot que de
     * spammer un toast — le drawer affichera l'erreur inline s'il y a lieu.
     */
    async function fetchTypes(): Promise<void> {
        loadingTypes.value = true
        try {
            const data = await api.get<HydraCollection<CategoryType>>(
                '/category_types',
                NO_PAGINATION_QUERY,
                { toast: false },
            )
            types.value = data.member ?? []
        } catch (e) {
            types.value = []
            error.value = (e as Error)?.message ?? 'Erreur de chargement des types'
        } finally {
            loadingTypes.value = false
        }
    }

    /**
     * Reset explicite — appele depuis `logout.vue` apres `auth.logout()`
     * pour garantir que la prochaine session reparte sur un state propre
     * meme si `clearSession()` n'a pas ete declenche (cas logout volontaire).
     */
    function resetCategoriesAdmin(): void {
        resetCategoriesAdminState()
    }

    return {
        types,
        loadingTypes,
        error,
        fetchTypes,
        resetCategoriesAdmin,
    }
}
