<?php 
/**
 * @package    Proxim
 * @author     Davison Pro <davis@davisonpro.dev | https://davisonpro.dev>
 * @copyright  2020 Proxim
 * @version    1.0
 * @since      File available since Release 1.0
*/

namespace Proxim\Presenter\Profile;

use Proxim\Presenter\AbstractLazyArray;
use Proxim\Application;
use Proxim\Configuration;
use Proxim\User\Customer;
use Proxim\Util\ArrayUtils;
use Proxim\Util\DateUtils;

class ProfileLazyArray extends AbstractLazyArray {
    /** @var Application */
    public $application;

    /** @var Customer */
    public $customer;

    /**
     * ProfileArray constructor.
     *
     * @throws AnnotationException
     * @throws ReflectionException
     */
    public function __construct(Customer $customer)
    {
        $this->application = Application::getInstance();
        $this->customer = $customer;

        parent::__construct();
    }

    /**
     * @arrayAccess
     *
     * @return int
     */
    public function getId()
    {
        return (int) $this->customer->id;
    }

    /**
     * @arrayAccess
     *
     * @return string
     */
    public function getGaUserId()
    {
        return (string) $this->customer->google_analytics_id;
    }

    /**
     * @arrayAccess
     *
     * @return bool
     */
    public function getHasPayments()
    {
        return (bool) $this->customer->total_spent > 0 ? true : false;
    }

    /**
     * @arrayAccess
     *
     * @return string
     */
    public function getEmail()
    {
        return (string) $this->customer->email;
    }

    /**
     * @arrayAccess
     *
     * @return string
     */
    public function getPhone()
    {
        return (string) $this->customer->phone;
    }

    /**
     * @arrayAccess
     *
     * @return string
     */
    public function getName()
    {
        return (string) $this->customer->name;
    }

    /**
     * @arrayAccess
     *
     * @return string
     */
    public function getSiteFullName()
    {
        return (string) Configuration::get('SITE_NAME');
    }

    /**
     * @arrayAccess
     *
     * @return bool
     */
    public function getIsTest()
    {
        return (bool) $this->customer->is_test;
    }

    /**
     * @arrayAccess
     *
     * @return bool
     */
    public function getIsSubscribed()
    {
        return (bool) $this->customer->is_subscribed;
    }

    /**
     * @arrayAccess
     *
     * @return bool
     */
    public function getPushNotificationsEnabled()
    {
        return (bool) $this->customer->push_notifications;
    }

    /**
     * @arrayAccess
     *
     * @return int
     */
    public function getLastAcademicLevel()
    {
        return (int) $this->customer->last_academic_level;
    }

    /**
     * @arrayAccess
     *
     * @return string
     */
    public function getAffiliateLink()
    {
        return Configuration::get('SITE_DOMAIN') . "/order?ref=" . $this->customer->id;
    }

    /**
     * @arrayAccess
     *
     * @return string
     */
    public function getLastPaymentMethod()
    {
        return (string) $this->customer->last_payment_method;
    }

    /**
     * @arrayAccess
     *
     * @return array
     */
    public function getCountry()
    {
        global $globals;

        $countries = ArrayUtils::get($globals, 'countries');
		$country_id = array_search($this->customer->country_id, array_column($countries, 'code'));
		$country_code = ArrayUtils::get(array_keys($countries), $country_id);
		$country = ArrayUtils::has($countries, $country_code) ? ArrayUtils::get($countries, $country_code) : array();
		
        return array(
            "id" => $country_code, 
            "name" => ArrayUtils::get($country, 'name'), 
            "code" => (int) ArrayUtils::get($country, 'code'), 
            "phoneCode" => (int) ArrayUtils::get($country, 'phoneCode')
        );
    }

    /**
     * @arrayAccess
     *
     * @return bool
     */
    public function getPrivacyOrTermsConfirmRequired()
    {
        return !$this->customer->policy_accepted ? true : false;
    }

    /**
     * @arrayAccess
     *
     * @return string
     */
    public function getPolicyAcceptedAt()
    {
        return $this->customer->policy_accepted ? DateUtils::convertToISOFormat($this->customer->policy_accepted) : null;
    }

    /**
     * @arrayAccess
     *
     * @return bool
     */
    public function getHasPersonalData()
    {
        return $this->customer->email ? true : false;
    }

    /**
     * @arrayAccess
     *
     * @return bool
     */
    public function getSurveyBannerLink()
    {
        return false;
    }
}