<?php
// ml_api.php — API helpers para Mercado Libre (standalone, sin cadena de includes)
// Conexion directa a PDO sin pasar por root/db.php (evita session_start, auth, etc)

require_once dirname(dirname(__FILE__)) . '/config.php';

try {
    $pdo = new PDO(
        "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4",
        DB_USER,
        DB_PASS,
        array(
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES => false
        )
    );
    $pdo->exec("SET time_zone = '-03:00'");
} catch (Exception $e) {
    throw new RuntimeException("DB PDO connect error: " . $e->getMessage());
}

function ps_get($name){
  global $pdo;
  $st = $pdo->prepare("SELECT valor FROM parametros_sistema WHERE nombre=? LIMIT 1");
  $st->execute(array($name));
  $r = $st->fetch();
  return $r ? $r['valor'] : null;
}
function ps_set($name, $value){
  global $pdo;
  $st = $pdo->prepare("INSERT INTO parametros_sistema(nombre, valor) VALUES(?,?)
                       ON DUPLICATE KEY UPDATE valor=VALUES(valor)");
  $st->execute(array($name,$value));
}

function ml_get_access_token(){
  $token = ps_get('ml_access_token');
  $exp   = (int)(ps_get('ml_access_expire_at') ?: 0);
  if ($token && time() < $exp - 60) return $token;

  $app_id  = ps_get('ml_app_id');
  $secret  = ps_get('ml_app_secret');
  $refresh = ps_get('ml_refresh_token');

  if (!$app_id || !$secret || !$refresh) throw new Exception('Faltan credenciales OAuth de ML');

  $url = "https://api.mercadolibre.com/oauth/token";
  $payload = http_build_query(array(
    'grant_type'    => 'refresh_token',
    'client_id'     => $app_id,
    'client_secret' => $secret,
    'refresh_token' => $refresh
  ));
  $ctx = stream_context_create(array('http'=>array(
    'method'=>'POST',
    'header'=>"Content-Type: application/x-www-form-urlencoded\r\n",
    'content'=>$payload,
    'timeout'=>30
  )));
  $res = file_get_contents($url,false,$ctx);
  if ($res===false) throw new Exception('No se pudo refrescar el token ML');
  $j = json_decode($res,true);
  if (empty($j['access_token'])) throw new Exception('Respuesta OAuth invalida');

  ps_set('ml_access_token', $j['access_token']);
  if (!empty($j['refresh_token'])) ps_set('ml_refresh_token', $j['refresh_token']);
  ps_set('ml_access_expire_at', (string)(time() + (int)(isset($j['expires_in']) ? $j['expires_in'] : 3000)));

  return $j['access_token'];
}

function ml_get($endpoint, $params = array()){
  $token = ml_get_access_token();
  $qs = $params ? ('?'.http_build_query($params)) : '';
  $url = "https://api.mercadolibre.com$endpoint$qs";

  $opts = array('http'=>array(
    'method'=>'GET',
    'header'=>"Authorization: Bearer $token\r\nAccept: application/json\r\n",
    'timeout'=>45,
    'ignore_errors'=>true
  ));
  $res = file_get_contents($url,false,stream_context_create($opts));
  if ($res===false) throw new Exception("GET ML fallo: $endpoint");

  global $http_response_header;
  $statusLine = isset($http_response_header[0]) ? $http_response_header[0] : 'HTTP/1.1 000';
  if (!preg_match('/\s(\d{3})\s/', $statusLine, $m)) $m=array(0,0);
  $code = (int)$m[1];
  if ($code>=400) {
    throw new Exception("GET $endpoint HTTP $code: ".$res);
  }
  return json_decode($res,true);
}

if (!function_exists('ml_get_strict')) {
  function ml_get_strict($endpoint, $params = array()){ return ml_get($endpoint, $params); }
}

function ml_me(){ return ml_get('/users/me'); }

function ml_ensure_seller_id(){
  $sid = ps_get('ml_seller_id');
  if ($sid) return $sid;
  $me = ml_me();
  if (empty($me['id'])) throw new Exception('No se pudo obtener user_id desde /users/me');
  ps_set('ml_seller_id', (string)$me['id']);
  return (string)$me['id'];
}
