<?php
/**
 * API BrdCaisse - Synchronisation simple vers base de données
 */

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: POST, GET, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, X-API-Key");
header("Content-Type: application/json; charset=UTF-8");

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit;
}

// ============================================================
// CONFIGURATION
// ============================================================
$CONFIG = [
    'api_key' => 'BrdCaisse_Secure_2026_KEYxyz123'
];

$response = [
    'success' => false,
    'message' => '',
    'deleted' => 0,
    'inserted_count' => 0
];

// ============================================================
// VÉRIFICATION CLÉ API
// ============================================================
$apiKey = $_SERVER['HTTP_X_API_KEY'] ?? '';
if ($apiKey !== $CONFIG['api_key']) {
    $response['message'] = 'Accès non autorisé.';
    http_response_code(401);
    echo json_encode($response);
    exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    $response['message'] = 'Méthode non autorisée.';
    http_response_code(405);
    echo json_encode($response);
    exit;
}

$input = file_get_contents('php://input');
if (empty($input)) {
    $response['message'] = 'Aucune donnée reçue.';
    http_response_code(400);
    echo json_encode($response);
    exit;
}

$data = json_decode($input, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    $response['message'] = 'Données JSON invalides.';
    http_response_code(400);
    echo json_encode($response);
    exit;
}

if (!isset($data['gare']) || empty($data['gare'])) {
    $response['message'] = 'Le champ "gare" est obligatoire.';
    http_response_code(400);
    echo json_encode($response);
    exit;
}

if (!isset($data['records']) || !is_array($data['records'])) {
    $response['message'] = 'Le champ "records" doit être un tableau.';
    http_response_code(400);
    echo json_encode($response);
    exit;
}

// Nettoyer et valider le code gare
$gare = preg_replace('/[^A-Z0-9]/', '', trim($data['gare']));
$valid_gares = ['GR01', 'GR02', 'GR03', 'GR04', 'GR05', 'GR06', 'GR07', 'GR08', 'GR09'];
if (!in_array($gare, $valid_gares)) {
    $response['message'] = 'Code gare invalide.';
    http_response_code(400);
    echo json_encode($response);
    exit;
}

$records = $data['records'];

// Limiter le nombre d'enregistrements
if (count($records) > 5000) {
    $response['message'] = 'Trop d\'enregistrements. Maximum 5000.';
    http_response_code(400);
    echo json_encode($response);
    exit;
}

// ============================================================
// CONNEXION BASE DE DONNÉES
// ============================================================
$db_host = 'localhost';
$db_name = 'transubd_GGR';
$db_user = 'transubd_transub_user';
$db_pass = 'Tr@nsub2@24';
$db_charset = 'utf8mb4';

try {
    $dsn = "mysql:host=$db_host;dbname=$db_name;charset=$db_charset";
    $options = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false,
    ];
    $pdo = new PDO($dsn, $db_user, $db_pass, $options);
} catch (PDOException $e) {
    $response['message'] = 'Erreur de connexion à la base de données.';
    http_response_code(500);
    echo json_encode($response);
    exit;
}

// ============================================================
// SUPPRESSION ANCIENNES DONNÉES (par gare)
// ============================================================
$sqlDelete = "DELETE FROM `BrdCaisse` WHERE `gare` = ?";
$stmtDelete = $pdo->prepare($sqlDelete);
$stmtDelete->execute([$gare]);
$deletedCount = $stmtDelete->rowCount();

// ============================================================
// INSERTION DES NOUVELLES DONNÉES
// ============================================================
$sqlInsert = "INSERT INTO `BrdCaisse` (
    `gare`, `id_excel`, `type`, `ref`, `du`, `au`, `date`,
    `libelle`, `operateur`, `recettes`, `depenses`, `solde`,
    `caissier`, `affectation`, `guichetier`, `recette`,
    `commission`, `ref_det`, `date_modif`
) VALUES (
    :gare, :id_excel, :type, :ref, :du, :au, :date,
    :libelle, :operateur, :recettes, :depenses, :solde,
    :caissier, :affectation, :guichetier, :recette,
    :commission, :ref_det, :date_modif
)";

$stmtInsert = $pdo->prepare($sqlInsert);
$insertedCount = 0;

foreach ($records as $record) {
    // Préparer les valeurs
    $params = [
        ':gare' => $gare,
        ':id_excel' => $record['id_excel'] ?? null,
        ':type' => $record['type'] ?? null,
        ':ref' => $record['ref'] ?? null,
        ':du' => isset($record['du']) && $record['du'] !== 'null' ? $record['du'] : null,
        ':au' => isset($record['au']) && $record['au'] !== 'null' ? $record['au'] : null,
        ':date' => isset($record['date']) && $record['date'] !== 'null' ? $record['date'] : null,
        ':libelle' => $record['libelle'] ?? null,
        ':operateur' => $record['operateur'] ?? null,
        ':recettes' => isset($record['recettes']) && is_numeric($record['recettes']) ? $record['recettes'] : 0,
        ':depenses' => isset($record['depenses']) && is_numeric($record['depenses']) ? $record['depenses'] : 0,
        ':solde' => isset($record['solde']) && is_numeric($record['solde']) ? $record['solde'] : 0,
        ':caissier' => $record['caissier'] ?? null,
        ':affectation' => $record['affectation'] ?? null,
        ':guichetier' => $record['guichetier'] ?? null,
        ':recette' => $record['recette'] ?? null,
        ':commission' => isset($record['commission']) && is_numeric($record['commission']) ? $record['commission'] : 0,
        ':ref_det' => $record['ref_det'] ?? null,
        ':date_modif' => isset($record['date_modif']) && $record['date_modif'] !== 'null' ? $record['date_modif'] : null
    ];
    
    try {
        $stmtInsert->execute($params);
        $insertedCount++;
    } catch (Exception $e) {
        // Logger l'erreur mais continuer
        error_log("Erreur insertion: " . $e->getMessage());
    }
}

// ============================================================
// RÉPONSE
// ============================================================
$response['success'] = true;
$response['message'] = 'Synchronisation terminée avec succès.';
$response['deleted'] = $deletedCount;
$response['inserted_count'] = $insertedCount;

echo json_encode($response);
