/**
 * Capacité d'ÉCRITURE du Yield Manager côté front.
 *
 * ═══════════════════════════════════════════════════════════════════════════
 * POURQUOI CETTE DISTINCTION EXISTE
 * ═══════════════════════════════════════════════════════════════════════════
 * Lecture et écriture divergent volontairement : le rôle « gérant » reçoit
 * `yield.view` SANS `yield.manage`, parce que `yield.manage` écrit des prix qui
 * partent vers Rentals United, donc sur des annonces Airbnb / Booking vivantes.
 *
 * Le serveur applique déjà cette garde (`authorizeManage()` sur chaque mutation
 * du contrôleur, `YieldTenantAccess` dans les Form Requests) : sans gate côté
 * front, un gérant voyait des cellules de prix éditables, un interrupteur
 * d'activation et un bouton « Configurer » qui répondaient tous 403 à
 * l'enregistrement — un écran qui propose des gestes qui échouent.
 *
 * errors.md documente le motif depuis le 2026-08-26 : un contrôle qu'on ne peut
 * pas utiliser doit être ÉTEINT **et** EXPLIQUÉ, jamais masqué sans raison.
 *
 * Second motif de lecture seule, indépendant des droits : le compte principal
 * qui CONSULTE une franchise (`?coHost=`, prop `yieldScope.readOnly`). Il
 * porte bien `yield.manage`, mais le serveur refuse toute écriture sur une
 * franchise — même règle : contrôles éteints, bandeau qui dit pourquoi.
 */
import { useTranslation } from '@/hooks/use-translation';
import { type SharedData } from '@/types';
import { usePage } from '@inertiajs/react';
import type { YieldScope } from '../types';

/** Permission d'écriture du Yield Manager (seeder : admin, directeur, co-host). */
export const YIELD_MANAGE = 'yield.manage';

/**
 * Logique pure, testable : `yield.manage` est-elle dans la liste partagée ?
 *
 * Aucun raccourci « admin » ici : le rôle `admin` reçoit TOUTES les permissions
 * via `syncPermissions()` dans le seeder, donc il porte déjà `yield.manage`.
 * Ajouter `isAdmin ||` rallumerait les contrôles pour un compte dont le serveur,
 * lui, ne regarde que la permission — exactement le décalage qu'on corrige.
 */
export function canManageYield(permissions: unknown, readOnlyScope: boolean = false): boolean {
    return !readOnlyScope && Array.isArray(permissions) && permissions.includes(YIELD_MANAGE);
}

/**
 * Le périmètre de l'écran (`yieldScope`). Une page qui ne le porte pas (ancien
 * bundle, page hors yield) vaut « son propre périmètre, en écriture » : c'est
 * le serveur qui reste juge.
 */
export function useYieldScope(): YieldScope {
    const { yieldScope } = usePage<SharedData & { yieldScope?: YieldScope }>().props;
    return yieldScope ?? { coHost: null, coHosts: [], readOnly: false };
}

/** L'utilisateur courant peut-il MODIFIER la tarification ICI ? */
export function useCanManageYield(): boolean {
    const { auth } = usePage<SharedData>().props;
    const { readOnly } = useYieldScope();
    return canManageYield(auth?.permissions, readOnly);
}

/**
 * Le POURQUOI affiché sur chaque contrôle éteint (attribut `title`).
 * Une seule formulation pour tout l'écran : le motif ne doit pas varier d'un
 * bouton à l'autre.
 */
export const READ_ONLY_REASON = "Lecture seule : vous n'avez pas le droit de modifier la tarification.";

/** Le motif affiché quand le siège CONSULTE une franchise (il a le droit, pas sur ce parc). */
export const FRANCHISE_READ_ONLY_REASON = 'Lecture seule : le siège consulte cette franchise, il ne modifie pas sa tarification.';

/**
 * Le POURQUOI traduit d'un contrôle éteint, selon le motif réel : consultation
 * d'une franchise par le siège, ou absence de `yield.manage`.
 */
export function useReadOnlyReason(): string {
    const { t } = useTranslation();
    const { readOnly } = useYieldScope();

    return readOnly ? t('yield.index', 'franchise_read_only_hint', FRANCHISE_READ_ONLY_REASON) : t('yield.index', 'read_only_hint', READ_ONLY_REASON);
}
