/home/arranoyd/www/wp-content/plugins/wp-chatbot/inc/MobileMonkeyApi.php
<?php

class MobileMonkeyApi
{

	private $option_prefix = 'mobilemonkey_';
	private $api_domain = 'https://api.mobilemonkey.com/';
	private $src = 'wordpress';
	private $pages = [];
	private $active_page = false;
	private $env = true;
	private $pagination;
	private $contacts;
	private $plugin_name = 'wp-chatbot';
	private $page_info;
	private $bot_id;
	public $available_company;
	public $as_mm = false;
	public $notice = false;
	public $app_domain = 'https://app.mobilemonkey.com/';

	private function getApiDomain()
	{
		return $this->api_domain;
	}

	private function getSrc()
	{
		return $this->src;
	}

	public function getOptionPrefix()
	{
		return $this->option_prefix;
	}

	private function setToken()
	{
		$token = filter_input(INPUT_GET, "auth_token", FILTER_SANITIZE_STRING);
		if ($token) {
			update_option($this->option_prefix . 'token', $token);
			return true;
		}
		return false;
	}

	private function getToken()
	{
		return get_option($this->option_prefix . 'token');
	}

	private function setCompanyId()
	{
		$company_id = filter_input(INPUT_GET, "company_id", FILTER_SANITIZE_STRING);
		if ($company_id) {
			update_option($this->option_prefix . 'company_id', $company_id);
			return true;
		}
		return false;
	}

	public function getCompanyId($connection_page_id)
	{

		if ($connection_page_id) {
			$pages = $this->pages;
			foreach ($pages as $page) {
				if ($page['id'] && $connection_page_id == $page['remote_id']) {
					if (in_array($page['company_id'], $this->available_company)){
						return $page['company_id'];
					}else return false;
				}
			}
			return get_option($this->option_prefix . 'company_id');
		}
	}
	public function getActiveRemotePageId(){
		$data = get_option($this->option_prefix . 'active_page_info');
		return $data['remote_id'];
	}


    private function getInternalPageId($connection_page_id)
    {

        if ($connection_page_id) {

            $pages = $this->pages;
            foreach ($pages as $page) {
                if ($page['id'] && $connection_page_id == $page['remote_id']) {
                    return $page['id'];
                }
            }
            return get_option($this->option_prefix . 'fb_internal_page_id');
        }
    }


    public function getActiveBotId()
    {
		$data = get_option($this->option_prefix . 'active_page_info');
		return $data['bot_id'];
    }


    public function getActivePageId()
    {
		$data = get_option($this->option_prefix . 'active_page_info');
		return $data['id'];
    }

    public function getAvailableCompany(){
        $args = [
            'timeout' => 10,
            'headers' => [
                'Authorization' => $this->getToken(),
                'Content-Type' => 'application/json; charset=utf-8',
            ],
            'method' => 'GET',
        ];
        $response = wp_remote_post($this->getApiDomain() . 'api/wordpress_settings/my_company_ids?v=' . HTCC_VERSION.'.2', $args);
        $error = $this->ErrorHandler($response,'Available Company','get');
        if ($error) {
            $connect_response = json_decode($error);
            return $connect_response;
        }
    }

    public function setAvailableCompany(){
        $company = $this->getAvailableCompany();
        update_option($this->option_prefix . 'available_company', $company);
        $this->available_company = $company;
    }

    public function getPages()
    {
        $args = [
            'timeout' => 30,
            'headers' => [
                'Authorization' => $this->getToken()
            ],
            'body' =>[
                'src' => $this->getSrc()
            ]
        ];
        $pagesObj = NULL;
        $pages = [];
        $response = wp_remote_get($this->getApiDomain() . 'api/facebook_pages/available_options?src=' . $this->getSrc().'&limit=150&v=' . HTCC_VERSION.'.3', $args);
        $content = wp_remote_retrieve_body($response);
        if (!empty($content)) {
            $pagesObj = json_decode($content);

            if (empty($pagesObj->errors)) {
                if(is_array($pagesObj->data)) {
                    foreach ($pagesObj->data as $page) {
                        $p = [
                            'name' => $page->name,
                            'remote_id' => $page->remote_id,
                            'id' => $page->facebook_page_id,
                            'bot_id' => $page->bot_id,
                            'bot_kind' => $page->bot_kind,
                            'company_id' => $page->company_id,
                            'path' => add_query_arg([
                                'page' => $this->plugin_name,
                                'connect' => $page->remote_id,
                                'page_name' => $page->name
                            ], admin_url('admin.php')),
                        ];

                        $pages[] = $p;
                    }
                }
            }
        }
        $this->pages = $pages;
        return $pages;
    }

    public function getActivePage($reset = false)
    {

        if (!$reset && !empty($this->active_page)) {
            return $this->active_page;
        }

        $actpage = get_option("mobilemonkey_active_page_info");
        if ($actpage){
			$this->active_page = $actpage;
			return $actpage;
        }else
            return false;
    }


	public function getSubscribeInfo()
	{
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json; charset=utf-8',
			],
			'method' => 'GET',
		];
		$response = wp_remote_post($this->getApiDomain() . 'api/wordpress/subscriptions/for_page?facebook_page_id=' . $this->getActiveRemotePageId().'&v=' . HTCC_VERSION.'.2', $args);
		$error = $this->ErrorHandler($response,'Page Subscribe Info','get');
		if ($error) {
			$connect_response = json_decode($error);
			$this->setAccountInfo($connect_response->account);
			$this->setCurrentSubscription($connect_response->subscription);
			$this->setWpPlan($connect_response->plan);
			$this->setPageInfo($connect_response);
			$this->setMessageStatistic($connect_response->current_outgoing_messages_statistic);
		}
	}

	public function isCommentGuard(){
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json; charset=utf-8',
			],
			'method' => 'GET',
		];
		$bot_id = $this->getActiveBotId();
		if ($bot_id){
			$response = wp_remote_post($this->getApiDomain() . 'api/bots/'.$bot_id.'/start_bots?page=1&per_page=25&kind=comment_guard&v=' . HTCC_VERSION.'.2', $args);
			$content = wp_remote_retrieve_body($response);
			if ($content){
				$data = json_decode($content);
				if ($data->start_bots){
					return true;
				}
				else return false;
			}
		}
	}

	public function setPageInfo($info){
		$data = [
			'pageName'=> $info->name,
			'connected_at'=> $info->connected_at,
			'is_wp_subscribe'=> $info->is_wp_subscription,
		];
		$this->page_info = $data;
		update_option($this->option_prefix . 'page_info', $data);
	}

	public function getPageInfo(){
		return get_option($this->option_prefix . 'page_info');
	}

	public function setAccountInfo($account){
		update_option($this->option_prefix . 'account_info', $account);
	}
	/**
	 * @return object
	 */
	public function getAccountInfo(){
		return get_option($this->option_prefix . 'account_info');
	}

	public function setMessageStatistic($account){
		update_option($this->option_prefix . 'message_statistic', $account);
	}
	/**
	 * @return object
	 */
	public function getMessageStatistic(){
		return get_option($this->option_prefix . 'message_statistic');
	}

	public function setCurrentSubscription($subscribe){
		update_option($this->option_prefix . 'current_subscribe', $subscribe);
	}
	/**
	 * @return object
	 */
	public function getCurrentSubscription(){
		return get_option($this->option_prefix . 'current_subscribe');
	}

	public function setWpPlan($plan){
		update_option($this->option_prefix . 'wp_plan', $plan);
	}
	/**
	 * @return object
	 */
	public function getWpPlan(){
		return get_option($this->option_prefix . 'wp_plan');
	}


	private function default_custom_setting(){
		$data = array();
		$data['fb_logged_in_greeting'] = 'Hi! How can we help you?';
		$data['fb_logged_out_greeting'] = 'Hi! We\'re here to answer any questions you may have';
		$data['fb_color'] = '#0084FF';
		$data['fb_greeting_dialog_display'] = 'show';
		$data['fb_greeting_dialog_delay'] = 1;
		return($data);
	}

	public function create_subscribe(){
		$data = $_POST;
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json; charset=utf-8',
			],
			'body' => json_encode([
				'facebook_page_id'=> $this->getActiveRemotePageId(),
				'src' => $this->getSrc(),
			]),
			'method' => 'POST',
		];
		if(isset($data['token'])){
			$args['body'] = json_encode([
				'facebook_page_id'=> $this->getActiveRemotePageId(),
				'src' => $this->getSrc(),
				'token' => $data['token']
			]);
		}
		$response = wp_remote_post($this->getApiDomain() . 'api/wordpress/subscriptions?v=' . HTCC_VERSION.'.2', $args);
		$error = $this->ErrorHandler($response,'Subscribe','create');
		if ($error) {
			$connect_response = json_decode($error);
			$this->setAccountInfo($connect_response->account);
			$this->setCurrentSubscription($connect_response->subscription);
			$this->setWpPlan($connect_response->plan);
			$this->setPageInfo($connect_response);
			$this->setMessageStatistic($connect_response->current_outgoing_messages_statistic);
			wp_send_json_success ($error);
		}
	}

	public function cancel_subscribe(){
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json; charset=utf-8',
			],
			'body' => json_encode([
				'facebook_page_id'=> $this->getActiveRemotePageId(),
				'src' => $this->getSrc(),
			]),
			'method' => 'POST',
		];
		$response = wp_remote_post($this->getApiDomain() . 'api/wordpress/subscriptions/cancel?v=' . HTCC_VERSION.'.2', $args);
		$error = $this->ErrorHandler($response,'Subscribe','Cancel');
		if ($error) {
			$connect_response = json_decode($error);
			$this->setAccountInfo($connect_response->account);
			$this->setCurrentSubscription($connect_response->subscription);
			$this->setWpPlan($connect_response->plan);
			$this->setPageInfo($connect_response);
			$this->setMessageStatistic($connect_response->current_outgoing_messages_statistic);
			wp_send_json_success ($error);
		}
	}


	private function setEnvironment($environment)
	{
		update_option($this->option_prefix . 'environment', $environment);
	}

	public function getEnvironment()
	{
		return get_option($this->option_prefix . 'environment');
	}

	public function refreshSettingsPage()
	{
		echo "<script type='text/javascript'>
				var path = location.protocol + '//' + location.host + location.pathname + '?page=wp-chatbot';
		        window.location = path;
		       
		        </script>";
	}

	public function connectLink()
	{
		$current_user = wp_get_current_user();

		if (!empty($current_user->user_email)) {
			$user_email = $current_user->user_email;
		} else {
			$user_email = get_option('admin_email', '');
		}
		return $this->getApiDomain() . 'wordpress/auth?callback="' . add_query_arg(['page' => $this->plugin_name], admin_url('admin.php')) . '"&email=' . $user_email . '&v=' . HTCC_VERSION.'.2';
	}

	public function connectMobileMonkey()
	{
		if ($this->setToken() && $this->setCompanyId()) {

			$this->getEnv();

			$this->sendUserEmail();

			$this->refreshSettingsPage();
		}
		return $this->getToken();
	}

	public function logoutMobilemonkey($reset = false)
	{
		$logout = filter_input(INPUT_GET, "logout", FILTER_SANITIZE_STRING);
		if ($logout || $reset) {
			$this->disconnectPage(get_option($this->active_page['page_id']));
			delete_option('htcc_fb_js_src');
			delete_option($this->option_prefix . 'token');
			$this->refreshSettingsPage();
		}
	}

	public function mmOnlyCheck($page_id)
	{
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json; charset=utf-8',
			],
			'method' => 'GET',
		];
		$response = wp_remote_post($this->getApiDomain() . 'api/facebook_pages/' . $this->getInternalPageId($page_id).'?v=' . HTCC_VERSION.'.2', $args);
		$error = $this->ErrorHandler($response,'MM Only State','get');
		if ($error) {
			$connect_response = json_decode($error);
			return $connect_response->wordpress_settings->mm_only_mode;
		}

	}


	public function connectPage()
	{
		$pageId = filter_input(INPUT_GET, "connect", FILTER_SANITIZE_STRING);
		$pageName = filter_input(INPUT_GET, "page_name", FILTER_SANITIZE_STRING);
		if ($pageId && $pageName) {
			$this->setAvailableCompany();
			if (!$this->getCompanyId($pageId)){
				$this->renderError('This Facebook page has already been connected in MobileMonkey to a company that you don\'t have access to. Please contact support@mobilemonkey.com for more information on how to resolve this issue.');
				return false;
			}
			$args = [
				'timeout' => 10,
				'body' => json_encode([
					'remote_id' => $pageId,
					'company_id' => $this->getCompanyId($pageId),
					'name' => $pageName,
					'base_url' => get_site_url(),
					'src' => $this->getSrc(),
				]),
				'headers' => [
					'Authorization' => $this->getToken(),
					'Content-Type' => 'application/json; charset=utf-8',
				],
				'method' => 'POST',
			];
			$response = wp_remote_post($this->getApiDomain() . 'api/facebook_pages?v=' . HTCC_VERSION.'.2', $args);
			$content = wp_remote_retrieve_body($response);
			$connect_response = json_decode($content);
			if (json_last_error() !== JSON_ERROR_NONE) {
				$this->renderNotice('API communication error. Unable to connect facebook page.');
			} elseif (!empty($connect_response->success)) {
				if ($connect_response->facebook_page->remote_id) {
					$options = get_option('htcc_options', array());
					$new_opt['remote_id'] = $connect_response->facebook_page->remote_id;
					$new_opt['bot_id'] = $connect_response->facebook_page->active_bot_id;
					$new_opt['name'] = $connect_response->facebook_page->name;
					$new_opt['id'] = $connect_response->facebook_page->id;
					$new_opt['path'] =add_query_arg([
                        'page' => $this->plugin_name,
                        'disconnect' => $connect_response->facebook_page->id,
                    ], admin_url('admin.php'));
                    update_option($this->option_prefix.'active_page_info', $new_opt);
					if ($connect_response->facebook_page->active_bot_id) {
                        set_transient( 'pre_value', true, YEAR_IN_SECONDS );
						$custom_settings = $this->getCustomChatSettings($connect_response->facebook_page->remote_id);
						$default_setting = $this->default_custom_setting();
						foreach ($custom_settings as $key=>$value){
							if ($value == '' || !isset($value)){
								$custom_options['fb_'.$key] = $default_setting['fb_'.$key];
							}else {
								$custom_options['fb_'.$key]=$value;
							}
						}
						$ref_cont = $this->getBotRef($connect_response->facebook_page->active_bot_id);
						$ref = stristr($ref_cont->test_link, '=');
						$ref_value = str_replace("=", "", $ref);
						update_option('htcc_fb_ref', $ref_value);
						update_option('htcc_fb_js_src', $custom_settings->js_src);
						update_option('htcc_custom_options', $custom_options);
						$options['fb_sdk_lang'] = $this->getLanguage($connect_response->facebook_page->remote_id);
						update_option('htcc_options', $options);
						delete_transient( 'done-tab' );
						delete_transient( 'current-tab' );
						delete_transient( 'cg_notice_off' );
						delete_transient( 'lead_notice_off' );
						$done_tab = array(
							'1'=>"true",
							'2'=>"false",
							'3'=>"false",
						);
						set_transient( 'done-tab', $done_tab,  YEAR_IN_SECONDS );
						set_transient( 'current-tab', '1',  YEAR_IN_SECONDS );
						$this->refreshSettingsPage();
						return true;
					}
					return true;
				}

			} elseif ($connect_response->error_code) {
				$this->renderNotice('Error code: ' . $connect_response->error_code);
				if (!empty($connect_response->errors)) {
					foreach ($connect_response->errors as $error) {
						$this->renderNotice('Error: ' . $error);
					}
				}
			} elseif (!empty($connect_response->errors)) {
				foreach ($connect_response->errors as $error) {
					$this->renderNotice('Error: ' . $error);
				}
			} else {
				$this->renderNotice('API communication error. Unable to connect facebook page.');
			}

		}
		return false;
	}


	public function AsStateSave($state, $fb_page_id)
	{
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json',
			],
			'body' => json_encode([
				'enabled' => $state,
				'fb_page_remote_id' => $fb_page_id,
				'src' => $this->getSrc()
			]),
			'method' => 'PUT',
		];
		$response = wp_remote_request($this->getApiDomain() . 'api/wordpress_settings/answering_service_v2?v=' . HTCC_VERSION.'.2', $args);
		$this->ErrorHandler($response,'AS State Save','');
	}

	public function disconnectPage($pageId='')
	{
		if (!$pageId){
			$pageId = filter_input(INPUT_GET, "disconnect", FILTER_SANITIZE_STRING);
		}
		if ($pageId) {
			$args = [
				'timeout' => 10,
				'body' => json_encode([
					'src' => $this->getSrc(),
				]),
				'headers' => [
					'Authorization' => $this->getToken(),
					'Content-Type' => 'application/json; charset=utf-8',
				],
				'method' => 'DELETE',
			];
			$response = wp_remote_request($this->getApiDomain() . '/api/facebook_pages/' . $pageId.'?v=' . HTCC_VERSION.'.2', $args);
			$content = wp_remote_retrieve_body($response);
			$connect_response = json_decode($content);
			if (empty($content)) {
				$this->active_page = false;
				delete_option('htcc_as_options');
				delete_option($this->option_prefix . 'page_info');
				delete_option($this->option_prefix . 'account_info');
				delete_option($this->option_prefix . 'current_subscribe');
				delete_option($this->option_prefix . 'message_statistic');
				delete_option($this->option_prefix . 'wp_plan');
				delete_option($this->option_prefix . 'active_page_info');
				delete_option('htcc_fb_js_src');
				$this->refreshSettingsPage();

				return true;

			} elseif (isset($response["response"]["code"]) && $response["response"]["code"] == 422) {
				$this->renderNotice('The page is not connected!');
			} elseif ($connect_response->error_code) {
				$this->renderNotice('Error code: ' . $connect_response->error_code);
				if (!empty($connect_response->errors)) {
					foreach ($connect_response->errors as $error) {
						$this->renderNotice('Error: ' . $error);
					}
				}
			} elseif (!empty($connect_response->errors)) {
				foreach ($connect_response->errors as $error) {
					$this->renderNotice('Error: ' . $error);
				}
			} else {
				$this->renderNotice('API communication error. Unable to disconnect facebook page.');
			}
			return false;
		}
	}


	public function sendUserEmail()
	{
		if (function_exists('wp_get_current_user')) {
			$current_user = wp_get_current_user();
		}
		if (!empty($current_user->user_email)) {
			$user_email = $current_user->user_email;
		} else {
			$user_email = get_option('admin_email', '');
		}

		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json',
			],
			'body' => json_encode([
				'user' => [
					"wp_email" => $user_email,
				],
				'src' => $this->getSrc(),
			]),
			'method' => 'PUT',
		];

		$response = wp_remote_request($this->getApiDomain() . '/api/user/', $args);
		$this->ErrorHandler($response,'User Email','put');
	}

	public function getWelcomeMessage($remote_id)
	{
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json',
			],
			'body' => [
				'src' => $this->getSrc()
			]
		];

		$response = wp_remote_get($this->getApiDomain() . 'api/wordpress_settings/welcome_message?fb_page_remote_id=' . $remote_id . '&v=' . HTCC_VERSION.'.2', $args);
		$error = ($this->ErrorHandler($response,'Welcome Message','get'));
		if ($error) {
			return str_replace('"', '', $error);
		}
	}

	public function updateWelcomeMessage($new_welcome_message, $fb_page_id)
	{
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json',
			],
			'body' => json_encode([
				'body' => $new_welcome_message,
				'fb_page_remote_id' => $fb_page_id,
				'src' => $this->getSrc()
			]),
			'method' => 'PUT',
		];
		$response = wp_remote_request($this->getApiDomain() . 'api/wordpress_settings/welcome_message?v=' . HTCC_VERSION.'.2', $args);
		$this->ErrorHandler($response,'Welcome Message','put');


	}

	public function updateLanguage($new_language, $fb_page_id)
	{
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json',
			],
			'body' => json_encode([
				'language' => $new_language,
				'fb_page_remote_id' => $fb_page_id,
				'src' => $this->getSrc()
			]),
			'method' => 'PUT',
		];
		$fb_lang = HTCC_Lang::$fb_lang;
		if (in_array($new_language, $fb_lang)){
			$response = wp_remote_request($this->getApiDomain() . 'api/wordpress_settings/language?v=' . HTCC_VERSION.'.2', $args);
		}else {
			$this->renderNotice('Incorrect Language Value');
		}
		$this->ErrorHandler($response,'Language','put');
	}

	public function getLanguage($remote_id)
	{
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json',
			],
			'body' => [
				'src' => $this->getSrc()
			]
		];

		$response = wp_remote_get($this->getApiDomain() . 'api/wordpress_settings/language?fb_page_remote_id=' . $remote_id . '&v=' . HTCC_VERSION.'.2', $args);
		$error = ($this->ErrorHandler($response,'Language','get'));
		if ($error) {
			return str_replace('"', '', $error);
		}
	}

	public function getWidgets($remote_id)
	{
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json',
			],
			'body' => [
				'src' => $this->getSrc()
			]
		];
		$response = wp_remote_get($this->getApiDomain() . 'api/wordpress_settings/answering_service_v2?fb_page_remote_id=' . $remote_id . '&v=' . HTCC_VERSION.'.2', $args);
		$error = $this->ErrorHandler($response,'Widget','get');
		if ($error) {
			$connect_response = json_decode($error);
			if (isset($connect_response->answering_service_mm_only_mode)||isset($connect_response->answering_service_not_available)){
			    return [];
            }
			$value_new['fb_answer'] = $connect_response->questions;
			$i=1;
			foreach ($connect_response->qualifiers as $key=>$value){
				foreach ($value as $k=>$v){
					$y=1;
					if ($k == 'question'){
						$value_new['lq_'.$i]['question'] = $v;
					}else {
						foreach ($v as $kr=>$an){
							foreach ($an as $t=>$a){
								if ($t == 'answer'){
									$value_new['lq_'.$i]['answers'.$y]['answer'] = $a;
								}else {
									$value_new['lq_'.$i]['answers'.$y]['qualified'] = $a;
								}
							}
							$y++;
						}
					}
				}
				$i++;
			}
			$value_new['notify_mode'] = $connect_response->notify_mode;
			$value_new['fb_welcome_message'] = $this->getWelcomeMessage($remote_id);
			$value_new['thank_message'] = $connect_response->thank_you_message;
			$value_new['email'] = $connect_response->notify_email;
			$value_new['fb_as_state'] = $connect_response->enabled;
			return $value_new;
		} else {
			return false;
		}
	}

	public function getTriggers($remote_id)
	{
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json',
			],
			'body' => [
				'src' => $this->getSrc()
			]
		];

		$response = wp_remote_get($this->getApiDomain() . 'api/wordpress_settings/triggers?fb_page_remote_id=' . $remote_id . '&v=' . HTCC_VERSION.'.2', $args);
		$error = $this->ErrorHandler($response,'Q&A','get');
		if ($error) {
			$connect_response = json_decode($error);
			$i=1;
			$value_new['advanced_triggers_present'] = $connect_response->advanced_triggers_present;
			foreach ($connect_response->triggers as $key=>$value){
				foreach ($value as $k=>$v){
					if ($k == 'bot_responses'){
						$value_new['qa_'.$i][$k] = $v[0];
					}else {
						foreach ($v as $kr=>$an){
							$value_new['qa_'.$i][$k][]=$an;
						}
					}
				}
				$i++;
			}
			return $value_new;
		} else {
			return false;
		}
	}



	public function setWidgets($options,$page_id,$update)
	{
		$var = true;
		$trig = true;

		if (!$update){
            $triggers = $this->getTriggers($page_id);
            $data_widget = $this->getWidgets($page_id);
            $this->as_mm = empty($data_widget)?true:false;
			$current_welcome_message = $this->getWelcomeMessage($page_id);
			$pre_val = get_transient( 'pre_value' );
			if (count($options,COUNT_NORMAL)==1 && $options['fb_welcome_message']||!$options) {
				if ($this->as_mm == false) {
					$data_widget = array_merge($data_widget, $triggers);
					foreach ($data_widget as $key=>$value){
						if (strpos($key, 'lq_')!==false){
							$var=false;
						}
					}

					if ($var){
						$data_widget['lq_1']['question'] = 'What is your budget?';
						$data_widget['lq_1']['answers1']['answer'] = '$0';
						$data_widget['lq_1']['answers2']['answer'] = '$1-$99';
						$data_widget['lq_1']['answers3']['answer'] = '$100-$500';
						$data_widget['lq_1']['answers4']['answer'] = '$500+';
						$data_widget['lq_1']['answers4']['qualified'] = '1';
					}
					if ($pre_val==true) {
						foreach ($data_widget as $k => $v) {
							if (strpos($k, 'qa_') !== false) {
								$trig = false;
							}
						}
						if ($trig) {
							$data_widget['qa_1']['phrases'] = '';
							$data_widget['qa_1']['bot_responses'] = '';
						}
					}
					$data_widget['answering_service_mm_only_mode'] = false;
					$data_widget['fb_welcome_message'] = $current_welcome_message;
					$data_widget['advanced_triggers_present'] = $triggers['advanced_triggers_present'];
					$data_widget['fb_as_state'] = 0;
					update_option('htcc_as_options', $data_widget);
				}else {
					if ($options){
						foreach ($options as $key => $value) {
							if (strpos($key, 'qa_') !== false) {
								if (!empty($value['phrases']) && !empty($value['bot_responses'])) {
									unset($options[$key]);
								}
							}
						}
						$data_widget = array_merge($options, $triggers);
						if (!$options) {
							foreach ($data_widget as $k => $v) {
								if (strpos($k, 'qa_') !== false) {
									$trig = false;
								}
							}
							if ($trig) {
								$data_widget['qa_1']['phrases'] = '';
								$data_widget['qa_1']['bot_responses'] = '';
							}
						}
						$data_widget['fb_welcome_message'] = $current_welcome_message;
						$data_widget['answering_service_mm_only_mode'] = true;
						$data_widget['advanced_triggers_present'] = $triggers['advanced_triggers_present'];
						update_option('htcc_as_options', $data_widget);
					}
				}
			}
			if ($this->as_mm == false) {
				$data_widget = array_merge($data_widget, $triggers);
                $pre_val = get_transient( 'pre_value' );
                foreach ($data_widget as $key=>$value){
                    if (strpos($key, 'lq_')!==false){
                        $var=false;
                    }
                }

                if ($var){
                    $data_widget['lq_1']['question'] = 'What is your budget?';
                    $data_widget['lq_1']['answers1']['answer'] = '$0';
                    $data_widget['lq_1']['answers2']['answer'] = '$1-$99';
                    $data_widget['lq_1']['answers3']['answer'] = '$100-$500';
                    $data_widget['lq_1']['answers4']['answer'] = '$500+';
                    $data_widget['lq_1']['answers4']['qualified'] = '1';
                }
                if ($pre_val==true) {
                    foreach ($data_widget as $k => $v) {
                        if (strpos($k, 'qa_') !== false) {
                            $trig = false;
                        }
                    }
                    if ($trig) {
                        $data_widget['qa_1']['phrases'] = '';
                        $data_widget['qa_1']['bot_responses'] = '';
                    }
                }
				$data_widget['answering_service_mm_only_mode'] = false;
				$data_widget['fb_welcome_message'] = $current_welcome_message;
				$data_widget['advanced_triggers_present'] = $triggers['advanced_triggers_present'];
				update_option('htcc_as_options', $data_widget);
			}else {
				if ($options){
				foreach ($options as $key => $value) {
					if (strpos($key, 'qa_') !== false) {
						if (!empty($value['phrases']) && !empty($value['bot_responses'])) {
							unset($options[$key]);
						}
					}
				}
				$data_widget['answering_service_mm_only_mode'] = empty($data_widget) ? true : '';
				$data_widget = array_merge($options, $triggers);
				}
				if (!$options) {
					foreach ($data_widget as $k => $v) {
						if (strpos($k, 'qa_') !== false) {
							$trig = false;
						}
					}
					if ($trig) {
						$data_widget['qa_1']['phrases'] = '';
						$data_widget['qa_1']['bot_responses'] = '';
					}
				}
				$data_widget['answering_service_mm_only_mode'] = true;
				$data_widget['advanced_triggers_present'] = $triggers['advanced_triggers_present'];
				update_option('htcc_as_options', $data_widget);
			}
		}else{
			$data_widget = $this->getWidgets($page_id);
			$triggers = $this->getTriggers($page_id);
            $this->as_mm = empty($data_widget)?true:false;
            $state=empty($data_widget)?true:false;
            if ($state==false){
                if ($options['fb_as_state']== null || $options['fb_as_state']==0){
                    $value_new['enabled'] = false;
                } else {
                    $value_new['enabled'] = true;
                }

                $value_new['questions'] = $options['fb_answer'];
                foreach ($options as $key=>$value){
                    if (strpos($key, 'lq_')!==false){
                        $answer = array();
                        $question = '';
                        foreach ($value as $k=>$v){
                            if ($k=='question'){
                                $question = $v;
                            }else{
                                if(isset($v['answer'])){
                                    if (!ctype_space($v['answer'])){
                                        $answer[]=array('answer'=>$v['answer'],'qualified'=> (bool)$v['qualified']);
                                    }
                                }
                            }
                        }
                        $value_new["qualifiers"][]=[
                            "question"=>$question,
                            "answers"=>$answer
                        ];

                    }
                }
                if (!isset($value_new["qualifiers"])){
                    $value_new["qualifiers"]=[];
                }
                $value_new["notify_email"]= $options["email"];
                $value_new["notify_mode"]= $options['notify_mode'];
                $value_new['thank_you_message'] = $options['thank_message'];
                $value_new['fb_page_remote_id'] = $this->getActiveRemotePageId();
				$this->updateWelcomeMessage($options['fb_welcome_message'],$page_id);
                $this->updateWidgets($value_new);

            }
            foreach ($options as $key=>$value){
                if (strpos($key, 'qa_')!==false){
                    $phrases = array();
                    $bot_responses = array();
                    foreach ($value as $k=>$v){
                        if ($k=='bot_responses'&&!empty($v)){
                            $bot_responses[] = $v;
                        }else{
                            if(!empty($v)){
                                if (!ctype_space($v)){
                                    $phrases=$v;
                                }
                            }
                        }

                    }
                    $trigger_new["triggers"][]=[
                        "phrases"=>$phrases,
                        "bot_responses"=>$bot_responses
                    ];
                }
            }
            $options['advanced_triggers_present'] = $triggers['advanced_triggers_present'];
			update_option('htcc_as_options', $options);
            $trigger_new['fb_page_remote_id'] = $this->getActiveRemotePageId();
            $this->updateTriggers($trigger_new);
		}
		return true;

	}

	public function updateTriggers($object)
	{
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json',
			],
			'body' => json_encode($object),
			'method' => 'PUT',
		];
		$response = wp_remote_request($this->getApiDomain() . 'api/wordpress_settings/triggers', $args);
		$error = ($this->ErrorHandler($response,'Triggers','put'));
		if ($error) {
			return $response;
		}
	}

	public function updateWidgets($object)
	{
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json',
			],
			'body' => json_encode($object),

			'method' => 'PUT',
		];
		$response = wp_remote_request($this->getApiDomain() . 'api/wordpress_settings/answering_service_v2', $args);
		$error = ($this->ErrorHandler($response,'Widget','put'));
		if ($error) {
			return $error;
		}
	}

	public function getBotRef($bot_id)
	{
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json; charset=utf-8',
			],
			'body' => [
				'src' => $this->getSrc()
			],
			'method' => 'GET',
		];
		$response = wp_remote_post($this->getApiDomain() . 'api/bots/' . $bot_id, $args);
		$error = ($this->ErrorHandler($response,'Bot Ref','get'));
		if ($error) {
			$connect_response = json_decode($error);
			return $connect_response;
		}
	}


	public function getEnv()
	{

		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
			],
		];
		$response = wp_remote_get($this->getApiDomain() . '/api/env/', $args);
		$content = wp_remote_retrieve_body($response);
		if (!empty($content)) {

			$env = json_decode($content);

			if (json_last_error() !== JSON_ERROR_NONE) {
				$this->renderNotice('API communication error. Please try again later.');
			} elseif (!empty($env->errors)) {
				$this->renderNotice('API communication error. Please try again later.');
			} else {
				$this->env = $env;

				$options = get_option('htcc_options', array());
				$options['fb_app_id'] = $this->env->fb_app_id;
				update_option('htcc_options', $options);

				$this->setEnvironment($env);

				return $env;
			}
		}

		return false;
	}

	public function renderNotice($text)
	{
		$setting_page_args = [
			'text' => $text,
		];
		HT_CC::view('ht-cc-admin-fb-button-notice', $setting_page_args);
	}
	public function renderError($text)
	{
		$setting_page_args = [
			'text' => $text,
		];
		HT_CC::view('ht-cc-admin-fb-button-error', $setting_page_args);
	}

	public function settingSaveError($type)
	{
		$text = "";
		switch ($type){
			case "AS":
				$text = "Changes to the Answering Service fields will not be saved if you leave the fields blank. Please include non-empty field if you wish to make a change.";
				break;
			case "email":
				$text = "Validation failed: Invalid recipient email address(es)";
				break;
			case "welcome_message":
				$text = "Changes to the Welcome Message field will not be saved if you leave the fields blank. Please include non-empty field if you wish to make a change";
				break;
			case "delay_length":
				$text = "Greeting Dialog Delay shouldn't exceed 9 digits.";
				break;
			case "delay_0":
				$text = "Greeting Dialog Delay cannot be lower than 1 second";
				break;
		}
		add_settings_error(
		'htcc_setting_group', // setting name
		'', //
		__("$text", 'wp-chatbot'),
		'error' // type of notify
		);
	}
	public function debug()
	{
		$options = [];
		$options['token'] = get_option($this->option_prefix . 'token');
		$options['environment'] = get_option($this->option_prefix . 'environment');
		$options['htcc_options'] = get_option('htcc_options');
		return var_dump($options);
	}

	private function setContacts($data)
	{
		$this->contacts = $data;
	}

	public function getContacts()
	{
		if (empty($this->contacts)) {
			$this->getData();
		}
		return $this->contacts;
	}

	private function setPagination($data)
	{
		$this->pagination = $data;
	}

	public function getPagination()
	{
		if (empty($this->pagination)) {
			$this->getData();
		}
		return $this->pagination;
	}

	private function getArgs()
	{
		$get = [
			'page' => 1,
			'pre_page' => 25,
			'sort_column' => 'created_at',
			'sort_direction' => 'desc',
		];

		$paged = filter_input(INPUT_GET, "paged", FILTER_SANITIZE_STRING);
		if (!empty($paged)) {
			$get['page'] = $paged;
		}

		$orderby = filter_input(INPUT_GET, "orderby", FILTER_SANITIZE_STRING);
		if (!empty($orderby)) {
			if($orderby=='name'){
				$get['sort_column'] = 'first_name';
			}else{
				$get['sort_column'] = $orderby;
			}
		}

		$order = filter_input(INPUT_GET, "order", FILTER_SANITIZE_STRING);
		if (!empty($order)) {
			$get['sort_direction'] = $order;
		}

		return $get;

	}


	public function updateCustomChatSettings($new_value, $fb_page_id)
	{
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json',
			],
			'body' => json_encode(
				$new_value
			),
			'method' => 'PUT',
		];
		$response = wp_remote_request($this->getApiDomain() . '/api/wordpress_settings/customer_chat?fb_page_remote_id=' . $fb_page_id . '&v=' . HTCC_VERSION.'.2', $args);
		$error = ($this->ErrorHandler($response,"custom settings",'put'));

	}

	public function getCustomChatSettings($remote_id)
	{
		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
				'Content-Type' => 'application/json',
			],'method' => 'GET',
		];

		$response = wp_remote_get($this->getApiDomain() . 'api/wordpress_settings/customer_chat?fb_page_remote_id=' . $remote_id . '&v=' . HTCC_VERSION.'.2', $args);
		$error = ($this->ErrorHandler($response,"custom settings",'get'));
		if ($error) {
			return json_decode($error);
		}
	}

	public function setCustomChatSettings($page_id,$options,$update){
		$custom_settings = $this->getCustomChatSettings($page_id);
		if (!$update){
			if (!$options){
				$custom_settings = $this->getCustomChatSettings($page_id);
				if (!$custom_settings) {
					return false;
				}
				$default_setting = $this->default_custom_setting();
				foreach ($custom_settings as $key=>$value){
					if ($value == '' || !isset($value)){
						$custom_options['fb_'.$key] = $default_setting['fb_'.$key];
					}else {
						$custom_options['fb_'.$key]=$value;
					}
				}
				update_option('htcc_fb_js_src', $custom_settings->js_src);
				update_option('htcc_custom_options', $custom_options);
			}
		}
		if (!$custom_settings) {
			return false;
		}
		foreach ($custom_settings as $key=>$value){
			switch ($key){
				case 'js_src':
					break;
				case 'hide_mobile':
					$options['fb_'.$key] = false;
					break;
				case 'hide_desktop':
					$options['fb_'.$key] = false;
					break;
				default:
					$new_value[$key] = !isset($options['fb_'.$key])?'':$options['fb_'.$key];
				break;
			}
		}
		if (!empty($new_value)){
			$this->updateCustomChatSettings($new_value,$page_id);
		}
		return true;
	}

	private function ErrorHandler($response,$point,$type){
		$content = wp_remote_retrieve_body($response);
		$connect_response = json_decode($content);
		$code = wp_remote_retrieve_response_code( $response );
		$type =  "<style>#setting-error-settings_updated{display: none;}</style>";
		if (isset($code) && $code == 200) {
			$type ='';
			return $content;
		} elseif ($connect_response->error_code) {
			$this->renderError('Error code: ' . $connect_response->error_code);
			if (!empty($connect_response->errors)) {
				foreach ($connect_response->errors as $error) {
					$this->renderError('Error: ' . $error);
				}
				return $error;
			}
		} elseif (!empty($connect_response->errors)) {
			foreach ($connect_response->errors as $error) {
			    if ($code==422||$code==401||$code==404){
					if ($point!="Welcome Message") {
						delete_option('mobilemonkey_active_page_info');
						break;
					}
                }
			}
		}elseif ($code==404){
			delete_option('mobilemonkey_active_page_info');
			return false;
		} else {
			if ($point=="Welcome Message" && $code==422){
				return true;
			}else {
				$this->renderError('API communication error. Unable to '.$type .' ' .$point.'');
			}
		}
		echo $type;
	}
	public function csv(){
		$contacts = $this->getContacts();
		$header_row = array(
			'Name',
			'Email',
			'Gender',
			'Locale',
			'Time Zone',
			'Created At'
		);
		$data_rows = array();
		foreach ( $contacts as $contact )
		{
			$row = array(
				$contact->first_name.$contact->last_name,
				$contact->email,
				$contact->gender,
				$contact->locale,
				$contact->timezone,
				$contact->created_at
			);
			$data_rows[] = $row;
		}
		header('Content-Description: File Transfer');
		header('Content-Type: application/csv');
		header('Content-Disposition: attachment; filename=contact.csv');
		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
		$fh = fopen( 'php://output', 'w' );
		fputcsv( $fh, $header_row );
		foreach ( $data_rows as $data_row ) {
			fputcsv( $fh, $data_row );
		}
		fclose($fh);
		die();
	}
	private function getData()
	{
		$get = $this->getArgs();

		$args = [
			'timeout' => 10,
			'headers' => [
				'Authorization' => $this->getToken(),
			],
		];

		$activePageId = $this->getActiveRemotePageId();

		$response = wp_remote_get($this->getApiDomain() . 'api/wordpress/contacts?remote_page_id=' . $activePageId . '&page=' . $get['page'] . '&per_page=' . $get['pre_page'] . '&sort_column=' . $get['sort_column'] . '&sort_direction=' . $get['sort_direction'] . '&src=' . $this->getSrc(), $args);
		$content = wp_remote_retrieve_body($response);
		if (!empty($content)) {
			$contacts = json_decode($content);
			$this->setContacts($contacts->contacts);
			$this->setPagination($contacts->pagination);
		}
	}
}