<?php
// /api_comercial/productos/imagen_drive.php
error_reporting(E_ALL ^ E_NOTICE);

require __DIR__ . '/../vendor/autoload.php';
use Google\Client;
use Google\Service\Drive;

/* === CONFIG === */
const SA_JSON_PATH = '/home/sicse/public_html/mkj.sicsemkj.com/credenciales/sa.json'; // AJUSTA si lo moviste
const CACHE_DIR    = __DIR__ . '/../cache_img';  // se creará solo

// Si tus APIs usan token, descomenta y valida aquí (opcional):
// include_once __DIR__ . '/../clases/TokenValidator.php';
// $usuarioId = TokenValidator::validar($conn); // si lo necesitas

/* === HELPERS === */
function drive(): Drive {
    static $d = null;
    if ($d) return $d;

    if (!is_readable(SA_JSON_PATH)) {
        http_response_code(500);
        echo "No puedo leer sa.json en: " . SA_JSON_PATH;
        exit;
    }
    $c = new Client();
    $c->setAuthConfig(SA_JSON_PATH);
    $c->setScopes([Drive::DRIVE_READONLY]);
    $d = new Drive($c);
    return $d;
}

function cache_path(string $fileId): string {
    @mkdir(CACHE_DIR, 0775, true);
    return CACHE_DIR . '/' . $fileId . '.bin';
}
function cache_get(string $fileId): ?string {
    $p = cache_path($fileId);
    return is_file($p) ? file_get_contents($p) : null;
}
function cache_put(string $fileId, string $bytes): void {
    file_put_contents(cache_path($fileId), $bytes);
}

function output_image(string $bytes, ?string $mimeHeader = null): void {
    if (!$mimeHeader) {
        $f = new finfo(FILEINFO_MIME_TYPE);
        $mimeHeader = $f->buffer($bytes) ?: 'image/jpeg';
    }
    header('Content-Type: ' . $mimeHeader);
    header('Cache-Control: public, max-age=86400'); // 1 día
    echo $bytes;
    exit;
}

/** Lee imagen de Drive por fileId, usando caché local */
function read_image_from_drive(string $fileId): string {
    if ($b = cache_get($fileId)) return $b;

    $d = drive();
    // Baja directamente el binario
    $resp = $d->files->get($fileId, ['alt' => 'media']);
    $bytes = $resp->getBody()->getContents();
    cache_put($fileId, $bytes);
    return $bytes;
}

/** Busca un fileId por nombre dentro de una carpeta (fallback opcional) */
function find_fileid_by_name_in_folder(string $folderId, string $pattern): ?string {
    $d = drive();
    $res = $d->files->listFiles([
        'q' => sprintf("'%s' in parents and name contains '%s' and trashed=false",
                       $folderId, addcslashes($pattern, "'")),
        'fields' => 'files(id,name,mimeType)',
        'pageSize' => 1,
        'orderBy' => 'modifiedTime desc',
        'supportsAllDrives' => true,
        'includeItemsFromAllDrives' => true
    ]);
    if (count($res->files)) return $res->files[0]->id;
    return null;
}

/** Toma imagen_drive_id desde BD por producto_id */
function fileId_from_producto(int $productoId): ?string {
    // Ajusta la ruta a tu conexión PDO ($conn)
    require_once __DIR__ . '/../conexion.php';
    $sql = "SELECT imagen_drive_id FROM productos WHERE id = :id";
    $st  = $conn->prepare($sql);
    $st->bindValue(':id', $productoId, PDO::PARAM_INT);
    $st->execute();
    $row = $st->fetch(PDO::FETCH_ASSOC);
    return ($row && !empty($row['imagen_drive_id'])) ? $row['imagen_drive_id'] : null;
}

/* === MAIN === */
// Admite JSON POST con:
//  - fileId: string             (preferido si ya lo guardas en productos.imagen_drive_id)
//  - producto_id: int           (buscará imagen_drive_id en tu BD)
//  - folderId + pattern: string (fallback para búsquedas por nombre)
$raw = file_get_contents('php://input');
$body = json_decode($raw ?: '[]', true);
$fileId     = $body['fileId']     ?? null;
$productoId = $body['producto_id']?? null;
$folderId   = $body['folderId']   ?? null;
$pattern    = $body['pattern']    ?? null;

try {
    if (!$fileId && $productoId) {
        $fileId = fileId_from_producto((int)$productoId);
    }
    if (!$fileId && $folderId && $pattern) {
        $fileId = find_fileid_by_name_in_folder($folderId, $pattern);
    }
    if (!$fileId) {
        http_response_code(400);
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode(['ok'=>false,'msg'=>'Falta fileId o producto_id (o folderId+pattern)']);
        exit;
    }

    $bytes = read_image_from_drive($fileId);

    // Detecta MIME (o usa el del archivo si quieres consultarlo con files->get(fields: 'mimeType'))
    output_image($bytes); // termina el script

} catch (Google\Service\Exception $e) {
    http_response_code($e->getCode() ?: 500);
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode(['ok'=>false,'msg'=>$e->getMessage()]);
} catch (Throwable $e) {
    http_response_code(500);
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode(['ok'=>false,'msg'=>$e->getMessage()]);
}
