/**
 * Le périmètre (`?coHost=`) du Yield Manager côté front — logique PURE.
 *
 * Le compte principal consulte une franchise en ajoutant `?coHost=<id>` à
 * l'URL (même convention que les autres écrans à sélecteur « Franchise »).
 * Le serveur résout le périmètre À CHAQUE requête : une requête qui perd le
 * paramètre retombe sur le parc du siège — un clic sur « Historique » ou un
 * appel JSON de la grille répondrait alors pour le mauvais périmètre (ou 403
 * sur une config de la franchise). Tout ce qui navigue ou appelle le serveur
 * depuis un écran du yield relaie donc le paramètre, par ces fonctions.
 *
 * Côté franchise, le paramètre n'existe jamais dans l'URL — et le serveur
 * l'ignore de toute façon : une franchise ne choisit pas son périmètre.
 */
import type { YieldFranchiseOption } from '../types';

/** Valeur de l'option « compte principal » du sélecteur (Radix refuse une valeur vide). */
export const HEADQUARTERS_VALUE = 'hq';

/** Les paramètres de requête qui gardent le périmètre affiché : `{ coHost }` ou rien. */
export function scopeQuery(coHost: string | null | undefined): Record<string, string> {
    return coHost ? { coHost } : {};
}

/** La franchise consultée lue dans une chaîne de requête (`window.location.search`). */
export function coHostFromSearch(search: string): string | null {
    const value = new URLSearchParams(search).get('coHost');
    return value && value.trim() !== '' ? value : null;
}

/**
 * Ajoute `coHost` à une URL d'appel JSON, sauf si elle le porte déjà. Conserve
 * la forme de l'URL (absolue comme rendue par `route()`, ou relative).
 */
export function withCoHost(url: string, coHost: string | null): string {
    if (!coHost) return url;

    const [base, hash = ''] = url.split('#', 2);
    const [path, query = ''] = base.split('?', 2);
    const params = new URLSearchParams(query);
    if (params.has('coHost')) return url;

    params.set('coHost', coHost);
    return `${path}?${params.toString()}${hash ? `#${hash}` : ''}`;
}

/** Le nom de la franchise consultée, ou null hors consultation. */
export function franchiseName(coHost: string | null, coHosts: YieldFranchiseOption[]): string | null {
    if (!coHost) return null;
    return coHosts.find((option) => option.id === coHost)?.name ?? coHost;
}
