<?php
/**
 * API: upload_payment_attachment.php
 * SAC 2026 Kernel V4.1.62 MC/MB
 * 
 * Sube un archivo adjunto (evidencia de pago) asociado a una deuda.
 */
require_once 'session.php';
require_once 'config.php';

header('Content-Type: application/json');

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    response(['error' => 'Método no permitido'], 405);
}

if (!isset($_POST['feeId']) || !isset($_POST['propertyId']) || !isset($_FILES['attachment'])) {
    $postSize = ini_get('post_max_size');
    $uploadSize = ini_get('upload_max_filesize');
    response([
        'error' => 'Parámetros insuficientes o archivo demasiado grande.',
        'debug' => [
            'post_max_size' => $postSize,
            'upload_max_filesize' => $uploadSize,
            'received_post' => array_keys($_POST),
            'received_files' => array_keys($_FILES)
        ]
    ], 400);
}

$feeId = $_POST['feeId'];
$propertyId = intval($_POST['propertyId']);
$currentUserId = $_SESSION['user_id'] ?? null;
$currentUserRole = $_SESSION['user_role'] ?? null;
$currentUserPropertyId = $_SESSION['property_id'] ?? null;

if (!$currentUserId) {
    response(['error' => 'Sesión no iniciada o expirada'], 401);
}

// Seguridad: Los propietarios solo pueden subir a su propia propiedad
if ($currentUserRole === 'owner' && $currentUserPropertyId != $propertyId) {
    response(['error' => 'Acceso denegado (Propiedad no coincide)'], 403);
}

$file = $_FILES['attachment'];

if ($file['error'] !== UPLOAD_ERR_OK) {
    $uploadErrors = [
        UPLOAD_ERR_INI_SIZE   => 'El archivo excede el límite permitido por el servidor (php.ini).',
        UPLOAD_ERR_FORM_SIZE  => 'El archivo excede el límite permitido por el formulario.',
        UPLOAD_ERR_PARTIAL    => 'El archivo se subió parcialmente.',
        UPLOAD_ERR_NO_FILE    => 'No se subió ningún archivo.',
        UPLOAD_ERR_NO_TMP_DIR => 'Falta la carpeta temporal en el servidor.',
        UPLOAD_ERR_CANT_WRITE => 'Error al escribir el archivo en el disco.',
        UPLOAD_ERR_EXTENSION  => 'Una extensión de PHP detuvo la subida.',
    ];
    $msg = $uploadErrors[$file['error']] ?? 'Error desconocido en la subida.';
    response(['error' => $msg], 400);
}

$fileName = basename($file['name']);
$fileType = $file['type'];
$tmpName = $file['tmp_name'];

if (!is_uploaded_file($tmpName)) {
    response(['error' => 'Archivo no recibido correctamente (is_uploaded_file failed)'], 400);
}

// Validar tipos de archivo
$allowedTypes = ['image/jpeg', 'image/png', 'application/pdf'];
if (!in_array($fileType, $allowedTypes)) {
    response(['error' => 'Tipo de archivo no permitido (solo JPG, PNG, PDF)'], 400);
}

// Directorio de subida organizado por año/mes
$year = date('Y');
$month = date('m');
$baseUploadDir = "../uploads/";
$uploadDir = "../uploads/payments/$year/$month/";

if (!is_dir($baseUploadDir)) {
    if (!mkdir($baseUploadDir, 0777, true)) {
        response(['error' => 'No se pudo crear el directorio base /uploads/. Verifique permisos en la raíz.'], 500);
    }
}

if (!is_writable($baseUploadDir)) {
    response(['error' => 'El directorio /uploads/ no tiene permisos de escritura.'], 500);
}

if (!is_dir($uploadDir)) {
    if (!mkdir($uploadDir, 0777, true)) {
        response(['error' => 'No se pudo crear el directorio de subida mensual. Verifique permisos en /uploads/'], 500);
    }
}

// Nombre de archivo único
$uniqueName = time() . '_' . preg_replace("/[^a-zA-Z0-9.]/", "_", $fileName);
$targetPath = $uploadDir . $uniqueName;
$dbPath = "uploads/payments/$year/$month/" . $uniqueName;

if (move_uploaded_file($tmpName, $targetPath)) {
    try {
        $pdo = get_db_connection();
        $stmt = $pdo->prepare("INSERT INTO payment_attachments (fee_id, property_id, file_name, file_path, file_type, uploaded_by) VALUES (?, ?, ?, ?, ?, ?)");
        $stmt->execute([$feeId, $propertyId, $fileName, $dbPath, $fileType, $currentUserId]);
        
        response(['success' => true, 'id' => $pdo->lastInsertId()]);
    } catch (Exception $e) {
        // Si falla la DB, borrar el archivo
        if (file_exists($targetPath)) unlink($targetPath);
        response(['error' => $e->getMessage()], 500);
    }
} else {
    response(['error' => 'No se pudo mover el archivo al servidor. Verifique permisos de escritura.'], 500);
}