<?php
define('PRONTUS', true);
/**
 * Invoca la API v2 de Twitter para publicar un status.
 * Este script debe correr por CLI para funcionar.
 * 
 * doc de tweets:
 * https://developer.twitter.com/en/docs/twitter-api/tweets/manage-tweets/api-reference/post-tweets
 * doc de carga de imágenes (o videos...)
 * https://developer.twitter.com/en/docs/twitter-api/v1/media/upload-media/overview
 * 
 * Usa la librería twifer:
 * https://github.com/ferrysyahrinal/twifer
*/

if (sizeof($argv) < 2) {
    exit;
}

# Capturo los argumentos
$ts = $argv[1];
$file_url = $argv[2];
$titular_tw = base64_decode($argv[3]);
$imagen_tw = base64_decode($argv[4]);
$prontus_id = $argv[5];
$protocol = $argv[6];
$server_name = $argv[7];
$document_root = $argv[8];

require_once dirname(__FILE__) . '/config.php';
require_once dirname(__FILE__) . '/Utiles.class.php';
require_once __DIR__.'/vendor/ferrysyahrinal/twifer/src/API.php';
use Twifer\API;

main($file_url, $titular_tw, $imagen_tw, $protocol, $server_name, $document_root);

// función global para preparar el post a twitter.
function main($file_url, $titular_tw, $imagen_tw, $protocol, $server_name, $document_root) {
    $utiles = new Utiles();
    $status = $utiles->clearTags($titular_tw);

    // Se obtiene o procesa la URL corta+
    $file_url = $protocol.'://' . $server_name . $file_url;

    if (defined("BITLY_KEY")) {
        $short_url = $utiles->bitlyUrl($file_url);
    } else if (defined("GOOGL_KEY")) {
        $short_url = $utiles->googleShortener($file_url);
    } else {
        $short_url = $file_url;
    }

    // Se procesa la cuenta
    $response = updateStatus($status, $short_url, $imagen_tw, TWITTER_ID, $document_root);
    echo json_encode(setMessageResult($response));
}

/**
 * Ejecuta el posting a twitter.
 * @param string $titular
 * @param string $short_url,
 * @param string $imagen_tw,
 * @param string $cuenta_twitter,
 * @param string $document_root
 * @return array
 */
function updateStatus($titular, $short_url, $imagen_tw, $cuenta_twitter, $document_root) {
    // Se calcula el Largo que debe tener el titular
    //$maxtitu = 140 - (mb_strlen($short_url, 'utf-8') + 1); // se suma 1 por el espacio antes de la url
    // usando el acortador de twitter en t.co el titular final tendra 22 caracteres.
    $maxtitu = 257; // 280 - 22 - 1
    // Se comprueba que tan largo es el titular
    if (mb_strlen($titular, 'utf-8') > $maxtitu) {
        $titular_cortado = mb_substr($titular, 0, $maxtitu - 7, 'utf-8');
        $titular_cortado = mb_substr($titular_cortado, 0, mb_strrpos($titular_cortado, ' ', 'utf-8'), 'utf-8');
        $titular = $titular_cortado . '&ellip;';
    }

    // Se le agrega la URL al final del titular
    $status = $titular . ' ' . $short_url;

    $utiles = new Utiles();
    // Se leen los parámetros para autenticarse
    list($OAUTH_TOKEN, $OAUTH_TOKEN_SECRET, $CONSUMER_KEY, $CONSUMER_SECRET) = $utiles->getTwitterConf(TWITTER_ID);
    //$conn = new API('CONSUMER_KEY', 'CONSUMER_SECRET', 'OAUTH_TOKEN', 'OAUTH_TOKEN_SECRET');
    $conn = new Twifer\API($CONSUMER_KEY, $CONSUMER_SECRET, $OAUTH_TOKEN, $OAUTH_TOKEN_SECRET);
    $fields = ['text' => $status];

    if ($imagen_tw != 'none') {
        // las imágenes deben primero cargarse y luego adjuntarse su id al tweet.
        $path_imagen = $document_root.$imagen_tw;
        $req = $conn->request('POST', 'media/upload', ['media'=>$path_imagen]);
        if (!empty($req['media_id'])) {
            $fields['media'] = ['media_ids'=>["{$req['media_id']}"]];
        } else if (!empty($req['errors'])) {
            return ['code' => 401, 'response'=>'error', 'error' => $req['errors'][0]['message']];
        }
    }

    $postfields = json_encode($fields);
    $response = $conn->request('POST', '/2/tweets', $postfields);
    $tweet_id = '';
    $error = '';
    if (!empty($response['data'])) {
        $response['status'] = 200;
        $tweet_id = $response['data']['id'];
        $response['detail'] = $response['data']['text'];
    } else {
        $response['status'] = 403;
        $error = $response['title'] ?? 'no title' . ': ' . $response['detail'] ?? 'no detail';
    }
    return ['code' => $response['status'], 'response' => $response['detail'], 'tweet_id' => $tweet_id, 'error' => $error];
}

/**
 * Recibe un array devuelto por la API de twitter y genera un array de mensaje para Prontus.
 * @param array $response
 * @return array
 */
function setMessageResult($response) {
    $message = array("msg"=>"", "status"=>0, "time" => date('d/m/Y h:m:s'));

    if ($response['code'] == '200') {
        if ($response['error'] !== '') {
            $message["msg"] = $response['error'];
        } else {
            $message["msg"] = "Tweet publicado con ID #" . $response['tweet_id'];
            $message['status'] = 1;
        }
    } else {
        $message["msg"] = 'Error al intentar publicar, código ['.$response['code'].'], error['.$response['error'].']';
    }

    return $message;
}
