<?php
namespace frontend\controllers;

use common\models\CTMailChimp;
use common\models\MailSender;
use common\models\tnd\MatchingImporter;
use common\models\User;
use common\models\UserApiData;
use common\models\UserNotifications;
use Yii;
use yii\helpers\Url;
use yii\web\Controller;
use Lcobucci\JWT\Signer\Hmac\Sha256;

class ApiController extends Controller
{
    const issuer = 'CT';
    const audience = 'service.connectingtalents.org';
    const key = 'GtWQMzG4alJGjfahqFGxR7ascaYVaQ';

    const API_SCHEME = 'http';
    const API_SERVER = '54.93.119.106';
    const API_VERSION = '1.0';
    const API_METHOD_UTC = 'utc';
    const API_METHOD_UTCREPORT = 'utcreport';
    const API_METHOD_MATCH = 'todaymatch';

    /**
     * Method bring BB server request
     * @return \yii\web\Response
     */
    public function actionResponse(){
        /** Save after complete Basic UTC data */
	    if(Yii::$app->request->isGet){
		    $type = Yii::$app->request->get('type');
		    $status = Yii::$app->request->get('status');
		    if($type === 'TND' && $status === 'OK'){
			    return $this->redirect(['/profile', 'alert'=>'tnd_success']);
		    }elseif($type === 'TND' && $status === 'FAILED'){
			    return $this->redirect(['/profile', 'alert'=>'tnd_failed']);
		    }
	    }

        if(Yii::$app->request->isGet){
            $status = Yii::$app->request->get('status');
            $internal_user_id = Yii::$app->request->get('id_internal_user');
            $candidate_id = Yii::$app->request->get('candidateid');
            $survey_id = Yii::$app->request->get('surveyid');
            $utc_id = Yii::$app->request->get('utcid');

            if($status && $status === 'completed'
                && $utc_id && $candidate_id
                && $survey_id && $internal_user_id
            )
            {
                $user = User::findOne(['internal_user_id'=>$internal_user_id, 'status' => User::STATUS_ACTIVE]);
//                $api_data = UserApiData::findOne(['uder_id'=>$user->id]);
                if($user){

	                $model = UserApiData::findOne(['user_id'=>$user->id]);
	                if(!$model){
		                $model = new UserApiData();
	                }
	                $user->managementData->is_basic_utc = 1;
	                $user->managementData->save();

                    $model->candidate_id = $candidate_id;
                    $model->survey_id = $survey_id;
                    $model->utc_id = $utc_id;
                    $model->user_id = $user->id;
                    $model->save();


	                /**
	                 *   TODO @event_mailchimp add user to UTC_Basic list
	                 */
                    CTMailChimp::addSubscriberToMailChimp('05b8acc85e', $user->email, [
                        'FNAME' => $user->username,
                        'LNAME' => $user->surname
                    ]);

	                /**
	                 * TODO @event_mail UTC_Basic event name - send message via mandrill
	                 */
	                /*$res = Yii::$app->mailer
	                ->compose('utc-basic-template',[
		                'USERNAME' => $user->username,
		                'EMAIL' => $user->email,
	                ])
	                ->setFrom([Yii::$app->params['adminEmail']=>Yii::$app->params['adminEmail']])
	                ->setTo($user->email)
	                ->send();*/
	                $res = MailSender::sendToUser_BasicUTC($user); //TODO GDPR features


	                /**
	                 * TODO @event_notification UTC_Basic event name - send message via mandrill
	                 */
	                $notification_url = Yii::$app->params['host'].'/profile/feedback';
	                $res = UserNotifications::setNotification($user->id, UserNotifications::TYPE_UTC_BASIC, '', '', $notification_url);

                    return $this->redirect(['/profile', 'alert'=>'basic_utc_success']);
                }
            }
            return $this->redirect(['/profile', 'alert'=>'basic_utc_failed']);
        }
        return $this->redirect(['/profile']);
    }


    public function actionResponseFullUtc(){
        /** Save after complete Full UTC data */
        if(Yii::$app->request->isGet){
            $status = Yii::$app->request->get('status');
            $internal_user_id = Yii::$app->request->get('id_internal_user');
            $candidate_id = Yii::$app->request->get('candidateid');
            $survey_id = Yii::$app->request->get('surveyid');
            $utc_id = Yii::$app->request->get('utcid');

            if($status && $status === 'completed'
                && $utc_id && $candidate_id
                && $survey_id && $internal_user_id
            )
            {
                $user = User::findOne(['internal_user_id'=>$internal_user_id, 'status' => User::STATUS_ACTIVE]);
                if($user){
	                $model = UserApiData::findOne(['user_id'=>$user->id]);
	                if(!$model){
		                $model = new UserApiData();
	                }
	                $user->managementData->is_full_utc = 1;
	                $user->managementData->save();

                    $model->candidate_id = $candidate_id;
                    $model->survey_id = $survey_id;
                    $model->utc_id = $utc_id;
                    $model->user_id = $user->id;
                    $model->save();


	                /**
	                 * TODO @event_mail UTC_Basic event name - send message via mandrill
	                 */
	                $res = MailSender::sendToUser_FullUTC($user); //TODO GDPR features


	                /**
	                 * TODO @event_notification UTC_Basic event name - send message via mandrill
	                 */
//	                $notification_url = Yii::$app->params['host'].'/profile/feedback';
//	                $res = UserNotifications::setNotification($user->id, UserNotifications::TYPE_UTC_BASIC, '', '', $notification_url);
//echo "<pre>";
//print_r($_GET);
//echo "</pre>";
//die;
                    return $this->redirect(['/profile', 'alert'=>'full_utc_success']);
                }
            }
            return $this->redirect(['/profile', 'alert'=>'full_utc_failed']);
        }
        return $this->redirect(['/profile']);
    }


    public function actionTest(){
		MatchingImporter::importRequestDataToDB();
//        debug('test');
//        die;
//        echo "<pre>";
        //utc_id = 59de9f811d65c0a00f2d2f7f берём тут http://prntscr.com/gwa5of в дальнейшем будем подключать из таблици user_api_data
//        print_r(json_decode(self::getUTCData('59de9f811d65c0a00f2d2f7f')));
//        echo "</pre>";
    }

	/**
	 * Function build JWTToken based on params
	 * Params must be set as 'key' => 'value'
	 *
	 * @param array|null $params
	 * @param bool $return_page
	 * @param null $return_page_url
	 *
	 * @return
	 */
    public static function getBuildToken($params = null, $return_page = true, $return_page_url = null){
        $signer = new Sha256();

        $return_page_url = $return_page_url != null?Url::toRoute($return_page_url, true):Url::toRoute(['api/response'], true);

        $JWTToken = Yii::$app->jwt->getBuilder()
            ->setIssuer(self::issuer) // Configures the issuer (iss claim)
            ->setAudience(self::audience) // Configures the audience (aud claim)
            ->setIssuedAt(time()) // Configures the time that the token was issue (iat claim)
            ->setExpiration(time() + 365*24*60*60); // Configures the expiration time of the token (nbf claim)


        if(is_array($params)){
            foreach ($params as $key=>$item){
                $JWTToken->set($key, $item);
            }
        }

        if($return_page){
            $JWTToken->set('return_page', $return_page_url);
        }

        return $JWTToken->sign($signer, self::key)->getToken();
    }

	/**
	 * Function create token for basic utc
	 *
	 * @param $utc_level
	 * @param $language
	 * @param $id_internal_user
	 * @param $id_external_user
	 * @param null $return_page_url
	 *
	 * @return mixed
	 */
    public static function getStartUtcSurveyToken($utc_level, $language, $id_internal_user, $id_external_user, $return_page_url = null){
        return self::getBuildToken([
            'utc_level' => $utc_level,
            'language'  => $language,
            'id_internal_user' => $id_internal_user,
            'id_external_user' => $id_external_user
        ],
        true,
        $return_page_url
        );
    }



	public static function getTNDToken($utc_level, $language, $id_internal_user, $id_external_user, $opportunity_id, $opportunity_name, $return_page_url = null){
		return self::getBuildToken([
			'utc_level' => $utc_level,
			'language'  => $language,
			'id_internal_user' => $id_internal_user,
			'id_external_user' => $id_external_user,
			'opportunity_id' => $opportunity_id,
			'opportunity_name' => $opportunity_name,
		],
			true,
			$return_page_url
		);
	}

    /**
     * Function get user utc data
     */
    public static function getUTCData($utc_id){
        return self::getApiData(
            'GET',
            self::getApiPath(self::API_METHOD_UTC).'/'.$utc_id
        );
    }

	/**
	 * Function get user utc data
	 *
	 * @param $id_internal_user
	 *
	 * @param $id_external_user
	 *
	 * @return mixed
	 */
    public static function getReportData($id_internal_user, $id_external_user){
    	return self::getApiData(
            'GET',
            self::getApiPath(self::API_METHOD_UTCREPORT),
		    FALSE,
		    self::getBuildToken([
			    'id_internal_user' => $id_internal_user,
			    'id_external_user' => $id_external_user
		    ],FALSE)
        );
    }

    /**
     * Method use for call BB API data
     * @param $method
     * @param $url
     * @param bool $data
     * @param null $token
     * @return mixed
     */
    public static function getApiData($method, $url, $data = false, $token = null)
    {
        $curl = curl_init();

        switch ($method)
        {
            case "POST":
                curl_setopt($curl, CURLOPT_POST, 1);
                if ($data)
                    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                break;
            /*case "PUT":
                curl_setopt($curl, CURLOPT_PUT, 1);
                break;*/
            default:
                if ($data)
                    $url = sprintf("%s?%s", $url, http_build_query($data));
        }

        /**
         * If token is null set default JWTToken
         */
        if($token == null){
            $token = self::getBuildToken();
        }

//        echo $url."&token=".$token;
//        die();

        curl_setopt($curl, CURLOPT_HTTPHEADER,
            [
                'Content-Type: application/json' ,
                "Authorization: Bearer $token"
            ]
        );

        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

        $result = curl_exec($curl);

        curl_close($curl);

        return $result;
    }

    public static function getApiPath($api_method){
        return self::API_SCHEME.'://'.self::API_SERVER.'/api/'.self::API_VERSION.'/'.$api_method;
    }

    public static function checkResource($url){
	    $file_headers = get_headers($url);
	   return $file_headers;
    }

}
