<?php
namespace App\Libraries;
use App\Libraries\Helper;
use Carbon\Carbon;
use Rumenx\Feed\FeedFactory;

class Helper {
	public static function escapeLike($string){
		$search = array('%', '_');
		$replace   = array('\%', '\_');
		$string = str_replace($search, $replace, $string);
		$string = explode(" ", $string);
		return implode("%", $string);
	}

	public static function formatTimestamp($timestamp) {
		return Carbon::createFromTimestamp($timestamp)->format("Y-m-d");
	}

	public static function makeFeed($model, $title, $cache = 60) {

	    switch($title) {
	    case("new"):
		    $feed_title = 'Newest Articles';
		    $feed_description = 'Newest interesting articles from Wikipedia. Keep exploring.';
		    break;
	    case( "popular"):
		    $feed_title = 'Popular Articles';
		    $feed_description = 'The most popular articles. Keep exploring.';
		    break;
	    case( "mastodon"):
		    $feed_title = 'Feed for Mastodon';
		    $feed_description = 'New articles are published automatically to Mastodon.';
		    break;
	    default:
		    $feed_title = 'Search for: ' . $title;
		    $feed_description = 'All articles for "' . $title . '".';
		    break;
	    }
	    // create new feed
	    $feed = FeedFactory::create();

	    // multiple feeds are supported
	    // if you are using caching you should set different cache keys for your feeds

	    // cache the feed for $cache minutes (second parameter is optional)
	    $feed->setCache($cache, 'feed_' . $title);

	    // check if there is cached feed and build new only if is not
	    if (!$feed->isCached())
	    {

	       // set your feed's title, description, link, pubdate and language
	       $feed->setTitle($feed_title);
	       $feed->setDescription($feed_description);
	       #$feed->setLogo('http://yoursite.tld/logo.jpg');
	       $feed->setLink(url('feed/' . $title));
	       $feed->setDateFormat('datetime'); // 'datetime', 'timestamp' or 'carbon'
	       $feed->setPubdate($model[0]->created_at);
	       $feed->setLang('en');
	       $feed->setShortening(false); // true or false

	       if ( "mastodon" == $title || "mastodon_test" == $title ) {
		       $feed->setTextLimit(500); // maximum length of description text
	       } else {
		       $feed->setTextLimit(100); // maximum length of description text
	       }

	       foreach ($model as $post)
	       {

		       $desc = ($post->excerpt_html);
		       $categories = null;

		       if ( "mastodon" == $title || "mastodon_test" == $title ) {

			       $cat_len= 0;

			       if ( ! $post->getCategories()->get()->isEmpty()  ) {

				       $categories_ar = array("#MostDiscussed");

				       foreach( $post->getCategories()->get() as $cat ) {

					       // uppercase for every word in a possible multi worded hashtag
					       $tmp_cat = ucwords($cat->name);

					       // strip everything after / for brevity
					       if ( false !== strpos($tmp_cat, "/") )
						       $tmp_cat = substr($tmp_cat, 0, strpos($tmp_cat, "/"));

					       // replace any non-alphanumeric character except underscore, because
					       // it's not allowed to be used in a hashtag
					       $tmp_cat = preg_replace("/[^A-Za-z0-9_]/", '', $tmp_cat);

					       // trim just in case
					       $tmp_cat = trim($tmp_cat);

					       // if it's not empty, add it to the hashtag array
					       if ( "" != $tmp_cat )
						       $categories_ar[] = "#". $tmp_cat;
				       }

				       // remove possible duplicates (because stripping after "/")
				       $categories_ar = array_unique($categories_ar);

				       // join to one string
				       $categories = implode(" ", $categories_ar);

				       $cat_counter = $post->getCategories()->get()->count();
				       $cat_len = mb_strlen($categories, "UTF-8");
			       }
			       
			       $link = env('APP_URL') . "/article/" . $post->id;

			       // max desc length is 500 - 23 (Link) - $cat_len - 2 (white spaces)
			       $max_len = 500 - 23 - $cat_len - 2;

				if ( "mastodon_test" == $title ) {
				       $desc = Helper::mastodon_summary($desc, $max_len);
				}else {
				       $desc = Helper::first_sentence($desc, $max_len);
				       #$desc = Helper::mastodon_summary($desc, $max_len);
				}

			       $desc .= " " . $categories;# . $discussions;

			       // set item's title, author, url, pubdate, description, content, enclosure (optional)*
			       $feed->addItem([
					'title' => $desc, // mastofeed.org seems to ignore the description field
					'author' => env('APP_NAME'),
					'url' => $link,
					'link' => $link,
					'pubdate' => $post->created_at,
					'description' => $desc,
					'content' => $desc
			       ]);

		       } else {
			       if ( ! $post->getCategories()->get()->isEmpty()  ) {
				       $categories = "<br>";
				       foreach( $post->getCategories()->get() as $cat ) {
					       $categories .= "<a href='". \URL::to('/topic/' . $cat->name) ."'>". $cat->name . "</a> | ";
				       }
				       $categories = rtrim($categories, " | ");
				       $desc .= "<br>Topics:";
				       $desc .= $categories;
			       }

			       $discussions = "<br>";
			       foreach( $post->getDiscussions()->orderBy('comments', 'desc')->get() as $dis ) {
				       $discussions .= "<a href='" . $dis->source_url . "'>" . $dis->title . "</a> ";
				       $discussions .= $dis->upvotes . " Upvotes | " . $dis->comments . " Comments<br>";
			       }
			       $desc .= "<br><br>Discussions:";
			       $desc .= $discussions;

			   // set item's title, author, url, pubdate, description, content, enclosure (optional)*
			       $feed->addItem([
					'title' => $post->title,
					'author' => env('APP_NAME'),
					'url' => \URL::to($post->url),
					'link' => \URL::to($post->url),
					'pubdate' => $post->created_at,
					'description' => $desc,
					'content' => $desc
			       ]);
		       }
	       }

	    }

	    // first param is the feed format
	    // optional: second param is cache duration (value of 0 turns off caching)
	    // optional: you can set custom cache key with 3rd param as string
	    $xml = $feed->render('atom', $cache, 'feed_' . $title);
	    return response($xml, 200, [
            	'Content-Type' => 'application/xml'
	    ]);
	}

	public static function first_sentence($content, $max_len = NULL) {

		$content = html_entity_decode(strip_tags($content));
		$content = ltrim($content);
		$pos = strpos($content, '.');

		if($pos === false) {
			if ( is_null($max_len) ) {
				return $content;
			} else {
				return substr($content, 0, $max_len);
			}
		}
		else {
			return substr($content, 0, $pos+1);
		}

	}

	private static function next_sentence($content, $max_len = NULL) {

		$content = ltrim($content);
		$pos = strpos($content, '.');

		if($pos === false) {
			if ( is_null($max_len) ) {
				return $content;
			} else {
				return substr($content, 0, $max_len);
			}
		} else {
			return substr($content, 0, $pos+1);
		}

	}

	/**
	 * Make sure to toot as much text as possible while still staying below the limit of 500 chars -link (23 chars) - 2 (white spaces) - possible hashtags
	 */
	public static function mastodon_summary($excerpt, $max_len = 475){

		/**
		 * Strip HTML from Wikipedia excerpt
		 */
		$excerpt = ltrim(html_entity_decode(strip_tags($excerpt)));

		/**
		 * The toot to be returned
		 */
		$content = "";

		/**
		 * https://stackoverflow.com/questions/16377437/split-a-text-into-sentences
		 */
		$sentences = preg_split('/(?<=[.?!])\s+(?=[a-z])/i', $excerpt);
		echo "<pre>";
		echo "-----------------------";
		var_dump($excerpt);
		var_dump($sentences);

		for ( $i = 0; $i < count($sentences); $i++ ) {
			#if ( mb_strlen($content) < $max_len && (mb_strlen($content) + mb_strlen($sentences) ) {
			if ( mb_strlen($content) < $max_len && (mb_strlen($content) + mb_strlen($sentences) ) < $max_len ){

				//var_dump(rtrim(ltrim($sentences[$i])));
				$content .= rtrim(ltrim($sentences[$i]));
				var_dump("ok", $max_len);

				$max_len = $max_len - mb_strlen($sentences[$i]);
				var_dump("ok", $max_len);

			} else {
				var_dump("fail", mb_strlen($content), $max_len);
				break;
			}
		}
		return $content;

		echo "<pre>";
		while ( mb_strlen($content) < $max_len ) {

			/**
			 * Get next sentence
			 */
			$next_sentence = Helper::next_sentence($excerpt, $max_len);
			var_dump($next_sentence);

			if ( "" == $next_sentence ) {
				break;
			}

			/**
			 * Check if $content + $next_sentence is still under $max_len
			 */
			if ( (mb_strlen($content) + mb_strlen($next_sentence)) < $max_len ) {

				/**
				 * add text
				 */
				$content .= $next_sentence;

				/**
				 * Recalc $max_len
				 */
				$max_len = $max_len - mb_strlen($next_sentence);

				/**
				 * Remove sentence from excerpt
				 */
				$excerpt = substr($excerpt, mb_strlen($next_sentence));

			} else {
				break;
			}
		}

		return $content;
	}
}
