<?php
/**
 * Fichier  : api/variant_families.php
 * Auteur   : KREMER Régis
 * Version  : 2.3.4
 * Date     : 2026-06-02
 * Description : API — Familles de déclinaisons produit officielles et personnalisées
 */
require_once dirname(__DIR__).'/config.php';
startSession(); requireAuth();
$method = $_SERVER['REQUEST_METHOD'];
if($method === 'GET') requirePerm('products.read');
else { requireAdmin(); csrfCheck(); }

function sanitizeFamilyId(string $id): string {
    $id = strtolower(trim($id));
    $id = preg_replace('/[^a-z0-9_\-]+/', '_', $id);
    $id = trim($id, '_-');
    return $id ?: ('custom_' . time());
}
function sanitizeFamilyAttributes($raw): array {
    if(is_string($raw)){
        $decoded = json_decode($raw, true);
        $raw = is_array($decoded) ? $decoded : [];
    }
    if(!is_array($raw)) return [];
    $out = [];
    foreach($raw as $row){
        if(!is_array($row)) continue;
        $key = preg_replace('/[^a-zA-Z0-9_\-]/', '', (string)($row['key'] ?? ''));
        $label = trim((string)($row['label'] ?? ''));
        if($key === '' || $label === '') continue;
        $preset = $row['presetValues'] ?? [];
        if(is_string($preset)) $preset = array_filter(array_map('trim', preg_split('/[,;\n]+/', $preset)));
        if(!is_array($preset)) $preset = [];
        $out[] = [
            'key' => $key,
            'label' => $label,
            'unit' => trim((string)($row['unit'] ?? '')),
            'type' => in_array(($row['type'] ?? 'text'), ['text','number','select'], true) ? $row['type'] : 'text',
            'presetValues' => array_values($preset),
        ];
    }
    return $out;
}

$body = json_decode(file_get_contents('php://input'), true) ?? [];
$families = loadVariantFamilies();

switch($method){
case 'GET':
    jsonResponse(array_values($families));
case 'POST':
    $label = trim((string)($body['label'] ?? ''));
    if($label === '') jsonError('Nom du modèle obligatoire.');
    $id = sanitizeFamilyId((string)($body['id'] ?? $label));
    foreach($families as $f) if(($f['id'] ?? '') === $id) jsonError('Ce modèle existe déjà.');
    $item = [
        'id' => $id,
        'label' => $label,
        'sourceType' => 'custom',
        'description' => trim((string)($body['description'] ?? '')),
        'attributes' => sanitizeFamilyAttributes($body['attributes'] ?? []),
        'createdAt' => date('c'),
        'updatedAt' => date('c'),
    ];
    if(empty($item['attributes'])) jsonError('Ajoutez au moins un attribut.');
    $families[] = $item;
    saveVariantFamilies($families);
    jsonResponse($item, 201);
case 'PUT':
    $id = sanitizeFamilyId((string)($body['id'] ?? ''));
    if($id === '') jsonError('ID manquant.');
    foreach($families as &$f){
        if(($f['id'] ?? '') !== $id) continue;
        if(($f['sourceType'] ?? 'official') === 'official') jsonError('Un modèle officiel ne peut pas être modifié.', 403);
        if(array_key_exists('label',$body)) $f['label'] = trim((string)$body['label']);
        if(array_key_exists('description',$body)) $f['description'] = trim((string)$body['description']);
        if(array_key_exists('attributes',$body)) $f['attributes'] = sanitizeFamilyAttributes($body['attributes']);
        $f['updatedAt'] = date('c');
        saveVariantFamilies($families);
        jsonResponse($f);
    }
    jsonError('Modèle introuvable.', 404);
case 'DELETE':
    $id = sanitizeFamilyId((string)($body['id'] ?? $_GET['id'] ?? ''));
    if($id === '') jsonError('ID manquant.');
    foreach($families as $f){
        if(($f['id'] ?? '') === $id && ($f['sourceType'] ?? 'official') === 'official') jsonError('Un modèle officiel ne peut pas être supprimé.', 403);
    }
    $next = array_values(array_filter($families, fn($f) => ($f['id'] ?? '') !== $id));
    saveVariantFamilies($next);
    jsonResponse(['ok'=>true]);
default:
    jsonError('Méthode non supportée.', 405);
}
