<?php
/**
 * API para actualizar un usuario
 * Fecha: 12 de enero de 2026
 */

require_once '../config/config.php';
require_once '../classes/Database.php';

// Suprimir errores para obtener JSON limpio
error_reporting(E_ERROR | E_PARSE);

// Modo debug: desactivar autenticación si existe el parámetro debug
$debugMode = isset($_GET['debug']) && $_GET['debug'] === 'true';

if (!$debugMode) {
    requireAuthentication();
}

header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');

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

try {
    // Solo permitir POST
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        throw new Exception('Método no permitido');
    }

    // Obtener datos del cuerpo de la petición
    $input = file_get_contents('php://input');
    $data = json_decode($input, true);

    if (!$data) {
        throw new Exception('Datos inválidos');
    }

    // Validar datos requeridos: user_id o phone
    if ((!isset($data['user_id']) || empty($data['user_id'])) && (!isset($data['phone']) || empty($data['phone']))) {
        throw new Exception('ID de usuario o teléfono requerido');
    }

    $user_id = isset($data['user_id']) ? intval($data['user_id']) : null;
    $phone = isset($data['phone']) ? trim($data['phone']) : null;
    $name = isset($data['name']) && !empty(trim($data['name'])) ? trim($data['name']) : null;
    $status = isset($data['status']) ? $data['status'] : 'active';

    // Validar status
    $valid_statuses = ['active', 'inactive', 'blocked'];
    if (!in_array($status, $valid_statuses)) {
        $status = 'active';
    }

    // Crear conexión a la base de datos usando el patrón Singleton
    $db = Database::getInstance();

    // Si tenemos user_id - actualizar
    if ($user_id) {
        // Verificar si el usuario existe
        $checkUser = $db->fetch("SELECT id FROM users WHERE id = :user_id", ['user_id' => $user_id]);
        
        if (!$checkUser) {
            throw new Exception('Usuario no encontrado');
        }

        // Actualizar usuario usando el método de la clase Database
        $updateData = [
            'name' => $name,
            'status' => $status
        ];
        
        $result = $db->update('users', $updateData, 'id = :user_id', ['user_id' => $user_id]);

    } else {
        // Buscar por teléfono y crear/actualizar
        $existing = $db->fetch('SELECT id FROM users WHERE phone_number = :p LIMIT 1', ['p' => $phone]);
        if ($existing) {
            $result = $db->update('users', ['name' => $name, 'status' => $status], 'id = :id', ['id' => $existing['id']]);
            $user_id = $existing['id'];
        } else {
            $user_id = $db->insert('users', ['phone_number' => $phone, 'name' => $name, 'status' => $status, 'created_at' => date('Y-m-d H:i:s')]);
            $result = $user_id ? true : false;
        }
    }
    
    if ($result === false) {
        throw new Exception('No se pudo actualizar el usuario');
    }

    // Respuesta exitosa
    echo json_encode([
        'success' => true, 
        'message' => 'Usuario actualizado correctamente',
        'user_id' => $user_id,
        'data' => [
            'name' => $name,
            'status' => $status
        ]
    ]);

} catch (Exception $e) {
    http_response_code(400);
    echo json_encode([
        'success' => false, 
        'error' => $e->getMessage(),
        'debug_info' => [
            'file' => basename(__FILE__),
            'line' => $e->getLine(),
            'trace' => $e->getTraceAsString()
        ]
    ]);
} catch (Error $e) {
    http_response_code(500);
    echo json_encode([
        'success' => false, 
        'error' => 'Error interno del servidor: ' . $e->getMessage(),
        'debug_info' => [
            'file' => basename(__FILE__),
            'line' => $e->getLine()
        ]
    ]);
}
?>