<?php
// /sistema_ventas/includes/cambiar_periodo.php
// Cambio seguro de período activo.

declare(strict_types=1);

error_reporting(E_ALL);
@ini_set('display_errors', '0');
@ini_set('display_startup_errors', '0');
@ini_set('html_errors', '0');
@ini_set('log_errors', '1');

if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

function cvp_redireccion_segura(?string $valor): string
{
    $default = '/sistema_ventas/index.php';
    $valor = trim((string)$valor);

    if ($valor === '') {
        return $default;
    }

    if (preg_match('#^(https?:)?//#i', $valor)) {
        return $default;
    }

    if (preg_match('/[\r\n]/', $valor)) {
        return $default;
    }

    if (strpos($valor, '/sistema_ventas/') !== 0) {
        return $default;
    }

    return $valor;
}

$redirect = cvp_redireccion_segura($_POST['__return'] ?? ($_GET['return'] ?? ''));

$verificarSesion = __DIR__ . '/verificar_sesion.php';
$dbFile = __DIR__ . '/db.php';
$periodoFile = __DIR__ . '/periodo.php';

if (is_file($verificarSesion)) {
    require_once $verificarSesion;
} elseif (empty($_SESSION['user_id'])) {
    $_SESSION['error_message'] = 'Sesión no válida.';
    header('Location: /sistema_ventas/login.php');
    exit;
}

if (!is_file($dbFile) || !is_file($periodoFile)) {
    error_log('No se pudo cambiar período: falta db.php o periodo.php.');
    $_SESSION['error_message'] = 'No se pudo activar el período por configuración incompleta.';
    header('Location: ' . $redirect);
    exit;
}

require_once $dbFile;
require_once $periodoFile;

$periodo_id = 0;

// Soportamos POST y opcionalmente GET por compatibilidad.
if (isset($_POST['__cambiar_periodo_id'])) {
    $periodo_id = (int) $_POST['__cambiar_periodo_id'];
} elseif (isset($_GET['id'])) {
    $periodo_id = (int) $_GET['id'];
}

if (!function_exists('periodo_set_por_id')) {
    error_log('No se pudo cambiar período: periodo_set_por_id no existe.');
    $_SESSION['error_message'] = 'No se pudo activar el período por configuración incompleta.';
    header('Location: ' . $redirect);
    exit;
}

if ($periodo_id > 0 && periodo_set_por_id($periodo_id)) {
    $_SESSION['success_message'] = 'Período activo cambiado a ' . (int)($_SESSION['PERIODO_ANIO'] ?? 0);
} else {
    $_SESSION['error_message'] = 'No se pudo activar el período (verifique que esté ABIERTO).';
}

header('Location: ' . $redirect);
exit;
