<?php
/**
 * API para gestionar configuraciones del sistema
 * Permite guardar y obtener configuraciones desde la base de datos
 */

require_once '../config/config.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();
} else {
    // Simular sesión para modo debug
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
    $_SESSION['admin_logged_in'] = true;
    $_SESSION['admin_username'] = 'debug_user';
}

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

$method = $_SERVER['REQUEST_METHOD'];
$action = $_GET['action'] ?? '';

try {
    switch ($method) {
        case 'GET':
            handleGetRequest($action);
            break;
            
        case 'POST':
            handlePostRequest($action);
            break;
            
        case 'PUT':
            handlePutRequest($action);
            break;
            
        case 'DELETE':
            handleDeleteRequest($action);
            break;
            
        default:
            throw new Exception('Método HTTP no permitido');
    }
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'error' => $e->getMessage()
    ]);
    writeLog('ERROR', 'Error en API manage_config: ' . $e->getMessage());
}

/**
 * Maneja peticiones GET
 */
function handleGetRequest($action) {
    switch ($action) {
        case 'all':
            // Obtener todas las configuraciones
            $configs = getAllConfigsFromDB();
            echo json_encode([
                'success' => true,
                'data' => $configs
            ]);
            break;
            
        case 'whatsapp':
            // Obtener configuración específica de WhatsApp
            $whatsappConfig = getWhatsAppConfigFromDB();
            echo json_encode([
                'success' => true,
                'data' => $whatsappConfig
            ]);
            break;
            
        case 'validate_whatsapp':
            // Validar configuración de WhatsApp
            $validation = validateWhatsAppConfigFromDB();
            echo json_encode([
                'success' => true,
                'data' => $validation
            ]);
            break;
            
        case 'get':
            // Obtener configuración específica
            $key = $_GET['key'] ?? '';
            if (empty($key)) {
                throw new Exception('Clave de configuración requerida');
            }
            
            $value = getConfigFromDB($key);
            $default = $_GET['default'] ?? null;
            
            echo json_encode([
                'success' => true,
                'data' => [
                    'key' => $key,
                    'value' => $value ?? $default,
                    'exists' => $value !== null
                ]
            ]);
            break;
            
        case 'status':
            // Estado general del sistema de configuraciones
            $allConfigs = getAllConfigsFromDB();
            $whatsappValidation = validateWhatsAppConfigFromDB();
            
            echo json_encode([
                'success' => true,
                'data' => [
                    'total_configs' => count($allConfigs),
                    'whatsapp_configured' => $whatsappValidation['valid'],
                    'database_migrated' => !empty($allConfigs),
                    'installation_completed' => isInstallationCompleted()
                ]
            ]);
            break;
            
        default:
            throw new Exception('Acción GET no reconocida');
    }
}

/**
 * Maneja peticiones POST
 */
function handlePostRequest($action) {
    $input = json_decode(file_get_contents('php://input'), true);
    
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new Exception('JSON inválido en el cuerpo de la petición');
    }
    
    switch ($action) {
        case 'save':
            // Guardar configuración individual
            $key = $input['key'] ?? '';
            $value = $input['value'] ?? '';
            $description = $input['description'] ?? null;
            
            if (empty($key)) {
                throw new Exception('Clave de configuración requerida');
            }
            
            $result = saveConfigToDB($key, $value, $description);
            
            echo json_encode([
                'success' => $result,
                'message' => $result ? 'Configuración guardada exitosamente' : 'Error al guardar configuración'
            ]);
            
            if ($result) {
                writeLog('INFO', "Configuración '$key' actualizada", ['user' => $_SESSION['admin_username'] ?? 'unknown']);
            }
            break;
            
        case 'save_multiple':
            // Guardar múltiples configuraciones
            $configs = $input['configs'] ?? [];
            
            if (empty($configs) || !is_array($configs)) {
                throw new Exception('Array de configuraciones requerido');
            }
            
            $result = saveMultipleConfigsToDB($configs);
            
            echo json_encode([
                'success' => $result,
                'message' => $result ? 'Configuraciones guardadas exitosamente' : 'Error al guardar configuraciones',
                'count' => count($configs)
            ]);
            
            if ($result) {
                writeLog('INFO', "Guardadas " . count($configs) . " configuraciones", [
                    'keys' => array_keys($configs),
                    'user' => $_SESSION['admin_username'] ?? 'unknown'
                ]);
            }
            break;
            
        case 'save_whatsapp':
            // Guardar configuración específica de WhatsApp
            $whatsappConfig = $input['whatsapp'] ?? [];
            
            if (empty($whatsappConfig)) {
                throw new Exception('Configuración de WhatsApp requerida');
            }
            
            $result = saveWhatsAppConfigToDB($whatsappConfig);
            
            // Validar la configuración guardada
            $validation = validateWhatsAppConfigFromDB();
            
            echo json_encode([
                'success' => $result,
                'message' => $result ? 'Configuración de WhatsApp guardada exitosamente' : 'Error al guardar configuración de WhatsApp',
                'validation' => $validation
            ]);
            
            if ($result) {
                writeLog('INFO', 'Configuración de WhatsApp actualizada', [
                    'configured_fields' => $validation['configured_fields'],
                    'user' => $_SESSION['admin_username'] ?? 'unknown'
                ]);
            }
            break;
            
        case 'initialize_defaults':
            // Inicializar configuraciones por defecto
            $result = initializeDefaultConfigs();
            
            echo json_encode([
                'success' => $result,
                'message' => $result ? 'Configuraciones por defecto inicializadas' : 'Error al inicializar configuraciones'
            ]);
            
            if ($result) {
                writeLog('INFO', 'Configuraciones por defecto inicializadas', [
                    'user' => $_SESSION['admin_username'] ?? 'unknown'
                ]);
            }
            break;
            
        case 'migrate_to_database':
            // Migrar configuraciones a la base de datos
            $result = migrateConfigsToDatabase();
            
            echo json_encode([
                'success' => $result,
                'message' => $result ? 'Configuraciones migradas exitosamente a la base de datos' : 'Error en la migración'
            ]);
            break;
            
        default:
            throw new Exception('Acción POST no reconocida');
    }
}

/**
 * Maneja peticiones PUT (actualizar)
 */
function handlePutRequest($action) {
    $input = json_decode(file_get_contents('php://input'), true);
    
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new Exception('JSON inválido en el cuerpo de la petición');
    }
    
    switch ($action) {
        case 'update':
            // Actualizar configuración específica
            $key = $input['key'] ?? '';
            $value = $input['value'] ?? '';
            $description = $input['description'] ?? null;
            
            if (empty($key)) {
                throw new Exception('Clave de configuración requerida');
            }
            
            $result = saveConfigToDB($key, $value, $description);
            
            echo json_encode([
                'success' => $result,
                'message' => $result ? 'Configuración actualizada exitosamente' : 'Error al actualizar configuración'
            ]);
            break;
            
        default:
            throw new Exception('Acción PUT no reconocida');
    }
}

/**
 * Maneja peticiones DELETE
 */
function handleDeleteRequest($action) {
    switch ($action) {
        case 'delete':
            $key = $_GET['key'] ?? '';
            
            if (empty($key)) {
                throw new Exception('Clave de configuración requerida');
            }
            
            $result = deleteConfigFromDB($key);
            
            echo json_encode([
                'success' => $result,
                'message' => $result ? 'Configuración eliminada exitosamente' : 'Error al eliminar configuración'
            ]);
            
            if ($result) {
                writeLog('INFO', "Configuración '$key' eliminada", [
                    'user' => $_SESSION['admin_username'] ?? 'unknown'
                ]);
            }
            break;
            
        case 'clear_cache':
            // Limpiar cache de configuraciones
            clearConfigCache();
            
            echo json_encode([
                'success' => true,
                'message' => 'Cache de configuraciones limpiado'
            ]);
            break;
            
        default:
            throw new Exception('Acción DELETE no reconocida');
    }
}
?>