<?php

error_reporting( E_ALL & ~E_STRICT );
ini_set('display_errors', 1);
date_default_timezone_set("UCT");
session_start();

/********************************* CONSTANTES Y REQUIRES ****************************************/

define('SITE_ROOT', dirname(__FILE__));
define('COMMON_LIBS', '../../commons/libs/lab-social-stream');

require_once COMMON_LIBS . '/autoloadSocialStreamFunctions.php';
require_once $functions_properties;
require_once $nocsrfFunctions;
require_once $twitterFunctions;
require_once $igFunctions;
require_once $functions_utils;
require_once '../../commons/autoloadSlimTwig.php';
require_once 'app/staticDB.php';
require_once 'app/backofficeProcess.php';
use \Slim\Slim;

			// include_once($mTveFunctions);
			// include_once($vineFunctions);

/********************************* INSTANCIACIÓN DE SLIM & TWIG ****************************************/

$templateDir 			= 'views';
$loader 				= new Twig_Loader_Filesystem(array($commonsTemplatesDir, $templateDir));

$twig 					= new Twig_Environment($loader, array(
    'debug' => false,// quitar en PRO
));
$twig->addExtension(new Twig_Extension_Debug());
$twig->addExtension(new Commons_Twig_Extension());

$app = new Slim(array(
    // Config requirements for default Slim Auth implementation
));
$twig->addFilter(new Twig_SimpleFilter('addOne', function($date) {
	if(isset($date)){
		$date= date('Y/m/d H:i:s', $date->sec);
		return date('Y/m/d H:i:s',strtotime ( '+1 hour' , strtotime ( $date ) ));
	
	}else{

		return  '';
	}	
}));
$twig->addFilter(new Twig_SimpleFilter('truncate', function($string, $size) {
    if(strlen($string) < $size) {
        return $string;
    } else {
        return array_shift(str_split($string, $size)) . "...";
    }
}));
$twig->addFilter(new Twig_SimpleFilter('toDate', function($date) {
	if(isset($date)){
		return  date('Y/m/d H:i:s', $date->sec);

	}else{

		return  '';
	}	
}));
$twig->addFilter(new Twig_SimpleFilter('toTime', function($date) {
	$result=str_split($date,2);
 $hour=($result[2]+1);
	return $hour.':'.$result[3];
}));
/********************************* DEFINICIÓN DE FILTROS ****************************************/

$skeletonViewFilter = new Twig_SimpleFilter('skeletonView', function($videoId, $autoplay=true){
	$skeleton = file_get_contents("http://lab.rtve.es/commons/api-getter/video/?x=video&idVideo=".$videoId);
	return $skeleton;
});


/********************************* VARIABLES GLOBALES *******************************************/

$baseUrl 			= '/los-goya/radar';
$file_SearchTerms   = 'data/properties/searchTerms.json';
$searchTerms 		= file_get_contents($file_SearchTerms);
$searchTerms 		= json_decode($searchTerms, true);


function getMaxTweetPerMinute($array){
	$max=0;
	foreach( $array as $minute){
		if($minute>$max)$max=$minute;
	}
	return $max;
}

$viewConfig = array(
	'baseURL' => $baseUrl,
	'searchTerms' => $searchTerms
);


$app->get('/', function() use($app,$twig,$viewConfig){
	global $viewConfig;



	$comentados=StaticDB::getFavorites();
	$favorites = StaticDB::getFavoritesDocument();
	$mostByMinute = staticDB::getMostComentedByMinute();
	$allPost= staticDB::getAllPosts(true);
	$timeline=StaticDB::getTimeline();
	$max= getMaxTweetPerMinute($timeline['timeline']);
	$filter = StaticDB::getFilters();

	$imgShare = 'http://lab.rtve.es'.$viewConfig['baseURL'].'/share.png';

	$viewConfig['comentados'] = $comentados;
	$viewConfig['favorites'] = $favorites;
	$viewConfig['mostByMinute'] = $mostByMinute;
	$viewConfig['allPost'] = $allPost;
	$viewConfig['timeline'] = $timeline;
	$viewConfig['maxMinute'] = $max;
	$viewConfig['filter'] = $filter;	
	$viewConfig['seo'] = array(
		"url" => "http://lab.rtve.es/los-goya/radar/",
		"h1" => "El Radar Social de Los Goya 2016",
		"title" => "El Radar Social de Los Goya 2016 - Las RTVE.es",
		"description" => "Vive los Premios Goya 2016 en directo desde la redes sociales con nuestro radar social de seguimiento de hastags y usuarios de twitter. Instagram y +TVE de Los Goya - LAB RTVE.es",
		"keywords" => "Los Goya 2016, Premios Goya, Goya, Los Goya, Premios Goya 2016, Redes sociales, Twitter, Instagram, Vine, Goyas Golfos, Vídeo de los Goya 2016",
		"imagen" => $imgShare,
		"fb" => "Radar Social de &#64;PremiosGoya 2016, lo m&aacute;s comentado en redes http://lab.rtve.es/los-goya/radar",
		"tw" => "Radar Social de &#64;PremiosGoya 2016, lo m&aacute;s comentado en redes ",
		"twTxt" => "Radar Social de @PremiosGoya 2016, los más comentado en redes "
	);

	echo $twig->render('index.html', $viewConfig);
	//echo $twig->render('comingSoon.html', $viewConfig);
});

$app->get('/getFavorites/', function() use($app,$twig,$viewConfig){	
	echo json_encode(StaticDB::getFavorites());
});

$app->get('/mas-comentados/', function() use($app,$twig,$viewConfig){
	global $viewConfig;

	$comentados=StaticDB::getFavorites();
	$favorites = StaticDB::getFavoritesDocument();
	$mostByMinute = staticDB::getMostComentedByMinute();
	$timeline=StaticDB::getTimeline();
	$max= getMaxTweetPerMinute($timeline['timeline']);
	$filter = StaticDB::getFilters();

	$imgShare = 'http://lab.rtve.es'.$viewConfig['baseURL'].'/share.png';

	$viewConfig['comentados'] = $comentados;
	$viewConfig['favorites'] = $favorites;
	$viewConfig['mostByMinute'] = $mostByMinute;
	$viewConfig['timeline'] = $timeline;
	$viewConfig['maxMinute'] = $max;
	$viewConfig['filter'] = $filter;
	$viewConfig['seo'] = array(
			"url" => "http://lab.rtve.es/los-goya/radar/mas-comentados/",
			"h1" => "El Radar Social de Los Goya 2016, lo más comentado",
			"title" => "El Radar Social de Los Goya 2016, lo más comentado - Las RTVE.es",
			"description" => "¿Quieres saber qué es lo más comentado de Los Goya 2016 en las redes sociales? Te lo contamos todo en lo más comentado del Radar Social de los Premios Goya - LAB RTVE.es",
			"Los Goya 2016, Premios Goya, Goya, Los Goya, Premios Goya 2016, Redes sociales, Twitter, Instagram, Vine, Goyas Golfos, Vídeo de los Goya 2016" => "FALTA",
			"imagen" => $imgShare,
			"fb" => "Radar Social de &#64;PremiosGoya 2016, los m&aacute;s populares en redes http://lab.rtve.es/los-goya/radar/",
			"tw" => "Radar Social de &#64;PremiosGoya 2016, los m&aacute;s populares en redes ",
			"twTxt" => "Radar Social de @PremiosGoya 2016, los más populares en redes "
		);


	$viewConfig['bodyclass'] = 'comentados';
	echo $twig->render('index.html', $viewConfig);

});


$app->get('/getallposts/:show(/:since)', function($show, $since = null) use($app,$twig,$viewConfig){
	if($since){
		$data = array();
		// $since = str_replace("/","-",$since);
		$date = new MongoDate(strtotime($since)); 
		$data['data'] = staticDB::getAllPosts($show, $date);
	}else{
		$data['data'] = staticDB::getAllPosts($show);
	}
	
	
	$data['timeline'] = staticDB::getTimeline();
	$data['max']= getMaxTweetPerMinute($data['timeline'] );	
	echo json_encode($data); 

});

$app->get('/getNumberNewPosts/:since', function($since = null) use($app,$twig,$viewConfig){
	$date = new MongoDate(strtotime($since));//2016-01-26 13:40:00
	$data = array();
	$data['data'] = StaticDB::getNumberNewPosts(true,$date);
	
	echo $data['data'];

});

$app->get('/getOldPosts/:until', function($until) use($app,$twig,$viewConfig){
	$date = new MongoDate(strtotime($until));
	$data = staticDB::getAllOldPosts($date);	
	
	echo json_encode($data);

});
$app->get('/getOldPostsByTerm/:term(/:until)', function($term,$until=null) use($app,$twig,$viewConfig){

	$until = new MongoDate(strtotime($until));
	$data=StaticDB::getOldPostsByTerms($term,$until);

	echo json_encode($data);

});

$app->get('/getNumberNewPosts/:since', function($since = null) use($app,$twig,$viewConfig){
	$date = new MongoDate(strtotime($since));//2016-01-26 13:40:00
	$data = array();
	$data['data'] = StaticDB::getNumberNewPosts(true,$date);
	
	echo $data['data'];

});

$app->get('/gettimeline/', function() use($app,$twig,$viewConfig){

	$data = array();
	$box = array();
	if(isset($_REQUEST['term'])){
		$timeline  = staticDB::getTimeline($_REQUEST['term']);
	}else{
		$timeline  = staticDB::getTimeline();
	}
	$mostByMinute = staticDB::getMostComentedByMinute();
	$timeline['max']= getMaxTweetPerMinute($timeline['timeline'] );	
	$timeline['box']=$mostByMinute;

	echo json_encode($timeline);


});
$app->get('/getAllPostsByTerms/', function() use($app,$twig,$viewConfig){

	$viewConfig['allPost']=StaticDB::getAllPostsByTerms($_REQUEST['term']);
	$viewConfig['seo'] = array(
		"twTxt" => "Radar Social de @PremiosGoya 2016, los más comentado en redes "
	);
	echo $twig->render('partials/itemGrid.html', $viewConfig);

});

$app->get('/getallpostsbyminute/:minute/:type', function($minute,$type) use($app,$twig,$viewConfig){

	$data = array();
	$data = staticDB::getAllPostsByMinute($minute, $type);

	echo json_encode($data);

});


$app->get('/getmostcomentedbyminute/', function() use($app,$twig,$viewConfig){
	$dataMostComented = staticDB::getMostComentedByMinute();
	echo json_encode($dataMostComented);
});	


$app->get('/getallminutes/', function() use($app,$twig,$viewConfig){

	$data = array();
	$data['timeline'] = StaticDB::getAllMinutes();
	
	echo json_encode($data);

});

$app->post('/twtprocess/', function() use($app,$twig,$viewConfig){
	global $searchTerms;

	//Primero recogemos los parámetros esperados
	$method = $app->request()->post('method');
	$token = $app->request()->post('token');
	$getToken = $app->request()->get('token');

	//// Token de seguridad CSRF. 
	///  Puede ponerse a funcionar en PRO
	if (isset($token )) {
	    $token = array('csrf_token'=>$token);
	} else if (isset($getToken)) {
	    $token = array('csrf_token'=>$getToken);
	} else {
	    $token = array('csrf_token'=>$searchTerms["token"]);     
	}


	if( ($method == "add-big") || ($method == "add-small") || ($method == "add-text") ){
	  // TWEET AL AUTOR AGRADECIMIENTO
	  $json = $app->request()->post('json');

	  $twt = json_decode($json, true);
	  $greetingsText = '@' . $twt['screen_name'] . ", tu tuit está entre los mejores de nuestro radar social para @eurovision_tve. ¡Míralo! http://lab.rtve.es/eurovision/";
	  echo "AGRADECIMIENTO";
	  /* Descomentar en PRO*/
	  //sendTweet($twt['screen_name'], $greetingsText);
	}

	/* Descomentar en PRO*/
	//checkToken($token);
	switch ($method) {

		// borra un elemento
		case 'delete':
			// Comprobamos que el objeto este definido
			$id = $app->request()->post('id');
		    if (isset($id)) {
				deleteData($id);

				$app->response->setStatus(200);
				echo 'deleted';
		    } else {
		    	$app->response()->setStatus(404);
		    	echo 'error';
		    }
		    break;
		// añade un tuit de manera manual
		case 'check':
			$link = $app->request()->post('link');
			$tag = $app->request()->post('tag');
			$type = $app->request()->post('type');

		    if (!isset($link) || !isset($tag) || !isset($type)) $app->response()->setStatus(404);
		    	// cargamos datos de tweets
		     
		    if(strpos($link, 'twitter.com') != false && strpos($link, 'status') != false) {
				$twtFull = getTweetFullWithLink($link);
				if ( $twtFull ) {
					$twt = processTweet($twtFull);
					$usr = processTwUser($twtFull->user);

					if ( isset($tag)) {
					  	$twt['tags']  = array($tag);
					}
					if (isset($type) ) {
					  	$twt['type'] = $type;
					}
					if (isset($usr)) {
					  	$twt['userData'] = $usr;
					}

					if(is_array($twt) && !isset($twt['media'])) { $twt['type'] = 'txt'; }

				  	// guardamos
					addData($twt);

					// TWEET AL AUTOR AGRADECIMIENTO
					$greetingsText = '@' . $twt['screen_name'] . ", tu tuit está entre los mejores de nuestro radar social para @eurovision_tve. ¡Míralo! http://lab.rtve.es/eurovision";
					echo "AGRADECIMIENTO";
					/* Descomentar en PRO */
					sendTweet($twt['screen_name'], $greetingsText);

					$app->response->setStatus(200);
					echo $method.'done';
					return true;

				} else {
					$app->response()->setStatus(404);
					echo 'error';
					return false;
				}

			// procesado de fotos de instagram
		    } elseif (strpos($link, 'instagram.com') != false || strpos($link, 'instagr.am') != false) {

				$url = urldecode(rtrim($link));

				$igFull = getIgUrl($url);

				if($igFull) {

					$ig = processIg($igFull->data);
					$ig['userData'] = processIgUser($igFull->data->user);

					if ( isset($tag)) {
					  	$ig['tags']  = array($tag);
					}

					if (isset($type) ) {
					  	$ig['type'] = $type;
					}

					// guardamos
					addData($ig);

					$app->response->setStatus(200);
					echo $method.'done';
					return true;

				} else {
					$app->response()->setStatus(404);
					echo 'error';
					return false;
				}

		    // procesado de momentos de rtve.es
		    } elseif (strpos($link, 'www.rtve.es/mt') != false) {


				$url = urldecode(rtrim($link));
				$urlarr = explode('/', $url);
				$id = rtrim(end($urlarr));
				$momento = getMtveUrl($id);

				if(count($momento->page->items)) {
					$momentothemed = processMtve($momento->page->items[0]);

					if($momentothemed){ 
						print_r($momentothemed);

						if ( isset($tag)) {
							$momentothemed['tags']  = array($tag);
						}
						if (isset($type) ) {
							$momentothemed['type'] = $type;
						}

						// guardamos
						addData($momentothemed);

						$app->response->setStatus(200);
						echo $method.'done';
						return true;

					} else {
						$app->response()->setStatus(404);
						echo 'error';
					}
				} else {
					$app->response()->setStatus(404);
					echo 'error';
					return true;
				}

		    } elseif (strpos($link, 'vine.co') != false) {

				$url = urldecode(rtrim($link));
				$dataVine = getVine($url);
				if ( isset($tag)) {
					$dataVine['tags']  = array($tag);
				}
				if (isset($type) ) {
					$dataVine['type'] = $type;
				}

				// guardamos
				addData($dataVine);

				$app->response->setStatus(200);
				echo $method.'done';
				return true;
			} else {
				$app->response()->setStatus(404);
		      	echo 'error';
		    };

		  	break;

	  	// mueve un post de posicion
		case 'move':

			$newOrderElems = $app->request()->post('newOrderElems');
			moveData(json_decode($newOrderElems));

			$app->response->setStatus(200);
			echo $method.'done';
			return true;

			break;

		// añade post pulsando sobre un icono del elemento, como imagen o video grande, pequeñ@ (parrilla de 4) o bien como texto solamente
		case 'add-big':
		case 'add-small':
		case 'add-text':
			$id = $app->request()->post('id');

			if(isset($id)){
			  	addData($id, $method);

			  	$app->response->setStatus(200);
			  	echo $method.'done';
			  	return true;
			}
			break;

		// cambia estado añadido a + comentados
		case 'switch-popular':
			$id = $app->request()->post('id');

			if(isset($id)){
			    switchPopular($id);

			    $app->response->setStatus(200);
			    echo $method.'done';
			    return true;
			}
			break;

		// cambia estado añadido a señal TV, o bien a señal tv_sent (periodista que está en la propia gala filtrando antes de mandarlo a TV)
		case 'switch-tv':
		case 'switch-tv-sent':
			$id = $app->request()->post('id');
			$text = $app->request()->post('text');
			$text = filter_var($text, FILTER_VALIDATE_BOOLEAN);

			if(isset($id)){
			    
			    $method == 'switch-tv' ? StaticDB::switchTV($id, $text) : StaticDB::switchTVsent($id);

			    $app->response->setStatus(200);
			    echo $method.'done';
			    return true;
			}
			break;

		case 'send-tv':
			$text = $app->request()->post('text');
			$text = filter_var($text, FILTER_VALIDATE_BOOLEAN);

			staticDB::sendTVPosts($text);

			$app->response->setStatus(200);
			echo $method.'done';
			break;

		// se guarda una nueva tabla de favoritos
		case 'save-favs':
			$json = $app->request()->post('json');

			if(isset($json)){ 
			    staticDB::saveFavorites($json);

			    $app->response->setStatus(200);
			    echo $method.'done';
			    return true;
			}
			break;

		case 'cleanData':

			$rightClean = cleanData();

			if ($rightClean) {
			  print("<div style='color:green;'>-- Clean DONE --</div><br/>");
			  print("<a href='javascript:void(window.history.back());'><button><< OK! Volver</button></a>");
			} else {
			  print("<div style='color:red;'>-- Clean ERROR --</div><br/>");
			  print("<a href='javascript:void(window.history.back())'><button><< Volver</button></a>");
			}

			$app->response->setStatus(200);
			echo $method.'done';
			break;

		case 'deleteMoment':

	        $id = $app->request()->post('desc');

			if(isset($id)){ 
			    staticDB::deleteMoment($id);

			    $app->response->setStatus(200);
			    echo 'MomentRemoved';
			    return true;
			} else {
				$app->response()->setStatus(404);
		      	echo 'error';
			}

			break;

		case 'getMoments':
			
		    $result = staticDB::getMoments();

		    $app->response->setStatus(200);
		    echo json_encode($result);
		    return true;
			
			break;

		case 'addMoment':

	        $link = $app->request()->post('link');
	        $date = $app->request()->post('date');
	        $desc = $app->request()->post('desc');

			if ((isset($link)) && (isset($date)) && (isset($desc))){
			    staticDB::addMoment($link, $date, $desc);

			    $app->response->setStatus(200);
			    echo 'MomentInserted';
			    return true;
			} else {
				$app->response()->setStatus(404);
		      	echo 'error';
			}
			
			break;

		default:
			$app->response->setStatus(404);
			echo 'error. No se indicó acción válida.';
		break;
	}

});

$app->get('/backoffice/', function() use($app,$twig,$viewConfig){

	$password = (!is_null($app->request->get('p'))) ? $app->request->get('p') : '';
	//Se comprueba la existencia y validez del md5 pasado por cabecera.
	if ($password != '' && isValidMd5($password)) {

	    if ($password == md5('dRtVe2015goyA')) {
	        //Se da valor al token

	        $token = NoCSRF::generate( 'csrf_token' );
	        $viewConfig['token'] = $token;
			echo $twig->render('backoffice.html', $viewConfig);
			return;
	    }
	}
	echo '';

});

$app->get('/backoffice/tv/', function() use($app,$twig,$viewConfig){

	$password = (!is_null($app->request->get('p'))) ? $app->request->get('p') : '';
	//Se comprueba la existencia y validez del md5 pasado por cabecera.
	if ($password != '' && isValidMd5($password)) {

	    if ($password == md5('dRtVe2015goyA')) {
	        //Se da valor al token

	        $token = NoCSRF::generate( 'csrf_token' );
	        $viewConfig['token'] = $token;

	        //Comprobamos si lo que se pide son los elementos ya enviados a TV o los que están por enviar
	        $sent = (!is_null($app->request->get('sent'))) ? $app->request->get('sent') : '';
	        if ($sent != '') {
	        	$viewConfig['sent'] = true;
	        	$viewConfig['panelText'] = 'Enviados a TV';
	        	$viewConfig['totals'] = StaticDB::getTvPosts(true);
	        } else {
	        	$viewConfig['sent'] = false;
	        	$viewConfig['panelText'] = 'Por enviar a TV';
	        	$viewConfig['totals'] = StaticDB::getTvPosts(false);
	        }
	        
			echo $twig->render('backoffice-tv.html', $viewConfig);
			return;
	    }
	}
	echo '';

});

//$app->get('/test/', function() use($app,$twig,$viewConfig){
//	echo $twig->render('index.html', $viewConfig);
	//echo $twig->render('comingSoon.html', $viewConfig);
//});

//Run the Slim application
$app->run();