<?php

namespace Api;

use User_Service_Auth;
use Feed_Service_Process;
use Tag_Service_Process;
use Feed_Service_Feed;
use Phpfox_Component;

class Feed extends \Core\Api {

	public function delete($id, $is_page = false, $app_id = null) {
		$this->auth();

		if ($is_page) {
			$this->db->delete(':pages_feed', ['feed_id' => $id]);
            if ($app_id !== null)
            {
                $this->db->delete(':feed', ['type_id' => $app_id, 'parent_feed_id' => $id]);
            }

		} else {
			$this->db->delete(':feed', ['feed_id' => $id]);
		}
	}

	public function put($id, $put = null, $is_callback = false) {
		if ($put !== null) {
			$this->assign($put);
		}

		$this->requires([
			'content'
		]);

		$old = $this->get($id, null, $is_callback);
		$oldContent = (array) $old->content;

		$privacy = 0;
		$content = $this->request->get('content');
		if (!is_string($content)) {
			$content = json_encode(array_merge($oldContent, (array) $content), JSON_UNESCAPED_UNICODE);
		}

		if ($this->request->get('privacy')) {
			$privacy = (int) $this->request->get('privacy');
		}

		$table = ':feed';
		if ($is_callback) {
			$table = ':pages_feed';
		}
		$this->db->update($table, ['content' => $content, 'privacy' => $privacy], ['feed_id' => $id]);

		return $this->get($id, null, $is_callback);
	}

	/**
	 * @return Feed\Object|Feed\Object
	 */
	public function post($post = []) {
		if ($post) {
			$this->assign($post);
		}
		$this->auth();
		$this->requires([
			'type_id',
			'content'
		]);

		if (!$this->request->get('content')) {
			throw error('Add some content.');
		}

		$tags = [];
		$content = $this->request->get('content');
		if (!is_string($content)) {
			if (is_array($content)) {
				foreach ($content as $key => $value) {
					if (is_object($value) && $value instanceof \Core\Text\Parse) {
						$tags = $value->tags();
						$content[$key] = $value->text();
					}
				}
			}

			$content = json_encode($content, JSON_UNESCAPED_UNICODE);
		}

		$fields = [
			'type_id' => $this->request->get('type_id'),
			'content' => $content,
			'privacy' => $this->request->get('privacy')
		];

        $is_callback = false;

        if ($this->request->get('module_id')) {
            $is_callback = true;
			Feed_Service_Process::instance()->callback([
				'module' => $this->request->get('module_id'),
				'table_prefix' => 'pages_',
				'item_id' => $this->request->get('module_item_id'),
				'has_content' => true,
				'add_to_main_feed' => true
			]);


			$fields['parent_user_id'] = User_Service_Auth::instance()->getUserId();
			$fields['item_id'] = $this->request->get('module_item_id');

			if (!defined('PHPFOX_PAGES_IS_PARENT_FEED'))
			{
				define('PHPFOX_PAGES_IS_PARENT_FEED', true);
			}
		}
		$feedId = Feed_Service_Process::instance()->add($fields);

		$feed = $this->get($feedId, null, $is_callback);
		if (count($tags)) {
			Tag_Service_Process::instance()->add($feed->app, $feed->id, user()->id, $tags);
			db()->update(':feed', ['item_id' => $feedId], ['feed_id' => $feedId]);
		}

		return $feed;
	}

	/**
	 * @return Feed\Object|Feed\Object[]
	 */
	public function get($params = null, $app_id = null, $is_callback = false) {
		$feeds = [];
		$isSingle = false;
		if (is_numeric($params)) {
			$id = (int) $params;

			$params = [];
			$params['id'] = $id;
			$isSingle = true;
		}
		else if (is_string($params)) {
			$type = $params;
			$params = [];
			$params['type_id'] = $type;
		}

		if (!empty($params['isSingle']))
        {
            $isSingle = $params['isSingle'];
        }

		if (isset($_GET['page'])) {
			$params['page'] = $_GET['page'];
		}

        if (isset($_GET['last-item'])) {
			$params['last-item'] = $_GET['last-item'];
            unset($params['page']);
		}

		if (isset($_GET['limit'])) {
			$params['limit'] = $_GET['limit'];
		}

		if (isset($_GET['when'])) {
			$params['when'] = $_GET['when'];
		}

		if (isset($_GET['friends'])) {
			$params['friends'] = $_GET['friends'];
		}

		if (is_array($params)) {
			$params['is_api'] = true;
		}

		if ($is_callback && !empty($params['id'])) {
			$callback = storage()->get('feed_callback_' . $params['id']);
			
			if (isset($callback->value)) {
				Feed_Service_Feed::instance()->callback((array) $callback->value);
			}
		}
        $rows = Feed_Service_Feed::instance()->get($params);

		foreach ($rows as $row) {
			$object = [
				'id' => (int) $row['feed_id'],
				'app' => $row['type_id'],
				'content' => $row['content'],
				'privacy' => (int) $row['privacy'],
				'total_likes' => (int) $row['feed_total_like'],
				'total_comments' => (int) (isset($row['total_comment']) ? $row['total_comment'] : 0),
				'total_view' => (int) $row['total_view'],
				'user' => $row
			];

			if ($row['type_id'] != 'app') {
				$object['is_app'] = true;
				$object['custom'] = [
					'item_id' => $row['item_id'],
					'url' => $row['feed_link'],
					'external_url' => (isset($row['feed_link_actual']) ? $row['feed_link_actual'] : ''),
					'title' => $row['feed_title'],
					'description' => (isset($row['feed_content']) ? $row['feed_content'] : null),
					'time_stamp' => $row['feed_time_stamp'],
					'image' => (isset($row['feed_image']) ? $row['feed_image'] : null),
					'type' => $row['type_id'],
					'privacy' => $row['privacy'],
					'likes' => $row['feed_total_like'],
					'is_liked' => $row['feed_is_liked'],
					'comments' => (isset($row['total_comment']) ? $row['total_comment'] : 0),
				];
			}

			$feeds[] = new Feed\Object($object);
		}

		if ($isSingle) {
			if (!isset($feeds[0])) {
				throw new \Exception('Unable to find this feed.');
			}

			$feed = $feeds[0];
			if (isset($callback) && isset($callback->value)) {
				$feed->module_id = $callback->value->module;
				$feed->module_item_id = $callback->value->item_id;
			}

			if (!$this->isApi() && $feed instanceof Feed\Object) {
				$app_object = null;
				if ($app_id !== null) {
					$app_object = app($app_id);
				}

				$aFeed = [
                    'app_object' => (isset($app_object->id) ? $app_object->id : null),
                    'is_app' => $feed->is_app,
                    'comment_type_id' => 'app',
                    'privacy' => $feed->custom->privacy,
                    'comment_privacy' => $feed->custom->privacy,
                    'like_type_id' => 'app',
                    'feed_is_liked' => $feed->custom->is_liked,
                    'item_id' => $feed->custom->item_id,
                    'user_id' => $feed->user->id,
                    'total_comment' => $feed->custom->comments,
                    'total_like' => $feed->custom->likes,
                    'feed_link' => $feed->custom->url,
                    'feed_title' => $feed->custom->title,
                    'feed_display' => 'view',
                    'feed_total_like' => $feed->custom->likes,
                    'report_module' => $feed->custom->type,
                    'report_phrase' => _p('Report'),
                    'time_stamp' => $feed->custom->time_stamp
                ];
                if (isset($params['feed_table_prefix']))
                {
                    $aFeed['feed_table_prefix'] = $params['feed_table_prefix'];
                }
                if (isset($params['share_type_id']))
                {
                    $aFeed['share_type_id'] = $params['share_type_id'];
                }

				Phpfox_Component::setPublicParam('aFeed', $aFeed);
			}

			return $feed;
		}

		return $feeds;
	}
}