<?php

namespace Core\App;

use Core\Installation\FileHelper;
use Phpfox;
class Object extends \Core\Objectify
{

    /**
     * App ID. Can only be alphanumeric and may contain the underscore
     *
     * @var int
     */
    public $id;

    public $apps_dir;

    public $is_phpfox_default = false;

    public $admin_cp_menu_ajax = false;

    private $default_phpfox_apps = [
        '__module_ad',
        '__module_admincp',
        '__module_announcement',
        '__module_api',
        '__module_attachment',
        '__module_ban',
        '__module_blog',
        '__module_captcha',
        '__module_comment',
        '__module_contact',
        '__module_core',
        '__module_custom',
        '__module_egift',
        '__module_error',
        '__module_event',
        '__module_feed',
        '__module_forum',
        '__module_friend',
        '__module_invite',
        '__module_language',
        '__module_like',
        '__module_link',
        '__module_log',
        '__module_mail',
        '__module_marketplace',
        '__module_music',
        '__module_newsletter',
        '__module_notification',
        '__module_page',
        '__module_pages',
        '__module_photo',
        '__module_poke',
        '__module_poll',
        '__module_privacy',
        '__module_profile',
        '__module_quiz',
        '__module_report',
        '__module_request',
        '__module_rss',
        '__module_search',
        '__module_share',
        '__module_subscribe',
        '__module_tag',
        '__module_theme',
        '__module_track',
        '__module_user',
        'PHPfox_AmazonS3',
        'PHPfox_CDN',
        'PHPfox_CDN_Service',
        'PHPfox_Core',
        'PHPfox_Facebook',
        'PHPfox_Flavors',
        'PHPfox_Groups',
        'PHPfox_IM',
        'PHPfox_Twemoji_Awesome',
        'PHPfox_Videos',
        'PHPfox_reCAPTCHA',
    ];

    /**
     * Name of the app
     *
     * @var string
     */
    public $name;

    /**
     * Full path to the app. This is built by the system
     *
     * @var string
     */
    public $path;
    
    public $module_id;
    
    public $is_active;

    /**
     * Define if this is an old school module or app
     *
     * @var bool
     */
    public $is_module = false;

    /**
     * Full path to icon anywhere on the internet(s)
     *
     * @var string
     */
    public $icon;

    /**
     * Version of the app
     *
     * @var string
     */
    public $version = '4.0.0';

    /**
     * Actual version of the app. This is created by the system
     *
     * @var string
     */
    public $currentVersion;

    /**
     * If an app is external, these are the auth ID/key
     *
     * @var object
     */
    public $auth = [
        'id'  => '',
        'key' => ''
    ];

    /**
     * Attach a menu to the AdminCP for your app
     *
     * @var array
     */
    public $admincp_menu = [];

	public $admincp_action_menu = [];

    /**
     * When admins view your app connect to a custom route
     *
     * @var string
     */
    public $admincp_route;

    /**
     * Global settings for your app and for admins to edit
     *
     * @var array
     */
    public $settings = [];

    /**
     * Webhooks you wish to attach an event to
     *
     * @var array
     */
    public $webhooks = [];

    /**
     * List of external routes, only needed if route is using API
     *
     * @var array
     */
    public $routes = [];

    /**
     * Attach anything to each page of the sites <head></head>
     *
     * @var array
     */
    public $head = [];

    public $js_phrases = [];

    /**
     * Attach JavaScript files. Full links to the JS file itself
     *
     * @var array
     */
    public $js = [];


    public $map = [];

    public $map_search = [];

    public $footer = [];

    /**
     * Internal phpFox app id. Created by the system. Move along.
     *
     * @var int
     */
    public $internal_id;

    public $store_id;

    /**
     * Company that created the app
     *
     * @var string
     */
    public $vendor;

    /**
     * User group settings your app may need and for admins to edit
     *
     * @var array
     */
    public $user_group_settings = [];

    /**
     * Define if your app requires another app or a specific PHP version or PHP lib
     *
     * @var array
     */
    public $requires = [];

    /**
     * Using open source code? Sharing is caring.
     *
     * @var array
     */
    public $credits = [];

    /**
     * @var array
     */
    public $menu = [];

    /**
     * @var bool
     */
    public $is_core = false;

    /**
     * @var array
     */
	public $blocks = [];

    /**
     * @var string
     */
	public $admincp_help = '';

    /**
     * @var array
     */
    public $notifications = [];

    /**
     * Name of publisher
     *
     * @var string
     */
    public $publisher = 'n/a';

    /**
     * Home page of publisher
     *
     * @var string
     */
    public $publisher_url = '';

    public $allow_disable = true;

    /**
     * Object constructor.
     *
     * @param string $keys
     */
    public function __construct($keys)
    {
        parent::__construct($keys);

        if (in_array($this->id, $this->default_phpfox_apps)) {
            $this->is_phpfox_default = true;
        }
        if (!$this->icon) {
            $name = isset($this->name[0]) ? $this->name[0] : 'pf';
            $parts = explode(' ', $this->name);
            if (isset($parts[1])) {
                $parts[1] = trim($parts[1]);
            }
            if (isset($parts[1]) && !empty($parts[1])) {
                $name .= $parts[1][0];
            } elseif (isset($this->name[1])) {
                $name .= $this->name[1];
            }
            $class_color = '_' . $name;
            switch (str_replace('__module_', '', strtolower($this->id))){
                case 'ad':
                    $name = '<i class="fa fa-bullhorn" aria-hidden="true"></i></i>';
                    break;
                case 'announcement':
                    $name = '<i class="fa fa-paper-plane" aria-hidden="true"></i></i>';
                    break;
                case 'attachment':
                    $name = '<i class="fa fa-paperclip" aria-hidden="true"></i></i>';
                    break;
                case 'blog':
                    $name = '<i class="fa fa-pencil-square-o" aria-hidden="true"></i></i>';
                    break;
                case 'captcha':
                    $name = '<i class="fa fa-shield" aria-hidden="true"></i></i>';
                    break;
                case 'comment':
                    $name = '<i class="fa fa-commenting-o" aria-hidden="true"></i></i>';
                    break;
                case 'contact':
                    $name = '<i class="fa fa-phone" aria-hidden="true"></i></i>';
                    break;
                case 'event':
                    $name = '<i class="fa fa-calendar" aria-hidden="true"></i></i>';
                    break;
                case 'egift':
                    $name = '<i class="fa fa-gift" aria-hidden="true"></i>';
                    break;
                case 'feed':
                    $name = '<i class="fa fa-bars" aria-hidden="true"></i>';
                    break;
                case 'forum':
                    $name = '<i class="fa fa-comments-o" aria-hidden="true"></i></i>';
                    break;
                case 'friend':
                    $name = '<i class="fa fa-users" aria-hidden="true"></i></i>';
                    break;
                case 'invite':
                    $name = '<i class="fa fa-envelope-open-o" aria-hidden="true"></i></i>';
                    break;
                case 'mail':
                    $name = '<i class="fa fa-envelope-o" aria-hidden="true"></i></i>';
                    break;
                case 'marketplace':
                    $name = '<i class="fa fa-shopping-bag" aria-hidden="true"></i></i>';
                    break;
                case 'music':
                    $name = '<i class="fa fa-music" aria-hidden="true"></i></i>';
                    break;
                case 'newsletter':
                    $name = '<i class="fa fa-newspaper-o" aria-hidden="true"></i></i>';
                    break;
                case 'notification':
                    $name = '<i class="fa fa-bell-o" aria-hidden="true"></i></i>';
                    break;
                case 'pages':
                    $name = '<i class="fa fa-flag" aria-hidden="true"></i></i>';
                    break;
                case 'photo':
                    $name = '<i class="fa fa-picture-o" aria-hidden="true"></i></i>';
                    break;
                case 'poke':
                    $name = '<i class="fa fa-hand-o-right" aria-hidden="true"></i></i>';
                    break;
                case 'poll':
                    $name = '<i class="fa fa-bar-chart" aria-hidden="true"></i></i>';
                    break;
                case 'quiz':
                    $name = '<i class="fa fa-question-circle" aria-hidden="true"></i></i>';
                    break;
                case 'rss':
                    $name = '<i class="fa fa-rss" aria-hidden="true"></i>';
                    break;
                case 'subscribe':
                    $name = '<i class="fa fa-hand-o-up" aria-hidden="true"></i></i>';
                    break;
                case 'tag':
                    $name = '<i class="fa fa-tags" aria-hidden="true"></i>';
                    break;
                case 'track':
                    $name = '<i class="fa fa-eye" aria-hidden="true"></i>';
                    break;
                default:
                    break;
            }

            $this->icon = '<b class="app_icons"><i class="app_icon ' . strtolower($class_color) . '">' . $name . '</i></b>';
        } else {
            $this->icon = '<div class="app_icons image_load" data-src="' . $this->icon . '"></div>';
        }

        if (!$this->is_module) {
            $file = PHPFOX_DIR_SETTINGS . md5($this->id . \Phpfox::getParam('core.salt')) . '.php';
            if (file_exists($file)) {
                $this->auth = (object)require($file);
                $this->internal_id = (isset($this->auth->internal_id) ? $this->auth->internal_id : 0);
            }
        }

        if (is_array($this->auth)) {
            $this->auth = (object)$this->auth;
        }

        if (file_exists($this->path . 'core.json')) {
            $this->is_core = true;
        }

	    if ($this->admincp_help) {
		    $this->admincp_help = \Phpfox_Url::instance()->makeUrl($this->admincp_help);
	    }
	    if (isset($keys->_admin_cp_menu_ajax)) {
            $this->admin_cp_menu_ajax = ($keys->_admin_cp_menu_ajax) ? true : false;
        }
	    if (is_array($keys)) {
            $this->is_active = (isset($keys['is_active'])) ? $keys['is_active'] : true;
            $this->publisher = (isset($keys['publisher'])) ? $keys['publisher'] : 'n/a';
            if ($this->publisher == 'phpfox') {
                $this->publisher = 'phpFox';
            }
            if (isset($keys['publisher']) && strtolower($keys['publisher']) == 'phpfox') {
                $this->publisher_url = 'https://store.phpfox.com/';
            }
            if (isset($keys['allow_disable'])) {
                $this->allow_disable = $keys['allow_disable'];
            }
        } elseif (is_object($keys)) {
            /**
             * @var $keys App/App
             */
            $this->publisher = $keys->_publisher;
            $this->publisher_url = $keys->_publisher_url;
            $this->is_active = $keys->isActive();
            $this->apps_dir = $keys->_apps_dir;
        }
    }

    public function delete($val = null)
    {
        if ($this->menu && isset($this->menu->url)) {
            \Phpfox_Database::instance()->delete(':menu', ['m_connection' => 'main', 'url_value' => $this->menu->url]);
        }

        (new \Core\Home(PHPFOX_LICENSE_ID, PHPFOX_LICENSE_KEY))->uninstall([
            'product_id' => $this->internal_id
        ]);

        $path = $this->path;
        /*https://github.com/moxi9/phpfox/issues/523*/
        $json_path = $path . 'app.json';
        if (file_exists($json_path)) {
            $json = json_decode(file_get_contents($json_path));
            //remove menu if exist
            if (isset($json->menu)) {
                \Admincp_Service_Menu_Process::instance()->delete($json->menu->url, true);
            }

            if (isset($json->alias)) {
                db()->delete(':module', ['module_id' => $json->alias]);
            }
        }

        \Phpfox_Cache::instance()->remove();
        //un-installation Code
        if (file_exists($path . 'uninstall.php')) {
            \Core\App\Installer::$method = 'OnUninstall';
            \Core\App\Installer::$basePath = $path;
            require_once($path . 'uninstall.php');
        }

	    if ($this->blocks) {
		    foreach ($this->blocks as $block) {
			    db()->delete(':block', ['component' => $block->callback]);
			    db()->delete(':cache', ['file_name' => '_apps_block_' . $block->callback]);
		    }
	    }

        if (is_dir($path)) {
	        \Phpfox_File::instance()->delete_directory($path);
        }
    }

    /**
     * @param $object
     *
     * @return Map
     */
    public function map($object, $feed)
    {
        if (substr($object, 0, 1) == '{') {
            $object = json_decode($object);
        }

        return new Map($this, (object)$object, $this->map, $feed);
    }

    /**
     * Export application
     *
     * @return string
     */
    public function export()
    {
        $zipFile = PHPFOX_DIR_FILE . 'static'. PHPFOX_DS . 'package'.PHPFOX_DS.'phpfox-app-' . $this->id . '.zip';
        $paths = [$this->path];
        $helper = new FileHelper();
        $packageInformation = [
            'id' => $this->id,
            'apps_dir' => $this->apps_dir,
            'internal_id' => $this->internal_id,
            'version' => $this->version,
            'current_version' => $this->currentVersion,
            'name' => $this->name,
            'module' => $this->is_module,
            'type' => 'app',
            'icon' => $this->icon,
            'is_core' => $this->is_core,

        ];
        $helper->export($zipFile, $paths, [], $packageInformation, $this->id, $this->apps_dir);
        $name = strtolower(basename(trim($this->path, '/')));

        \Phpfox_File::instance()->forceDownload($zipFile, 'phpfox-app-' . $name . '.zip');

        return $zipFile;
    }

    public function __toArray()
    {

    }
}