<?php
declare(strict_types=1);
require_once dirname(__FILE__) . '/../config.php';

/*
 * POST /profile/photo-upload.php
 * Sube o actualiza la foto de perfil del distribuidor autenticado.
 * Espera multipart/form-data con el campo "photo" (imagen JPEG/PNG/WEBP).
 * Guarda la imagen en /uploads/profiles/{id_inver}.jpg
 * Actualiza el campo "foto" en la tabla inversionista.
 */

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

$jwt   = auth();
$idinv = (int)$jwt['idinv'];

// Verificar que se recibió el archivo
if (!isset($_FILES['photo']) || $_FILES['photo']['error'] !== UPLOAD_ERR_OK) {
    $errCode = $_FILES['photo']['error'] ?? -1;
    jsonErr(400, "No se recibió la foto correctamente. Código de error: $errCode");
}

$file     = $_FILES['photo'];
$tmpPath  = $file['tmp_name'];
$mimeType = mime_content_type($tmpPath);

// Validar tipo de imagen
$allowedMimes = ['image/jpeg', 'image/jpg', 'image/png', 'image/webp'];
if (!in_array($mimeType, $allowedMimes, true)) {
    jsonErr(400, "Tipo de archivo no permitido: $mimeType. Use JPEG, PNG o WEBP.");
}

// Validar tamaño (máx 5 MB)
if ($file['size'] > 5 * 1024 * 1024) {
    jsonErr(400, 'La imagen no debe superar 5 MB.');
}

// Directorio de destino
$uploadDir = dirname(__FILE__) . '/../uploads/profiles/';
if (!is_dir($uploadDir)) {
    mkdir($uploadDir, 0755, true);
}

// Nombre de archivo: {id_inver}.jpg (siempre JPEG para uniformidad)
$destPath = $uploadDir . $idinv . '.jpg';

// Convertir a JPEG con GD para normalizar formato y redimensionar si es muy grande
$image = null;
if ($mimeType === 'image/png') {
    $image = imagecreatefrompng($tmpPath);
} elseif ($mimeType === 'image/webp') {
    $image = imagecreatefromwebp($tmpPath);
} else {
    $image = imagecreatefromjpeg($tmpPath);
}

if (!$image) {
    jsonErr(500, 'No se pudo procesar la imagen.');
}

// Redimensionar si es mayor a 400x400
$origW = imagesx($image);
$origH = imagesy($image);
$maxDim = 400;
if ($origW > $maxDim || $origH > $maxDim) {
    $ratio   = min($maxDim / $origW, $maxDim / $origH);
    $newW    = (int)round($origW * $ratio);
    $newH    = (int)round($origH * $ratio);
    $resized = imagecreatetruecolor($newW, $newH);
    // Fondo blanco para PNG con transparencia
    imagefill($resized, 0, 0, imagecolorallocate($resized, 255, 255, 255));
    imagecopyresampled($resized, $image, 0, 0, 0, 0, $newW, $newH, $origW, $origH);
    imagedestroy($image);
    $image = $resized;
}

// Guardar como JPEG calidad 85
if (!imagejpeg($image, $destPath, 85)) {
    imagedestroy($image);
    jsonErr(500, 'No se pudo guardar la imagen en el servidor.');
}
imagedestroy($image);

// Construir URL pública de la foto
$baseUrl  = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http')
          . '://' . $_SERVER['HTTP_HOST'];
$photoUrl = $baseUrl . '/uploads/profiles/' . $idinv . '.jpg?v=' . time();

// URL sin cache-buster para guardar en BD (la URL pública sí lleva ?v= para el navegador)
$photoUrlBase = $baseUrl . '/uploads/profiles/' . $idinv . '.jpg';

// Actualizar campo "foto" en inversionista
try {
    $db = getDB();
    $db->prepare("UPDATE inversionista SET foto = ? WHERE id_inver = ?")
       ->execute([$photoUrlBase, $idinv]);
} catch (Throwable $e) {
    // No es crítico si falla el UPDATE, la foto ya fue guardada en disco
    error_log('profile_photo_upload: DB error: ' . $e->getMessage());
}

jsonOk([
    'photo_url' => $photoUrl,
    'message'   => 'Foto de perfil actualizada correctamente.',
]);
