<?php
/**
 * Test script para la API de Rodales
 * Sistema de Inventario Forestal de Guatemala
 */

// Configuración de la API
$apiBase = 'http://localhost/api';
$testProjectId = 1; // Asumiendo que existe un proyecto con ID 1

// Función para hacer peticiones HTTP
function makeRequest($url, $method = 'GET', $data = null, $token = null) {
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
    
    $headers = ['Content-Type: application/json'];
    if ($token) {
        $headers[] = 'Authorization: Bearer ' . $token;
    }
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    
    if ($data && in_array($method, ['POST', 'PUT'])) {
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    }
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    return [
        'code' => $httpCode,
        'body' => json_decode($response, true),
        'raw' => $response
    ];
}

// Función para mostrar resultados de test
function showTestResult($testName, $expected, $actual, $response = null) {
    $status = ($expected === $actual) ? '✅ PASS' : '❌ FAIL';
    echo "\n{$status} {$testName}\n";
    echo "  Expected: {$expected}\n";
    echo "  Actual: {$actual}\n";
    
    if ($response && isset($response['body'])) {
        echo "  Response: " . json_encode($response['body'], JSON_PRETTY_PRINT) . "\n";
    }
    echo str_repeat('-', 50) . "\n";
}

echo "🧪 INICIANDO TESTS DE API DE RODALES\n";
echo str_repeat('=', 50) . "\n";

// Variables para almacenar datos de test
$authToken = null;
$createdRodalId = null;

// 1. Test de autenticación (necesario para los otros tests)
echo "\n1. 🔐 TEST DE AUTENTICACIÓN\n";
$loginData = [
    'email' => 'admin@test.com',
    'password' => 'admin123'
];

$response = makeRequest($apiBase . '/auth/login', 'POST', $loginData);
showTestResult('Login de usuario', 200, $response['code'], $response);

if ($response['code'] === 200 && isset($response['body']['data']['token'])) {
    $authToken = $response['body']['data']['token'];
    echo "✅ Token obtenido: " . substr($authToken, 0, 20) . "...\n";
} else {
    echo "❌ No se pudo obtener token de autenticación. Terminando tests.\n";
    exit(1);
}

// 2. Test de obtener rodales por proyecto (inicialmente vacío)
echo "\n2. 📋 TEST DE OBTENER RODALES POR PROYECTO\n";
$response = makeRequest($apiBase . "/projects/{$testProjectId}/rodales", 'GET', null, $authToken);
showTestResult('Obtener rodales por proyecto', 200, $response['code'], $response);

// 3. Test de crear nuevo rodal
echo "\n3. ➕ TEST DE CREAR NUEVO RODAL\n";
$rodalData = [
    'nombre_rodal' => 'Rodal Test ' . date('Y-m-d H:i:s'),
    'area_ha' => 5.75
];

$response = makeRequest($apiBase . "/projects/{$testProjectId}/rodales", 'POST', $rodalData, $authToken);
showTestResult('Crear nuevo rodal', 201, $response['code'], $response);

if ($response['code'] === 201 && isset($response['body']['data']['id'])) {
    $createdRodalId = $response['body']['data']['id'];
    echo "✅ Rodal creado con ID: {$createdRodalId}\n";
} else {
    echo "❌ No se pudo crear el rodal. Algunos tests no se ejecutarán.\n";
}

// 4. Test de validación de área
echo "\n4. ⚠️ TEST DE VALIDACIÓN DE ÁREA\n";
$invalidRodalData = [
    'nombre_rodal' => 'Rodal Área Inválida',
    'area_ha' => -1 // Área negativa
];

$response = makeRequest($apiBase . "/projects/{$testProjectId}/rodales", 'POST', $invalidRodalData, $authToken);
showTestResult('Crear rodal con área inválida', 400, $response['code'], $response);

// 5. Test de nombre duplicado
echo "\n5. 🔄 TEST DE NOMBRE DUPLICADO\n";
if ($createdRodalId) {
    $duplicateRodalData = [
        'nombre_rodal' => $rodalData['nombre_rodal'], // Mismo nombre
        'area_ha' => 3.25
    ];
    
    $response = makeRequest($apiBase . "/projects/{$testProjectId}/rodales", 'POST', $duplicateRodalData, $authToken);
    showTestResult('Crear rodal con nombre duplicado', 409, $response['code'], $response);
}

// 6. Test de obtener rodal específico
echo "\n6. 🔍 TEST DE OBTENER RODAL ESPECÍFICO\n";
if ($createdRodalId) {
    $response = makeRequest($apiBase . "/rodales/{$createdRodalId}", 'GET', null, $authToken);
    showTestResult('Obtener rodal específico', 200, $response['code'], $response);
    
    if ($response['code'] === 200) {
        echo "✅ Datos del rodal obtenidos correctamente\n";
        echo "  Nombre: " . ($response['body']['data']['rodal_info']['nombre_rodal'] ?? 'N/A') . "\n";
        echo "  Área: " . ($response['body']['data']['rodal_info']['area_ha'] ?? 'N/A') . " ha\n";
    }
}

// 7. Test de actualizar rodal
echo "\n7. ✏️ TEST DE ACTUALIZAR RODAL\n";
if ($createdRodalId) {
    $updateData = [
        'nombre_rodal' => 'Rodal Test Actualizado',
        'area_ha' => 7.50
    ];
    
    $response = makeRequest($apiBase . "/rodales/{$createdRodalId}", 'PUT', $updateData, $authToken);
    showTestResult('Actualizar rodal', 200, $response['code'], $response);
}

// 8. Test de obtener datos de campo (vacío inicialmente)
echo "\n8. 📊 TEST DE OBTENER DATOS DE CAMPO\n";
if ($createdRodalId) {
    $response = makeRequest($apiBase . "/rodales/{$createdRodalId}/field-data", 'GET', null, $authToken);
    showTestResult('Obtener datos de campo', 200, $response['code'], $response);
    
    if ($response['code'] === 200) {
        $totalRegistros = $response['body']['pagination']['total_records'] ?? 0;
        echo "✅ Total de registros de campo: {$totalRegistros}\n";
    }
}

// 9. Test de obtener cálculos forestales
echo "\n9. 🧮 TEST DE OBTENER CÁLCULOS FORESTALES\n";
if ($createdRodalId) {
    $response = makeRequest($apiBase . "/rodales/{$createdRodalId}/calculations", 'GET', null, $authToken);
    showTestResult('Obtener cálculos forestales', 200, $response['code'], $response);
    
    if ($response['code'] === 200) {
        echo "✅ Cálculos forestales obtenidos\n";
        $calculations = $response['body']['data']['calculos_forestales'] ?? [];
        echo "  Área Basal: " . ($calculations['area_basal_m2_ha'] ?? 'N/A') . " m²/ha\n";
        echo "  Volumen: " . ($calculations['volumen_m3_ha'] ?? 'N/A') . " m³/ha\n";
    }
}

// 10. Test de obtener rodales después de crear uno
echo "\n10. 📋 TEST DE OBTENER RODALES DESPUÉS DE CREAR\n";
$response = makeRequest($apiBase . "/projects/{$testProjectId}/rodales", 'GET', null, $authToken);
showTestResult('Obtener rodales después de crear', 200, $response['code'], $response);

if ($response['code'] === 200) {
    $totalRodales = $response['body']['total'] ?? 0;
    echo "✅ Total de rodales en el proyecto: {$totalRodales}\n";
}

// 11. Test de permisos (sin autenticación)
echo "\n11. 🔒 TEST DE PERMISOS SIN AUTENTICACIÓN\n";
$response = makeRequest($apiBase . "/projects/{$testProjectId}/rodales", 'GET');
showTestResult('Acceso sin autenticación', 401, $response['code'], $response);

// 12. Test de rodal inexistente
echo "\n12. ❓ TEST DE RODAL INEXISTENTE\n";
$response = makeRequest($apiBase . "/rodales/99999", 'GET', null, $authToken);
showTestResult('Obtener rodal inexistente', 404, $response['code'], $response);

// 13. Test de proyecto inexistente
echo "\n13. ❓ TEST DE PROYECTO INEXISTENTE\n";
$response = makeRequest($apiBase . "/projects/99999/rodales", 'GET', null, $authToken);
showTestResult('Obtener rodales de proyecto inexistente', 404, $response['code'], $response);

// 14. Test de eliminar rodal (al final para no afectar otros tests)
echo "\n14. 🗑️ TEST DE ELIMINAR RODAL\n";
if ($createdRodalId) {
    $response = makeRequest($apiBase . "/rodales/{$createdRodalId}", 'DELETE', null, $authToken);
    showTestResult('Eliminar rodal', 200, $response['code'], $response);
    
    // Verificar que el rodal fue eliminado
    $response = makeRequest($apiBase . "/rodales/{$createdRodalId}", 'GET', null, $authToken);
    showTestResult('Verificar rodal eliminado', 404, $response['code'], $response);
}

// 15. Test de área con advertencias
echo "\n15. ⚠️ TEST DE ÁREA CON ADVERTENCIAS\n";
$warningRodalData = [
    'nombre_rodal' => 'Rodal Área Pequeña',
    'area_ha' => 0.05 // Área muy pequeña
];

$response = makeRequest($apiBase . "/projects/{$testProjectId}/rodales", 'POST', $warningRodalData, $authToken);
showTestResult('Crear rodal con área pequeña', 201, $response['code'], $response);

if ($response['code'] === 201 && isset($response['body']['warnings'])) {
    echo "✅ Advertencias recibidas: " . json_encode($response['body']['warnings']) . "\n";
    
    // Limpiar: eliminar el rodal creado
    if (isset($response['body']['data']['id'])) {
        $warningRodalId = $response['body']['data']['id'];
        makeRequest($apiBase . "/rodales/{$warningRodalId}", 'DELETE', null, $authToken);
    }
}

echo "\n" . str_repeat('=', 50) . "\n";
echo "🏁 TESTS COMPLETADOS\n";
echo "Revisa los resultados arriba para verificar el funcionamiento de la API de Rodales.\n";
?>