<?php
/**
 * Helpers builder ACF — préfixe cvb_.
 *
 * Les « clones » du SCHEMA (clone_entete_section, clone_cta) sont implémentés
 * en champs de type group + sous-champs partagés via helpers : le schéma
 * GraphQL produit est exactement entete { badge titre intro } et
 * ctaPrimaire { label lien style }, ce que les clones ACF ne garantissent pas.
 */

defined('ABSPATH') || exit;

/** snake_case → camelCase (convention graphql_field_name du SCHEMA). */
function cvb_camel(string $snake): string {
    $parts = explode('_', $snake);
    return array_shift($parts) . implode('', array_map('ucfirst', $parts));
}

/** Champ ACF générique : show_in_graphql + graphql_field_name systématiques. */
function cvb_field(string $key, string $name, string $label, string $type, array $extra = []): array {
    return array_merge([
        'key'                => $key,
        'name'               => $name,
        'label'              => $label,
        'type'               => $type,
        'show_in_graphql'    => 1,
        'graphql_field_name' => cvb_camel($name),
    ], $extra);
}

/** Champ image : return_format array (cf. conventions SCHEMA). */
function cvb_image(string $key, string $name, string $label, array $extra = []): array {
    return cvb_field($key, $name, $label, 'image', array_merge([
        'return_format' => 'array',
        'preview_size'  => 'medium',
    ], $extra));
}

/** Repeater : collapsed automatique sur le sous-champ « titre » s'il existe. */
function cvb_repeater(string $key, string $name, string $label, array $sub_fields, array $extra = []): array {
    if (!isset($extra['collapsed'])) {
        foreach ($sub_fields as $sub) {
            if (($sub['name'] ?? '') === 'titre') {
                $extra['collapsed'] = $sub['key'];
                break;
            }
        }
    }

    return cvb_field($key, $name, $label, 'repeater', array_merge([
        'layout'       => 'block',
        'button_label' => 'Ajouter une ligne',
        'sub_fields'   => $sub_fields,
    ], $extra));
}

/** Select simple. */
function cvb_select(string $key, string $name, string $label, array $choices, ?string $default = null, array $extra = []): array {
    return cvb_field($key, $name, $label, 'select', array_merge([
        'choices'       => $choices,
        'default_value' => $default,
        'allow_null'    => $default === null ? 1 : 0,
        'return_format' => 'value',
    ], $extra));
}

/** Select icône — liste blanche lucide du SCHEMA. */
function cvb_select_icone(string $key, string $name = 'icone', string $label = 'Icône'): array {
    $icones = [
        'thermometer-sun', 'thermometer-snowflake', 'droplets', 'shield-check',
        'clock', 'euro', 'leaf', 'factory', 'warehouse', 'store', 'building-2',
        'school', 'tractor', 'sun', 'snowflake', 'wrench', 'hard-hat',
        'check-circle-2', 'trending-down', 'trending-up', 'zap', 'wind',
        'cloud-sun', 'gauge', 'ruler', 'paint-roller', 'spray-can', 'map-pin',
        'phone', 'file-text', 'award', 'users',
    ];

    return cvb_select($key, $name, $label, array_combine($icones, $icones), null, ['ui' => 1]);
}

/** Sous-champs du clone_entete_section (badge / titre / intro). */
function cvb_entete_subfields(string $layout): array {
    $p = "field_cvb_{$layout}_entete";

    return [
        cvb_field("{$p}_badge", 'badge', 'Badge', 'text'),
        cvb_field("{$p}_titre", 'titre', 'Titre', 'text', [
            'instructions' => "Utiliser *texte* pour le span d'accent.",
        ]),
        cvb_field("{$p}_intro", 'intro', 'Intro', 'textarea', ['rows' => 3]),
    ];
}

/** Clone entête de section → group `entete` (graphql entete { badge titre intro }). */
function cvb_clone_entete(string $layout): array {
    return cvb_field("field_cvb_{$layout}_entete", 'entete', 'En-tête de section', 'group', [
        'layout'     => 'block',
        'sub_fields' => cvb_entete_subfields($layout),
    ]);
}

/** Sous-champs du clone_cta (label / lien / style). */
function cvb_cta_subfields(string $layout, string $name): array {
    $p = "field_cvb_{$layout}_{$name}";

    return [
        cvb_field("{$p}_label", 'label', 'Label', 'text'),
        cvb_field("{$p}_lien", 'lien', 'Lien', 'text', [
            'instructions' => 'URL complète ou chemin interne (/contact).',
        ]),
        cvb_select("{$p}_style", 'style', 'Style', [
            'primary'   => 'Primary',
            'secondary' => 'Secondary',
            'ghost'     => 'Ghost',
        ], 'primary'),
    ];
}

/** Clone CTA → group (graphql camelCase du name : cta, ctaPrimaire, ctaNavbar…). */
function cvb_clone_cta(string $layout, string $name = 'cta', string $label = 'CTA'): array {
    return cvb_field("field_cvb_{$layout}_{$name}", $name, $label, 'group', [
        'layout'     => 'block',
        'sub_fields' => cvb_cta_subfields($layout, $name),
    ]);
}

/** Enveloppe d'un layout du flexible content `sections`. */
function cvb_layout(string $name, string $label, array $sub_fields): array {
    // Champ commun `origine` : nom du composant React d'ORIGINE qui rend cette
    // section (parité pixel avec la version d'avant-CMS). Posé par le seed,
    // lecture seule côté BO. Vide => rendu générique du layout.
    $sub_fields[] = [
        'key'                => "field_cvb_{$name}_origine",
        'name'               => 'origine',
        'label'              => "Composant d'origine",
        'type'               => 'text',
        'readonly'           => 1,
        'instructions'       => 'Géré par les développeurs — composant du site qui rend ce block.',
        'show_in_graphql'    => 1,
        'graphql_field_name' => 'origine',
        'wrapper'            => ['width' => '40'],
    ];
    return [
        'key'        => "layout_cvb_{$name}",
        'name'       => $name,
        'label'      => $label,
        'display'    => 'block',
        'sub_fields' => $sub_fields,
    ];
}

/** Onglet ACF (UI seulement, hors GraphQL). */
function cvb_tab(string $key, string $label): array {
    return [
        'key'             => $key,
        'label'           => $label,
        'name'            => '',
        'type'            => 'tab',
        'placement'       => 'top',
        'show_in_graphql' => 0,
    ];
}
