<?php
/**
 * AGESCONT - API REST con archivos JSON
 * Sistema de almacenamiento basado en archivos JSON para compartir datos entre usuarios
 *
 * Endpoints:
 * GET    /api.php?action=getAll              - Obtener todos los datos
 * GET    /api.php?action=get&type=clientes   - Obtener clientes
 * POST   /api.php?action=save&type=clientes  - Guardar clientes
 * POST   /api.php?action=sync                - Sincronizar todos los datos
 * GET    /api.php?action=backup              - Generar backup
 * POST   /api.php?action=restore             - Restaurar backup
 * POST   /api.php?action=login               - Iniciar sesion
 * POST   /api.php?action=changePassword      - Cambiar contrasena
 */

// Configuracion de headers
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, Authorization');

// Manejar preflight requests (CORS)
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit();
}

// =====================================================
// CONFIGURACION
// =====================================================

// Directorio de datos
$dataDir = __DIR__ . '/data';

// Crear directorio si no existe
if (!file_exists($dataDir)) {
    mkdir($dataDir, 0755, true);
}

// Archivos de datos
$dataFiles = [
    'clientes' => $dataDir . '/clientes.json',
    'pagos' => $dataDir . '/pagos.json',
    'trabajos' => $dataDir . '/trabajos.json',
    'controlMensual' => $dataDir . '/control_mensual.json',
    'usuarios' => $dataDir . '/usuarios.json',
    'gastos' => $dataDir . '/gastos.json'
];

// Inicializar archivos si no existen
foreach ($dataFiles as $key => $file) {
    if (!file_exists($file)) {
        $initialData = [];

        if ($key === 'controlMensual') {
            $initialData = new stdClass(); // Objeto vacio {}
        } elseif ($key === 'usuarios') {
            // Usuario por defecto: admin/admin123
            $initialData = [
                [
                    'id' => 1,
                    'usuario' => 'admin',
                    'password' => password_hash('admin123', PASSWORD_DEFAULT),
                    'nombre' => 'Administrador',
                    'fechaCreacion' => date('Y-m-d H:i:s')
                ]
            ];
        }

        file_put_contents($file, json_encode($initialData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
    }
}

// =====================================================
// FUNCIONES AUXILIARES
// =====================================================

/**
 * Leer archivo JSON
 */
function readJsonFile($file, $isObject = false) {
    if (!file_exists($file)) {
        return $isObject ? new stdClass() : [];
    }
    $content = file_get_contents($file);
    $data = json_decode($content, !$isObject);
    return $data !== null ? $data : ($isObject ? new stdClass() : []);
}

/**
 * Escribir archivo JSON
 */
function writeJsonFile($file, $data) {
    $json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    return file_put_contents($file, $json) !== false;
}

/**
 * Enviar respuesta JSON
 */
function jsonResponse($success, $data = null, $message = '', $httpCode = 200) {
    http_response_code($httpCode);
    echo json_encode([
        'success' => $success,
        'data' => $data,
        'message' => $message,
        'timestamp' => date('Y-m-d H:i:s')
    ], JSON_UNESCAPED_UNICODE);
    exit();
}

/**
 * Obtener datos del body
 */
function getInputData() {
    $input = file_get_contents('php://input');
    $data = json_decode($input, true);

    if ($data === null && json_last_error() !== JSON_ERROR_NONE) {
        jsonResponse(false, null, 'JSON invalido: ' . json_last_error_msg(), 400);
    }

    return $data;
}

// =====================================================
// ROUTER PRINCIPAL
// =====================================================

$action = $_GET['action'] ?? '';
$type = $_GET['type'] ?? '';

try {
    switch ($action) {

        // ==========================================
        // OBTENER TODOS LOS DATOS (para inicializar app)
        // ==========================================
        case 'getAll':
            global $dataFiles;
            $allData = [
                'clientes' => readJsonFile($dataFiles['clientes']),
                'pagos' => readJsonFile($dataFiles['pagos']),
                'trabajos' => readJsonFile($dataFiles['trabajos']),
                'controlMensual' => readJsonFile($dataFiles['controlMensual'], true),
                'gastos' => readJsonFile($dataFiles['gastos'])
            ];
            jsonResponse(true, $allData, 'Datos cargados correctamente');
            break;

        // ==========================================
        // OBTENER DATOS POR TIPO
        // ==========================================
        case 'get':
            global $dataFiles;

            if (!$type || !isset($dataFiles[$type])) {
                jsonResponse(false, null, 'Tipo de datos no valido. Tipos disponibles: clientes, pagos, trabajos, controlMensual, gastos', 400);
            }

            $isObject = ($type === 'controlMensual');
            $data = readJsonFile($dataFiles[$type], $isObject);
            jsonResponse(true, $data, 'Datos de ' . $type . ' obtenidos');
            break;

        // ==========================================
        // GUARDAR DATOS POR TIPO
        // ==========================================
        case 'save':
            global $dataFiles;

            if (!$type || !isset($dataFiles[$type]) || $type === 'usuarios') {
                jsonResponse(false, null, 'Tipo de datos no valido o no permitido', 400);
            }

            $data = getInputData();

            if ($data === null) {
                jsonResponse(false, null, 'No se recibieron datos', 400);
            }

            if (writeJsonFile($dataFiles[$type], $data)) {
                jsonResponse(true, $data, 'Datos de ' . $type . ' guardados correctamente');
            } else {
                jsonResponse(false, null, 'Error al guardar datos de ' . $type, 500);
            }
            break;

        // ==========================================
        // SINCRONIZAR TODOS LOS DATOS
        // ==========================================
        case 'sync':
            global $dataFiles;

            $allData = getInputData();

            if (!$allData) {
                jsonResponse(false, null, 'No se recibieron datos para sincronizar', 400);
            }

            $saved = [];
            $errors = [];

            foreach ($allData as $key => $data) {
                if (isset($dataFiles[$key]) && $key !== 'usuarios') {
                    if (writeJsonFile($dataFiles[$key], $data)) {
                        $saved[] = $key;
                    } else {
                        $errors[] = $key;
                    }
                }
            }

            if (empty($errors)) {
                jsonResponse(true, $saved, 'Datos sincronizados: ' . implode(', ', $saved));
            } else {
                jsonResponse(false, ['saved' => $saved, 'errors' => $errors], 'Algunos datos no se pudieron guardar', 500);
            }
            break;

        // ==========================================
        // GENERAR BACKUP
        // ==========================================
        case 'backup':
            global $dataFiles;

            $backupData = [
                'version' => '2.0',
                'fecha' => date('Y-m-d H:i:s'),
                'fechaLegible' => date('d/m/Y H:i:s'),
                'datos' => [
                    'clientes' => readJsonFile($dataFiles['clientes']),
                    'pagos' => readJsonFile($dataFiles['pagos']),
                    'trabajos' => readJsonFile($dataFiles['trabajos']),
                    'controlMensual' => readJsonFile($dataFiles['controlMensual'], true),
                    'gastos' => readJsonFile($dataFiles['gastos'])
                ]
            ];

            $backupData['estadisticas'] = [
                'total_clientes' => count($backupData['datos']['clientes']),
                'total_pagos' => count($backupData['datos']['pagos']),
                'total_trabajos' => count($backupData['datos']['trabajos']),
                'total_gastos' => count($backupData['datos']['gastos'])
            ];

            jsonResponse(true, $backupData, 'Backup generado correctamente');
            break;

        // ==========================================
        // RESTAURAR BACKUP
        // ==========================================
        case 'restore':
            global $dataFiles;

            $backupData = getInputData();

            if (!$backupData || !isset($backupData['datos'])) {
                jsonResponse(false, null, 'Formato de backup invalido', 400);
            }

            $restored = [];

            if (isset($backupData['datos']['clientes'])) {
                writeJsonFile($dataFiles['clientes'], $backupData['datos']['clientes']);
                $restored[] = 'clientes';
            }

            if (isset($backupData['datos']['pagos'])) {
                writeJsonFile($dataFiles['pagos'], $backupData['datos']['pagos']);
                $restored[] = 'pagos';
            }

            if (isset($backupData['datos']['trabajos'])) {
                writeJsonFile($dataFiles['trabajos'], $backupData['datos']['trabajos']);
                $restored[] = 'trabajos';
            }

            if (isset($backupData['datos']['controlMensual'])) {
                writeJsonFile($dataFiles['controlMensual'], $backupData['datos']['controlMensual']);
                $restored[] = 'controlMensual';
            }

            if (isset($backupData['datos']['gastos'])) {
                writeJsonFile($dataFiles['gastos'], $backupData['datos']['gastos']);
                $restored[] = 'gastos';
            }

            jsonResponse(true, $restored, 'Backup restaurado: ' . implode(', ', $restored));
            break;

        // ==========================================
        // LOGIN
        // ==========================================
        case 'login':
            global $dataFiles;

            $credentials = getInputData();

            if (!$credentials || !isset($credentials['usuario']) || !isset($credentials['password'])) {
                jsonResponse(false, null, 'Usuario y contrasena requeridos', 400);
            }

            $usuarios = readJsonFile($dataFiles['usuarios']);

            foreach ($usuarios as $user) {
                if ($user['usuario'] === $credentials['usuario']) {
                    if (password_verify($credentials['password'], $user['password'])) {
                        $userData = $user;
                        unset($userData['password']); // No enviar password
                        jsonResponse(true, $userData, 'Login exitoso');
                    }
                }
            }

            jsonResponse(false, null, 'Usuario o contrasena incorrectos', 401);
            break;

        // ==========================================
        // CAMBIAR CONTRASENA
        // ==========================================
        case 'changePassword':
            global $dataFiles;

            $data = getInputData();

            if (!$data || !isset($data['usuario']) || !isset($data['currentPassword']) || !isset($data['newPassword'])) {
                jsonResponse(false, null, 'Datos incompletos', 400);
            }

            $usuarios = readJsonFile($dataFiles['usuarios']);
            $updated = false;

            foreach ($usuarios as &$user) {
                if ($user['usuario'] === $data['usuario']) {
                    if (password_verify($data['currentPassword'], $user['password'])) {
                        $user['password'] = password_hash($data['newPassword'], PASSWORD_DEFAULT);
                        $updated = true;
                        break;
                    } else {
                        jsonResponse(false, null, 'Contrasena actual incorrecta', 401);
                    }
                }
            }

            if ($updated) {
                writeJsonFile($dataFiles['usuarios'], $usuarios);
                jsonResponse(true, null, 'Contrasena actualizada correctamente');
            } else {
                jsonResponse(false, null, 'Usuario no encontrado', 404);
            }
            break;

        // ==========================================
        // CREAR USUARIO
        // ==========================================
        case 'createUser':
            global $dataFiles;

            $data = getInputData();

            if (!$data || !isset($data['usuario']) || !isset($data['password'])) {
                jsonResponse(false, null, 'Usuario y contrasena requeridos', 400);
            }

            $usuarios = readJsonFile($dataFiles['usuarios']);

            // Verificar si usuario ya existe
            foreach ($usuarios as $user) {
                if ($user['usuario'] === $data['usuario']) {
                    jsonResponse(false, null, 'El usuario ya existe', 409);
                }
            }

            // Crear nuevo usuario
            $newUser = [
                'id' => time(),
                'usuario' => $data['usuario'],
                'password' => password_hash($data['password'], PASSWORD_DEFAULT),
                'nombre' => $data['nombre'] ?? $data['usuario'],
                'fechaCreacion' => date('Y-m-d H:i:s')
            ];

            $usuarios[] = $newUser;
            writeJsonFile($dataFiles['usuarios'], $usuarios);

            unset($newUser['password']);
            jsonResponse(true, $newUser, 'Usuario creado correctamente', 201);
            break;

        // ==========================================
        // DASHBOARD - Estadisticas
        // ==========================================
        case 'dashboard':
            global $dataFiles;

            $clientes = readJsonFile($dataFiles['clientes']);
            $pagos = readJsonFile($dataFiles['pagos']);
            $trabajos = readJsonFile($dataFiles['trabajos']);

            $mesActual = date('Y-m');

            // Calcular estadisticas
            $totalClientes = count($clientes);

            $ingresosMes = 0;
            $totalAdeudos = 0;

            foreach ($pagos as $pago) {
                $fechaPago = $pago['fecha'] ?? '';
                $mesPago = substr($fechaPago, 0, 7);

                if ($pago['estado'] === 'Pagado') {
                    if ($mesPago === $mesActual) {
                        $ingresosMes += floatval($pago['monto'] ?? 0);
                    }
                } else {
                    $totalAdeudos += floatval($pago['monto'] ?? 0);
                }
            }

            $trabajosPendientes = 0;
            foreach ($trabajos as $trabajo) {
                if ($trabajo['estado'] !== 'Completado') {
                    $trabajosPendientes++;
                }
            }

            // Clientes morosos (mas de 3 meses)
            $clientesMorosos = 0;
            foreach ($clientes as $cliente) {
                $mesesPendientes = [];
                foreach ($pagos as $pago) {
                    if (($pago['clienteId'] ?? $pago['cliente_id'] ?? 0) == $cliente['id']) {
                        if ($pago['estado'] !== 'Pagado' && !empty($pago['fecha'])) {
                            $fecha = new DateTime($pago['fecha']);
                            $mesKey = $fecha->format('Y-m');
                            $mesesPendientes[$mesKey] = true;
                        }
                    }
                }
                if (count($mesesPendientes) > 3) {
                    $clientesMorosos++;
                }
            }

            jsonResponse(true, [
                'totalClientes' => $totalClientes,
                'ingresosMes' => $ingresosMes,
                'totalAdeudos' => $totalAdeudos,
                'trabajosPendientes' => $trabajosPendientes,
                'clientesMorosos' => $clientesMorosos
            ]);
            break;

        // ==========================================
        // ACCION NO VALIDA
        // ==========================================
        default:
            $acciones = [
                'getAll' => 'Obtener todos los datos',
                'get' => 'Obtener datos por tipo (requiere &type=clientes|pagos|trabajos|controlMensual|gastos)',
                'save' => 'Guardar datos por tipo (POST, requiere &type=...)',
                'sync' => 'Sincronizar todos los datos (POST)',
                'backup' => 'Generar backup completo',
                'restore' => 'Restaurar backup (POST)',
                'login' => 'Iniciar sesion (POST)',
                'changePassword' => 'Cambiar contrasena (POST)',
                'createUser' => 'Crear usuario (POST)',
                'dashboard' => 'Obtener estadisticas del dashboard'
            ];

            jsonResponse(false, ['acciones_disponibles' => $acciones], 'Accion no especificada o invalida', 400);
    }

} catch (Exception $e) {
    jsonResponse(false, null, 'Error del servidor: ' . $e->getMessage(), 500);
}
?>
