<?php
/**
 * Fichier  : api/users.php
 * Auteur   : KREMER Régis
 * Version  : 2.2.0
 * Date     : 2026-02-21
 * Description : API REST — Gestion des utilisateurs et des permissions magasins
 *
 * Changelog :
 *   v2.1.0 (2026-02-21) — Version initiale auditée et sécurisée
 *   v2.1.1 (2026-02-21) — Corrections sécurité (CSRF, MIME, session, migrateSuppliers)
 *   v2.2.0 (2026-02-21) — Permissions magasins, bons de commande, rapport d'écart,
 *                      import CSV, historique prix, bon de livraison multi-lignes
 */
require_once dirname(__DIR__).'/config.php';
startSession(); requireAdmin();
// CSRF for all user management operations
if($_SERVER['REQUEST_METHOD'] !== 'GET') csrfCheck();
$method=$_SERVER['REQUEST_METHOD'];
$body=json_decode(file_get_contents('php://input'),true)??[];
switch($method){
case 'GET':
    $users=loadData('users');
    jsonResponse(array_map(function($u){unset($u['password']);return $u;},$users));
case 'POST':
    $username=strtolower(trim($body['username']??''));
    $name=trim($body['name']??'');
    $role=in_array($body['role']??'',['admin','user'])?$body['role']:'user';
    $password=$body['password']??'';
    if($username===''||$name===''||$password==='') jsonError('Tous les champs requis.');
    if(strlen($password)<8) jsonError('Mot de passe: min 8 caractères.');
    foreach(loadData('users') as $u) if(($u['username']??'')===$username) jsonError('Username déjà utilisé.');
    
    // Handle allowedWarehouses
    $allowedWarehouses = [];
    if(isset($body['allowedWarehouses'])) {
        $aw = $body['allowedWarehouses'];
        if(is_string($aw)) {
            $allowedWarehouses = json_decode($aw, true) ?: [];
        } elseif(is_array($aw)) {
            $allowedWarehouses = array_map('intval', $aw);
        }
    }
    
    $item=addItem('users',[
        'username'=>$username,
        'name'=>$name,
        'role'=>$role,
        'password'=>password_hash($password,PASSWORD_DEFAULT),
        'active'=>true,
        'allowedWarehouses'=>$allowedWarehouses
    ]);
    unset($item['password']);
    jsonResponse($item,201);
case 'PUT':
    $id=$body['id']??null;
    if(!$id) jsonError('ID manquant.');
    $fields=[];
    if(isset($body['name']))     $fields['name']=trim($body['name']);
    if(isset($body['role']))     $fields['role']=in_array($body['role'],['admin','user'])?$body['role']:'user';
    if(isset($body['active']))   $fields['active']=(bool)$body['active'];
    if(isset($body['password'])&&$body['password']!==''){
        if(strlen($body['password'])<8) jsonError('Mot de passe: min 8 caractères.');
        $fields['password']=password_hash($body['password'],PASSWORD_DEFAULT);
    }
    
    // Handle allowedWarehouses
    if(isset($body['allowedWarehouses'])) {
        $aw = $body['allowedWarehouses'];
        if(is_string($aw)) {
            $fields['allowedWarehouses'] = json_decode($aw, true) ?: [];
        } elseif(is_array($aw)) {
            $fields['allowedWarehouses'] = array_map('intval', $aw);
        } else {
            $fields['allowedWarehouses'] = [];
        }
    }
    
    if(isset($fields['active'])&&!$fields['active']&&(string)$id===(string)$_SESSION['user_id']) jsonError('Impossible de se désactiver.');
    $up=updateItem('users',$id,$fields);
    if(!$up) jsonError('Non trouvé.',404);
    unset($up['password']);
    jsonResponse($up);
case 'DELETE':
    $id=$body['id']??$_GET['id']??null;
    if(!$id) jsonError('ID manquant.');
    if((string)$id===(string)$_SESSION['user_id']) jsonError('Impossible de supprimer votre compte.');
    deleteItem('users',$id);
    jsonResponse(['ok'=>true]);
default: jsonError('Méthode non supportée.',405);
}
?>
