<?php namespace App;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Slack;
use Illuminate\Support\Carbon;
use App\Services;
use GuzzleHttp\Client;
use App\SMSLogs;
use App\WhatsApp;


class _SMSService
{


    public function sms_service($mobile_number, $data){

        if(isset($data['message_type']) && $data['message_type'] == "payment"){
            if($data['service'] == "quicksmart" || $data['service'] == false){
                $message = isset($data['message']) ? $data['message'] : $data;
                $message = str_replace('<br/>',"\n",$message);
                $message = trim(str_replace('<br>',"\n",$message));
                $sender  = _env('SMS_SENDER', 'CRFAIR');
                $authkey = _env('SMS_API_KEY', '');
                $messageWhatsapp = urlencode($message);
                $message = preg_replace('%(?:
                    \xF0[\x90-\xBF][\x80-\xBF]{2}      # planes 1-3
                    | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
                    | \xF4[\x80-\x8F][\x80-\xBF]{2}      # plane 16
                )%xs', '', $message);
                $message = urlencode($message);
                $mobile_number_array = explode(',',$mobile_number);

                $mobile_number_array_new = [];

                foreach ($mobile_number_array as $mNumber) {
                    if (strlen($mNumber) == 10) {
                        $mobile_number_array_new[] = '91' . $mNumber;
                    }else{
                        $mobile_number_array_new[] = $mNumber;
                    }
                }

                $mobile_number = implode(',', $mobile_number_array_new);

                $_message = $message;
                $message = str_replace('<br/>', '%0A', $message);
                $message = str_replace('<br>', '%0A', $message);
                $message = str_replace('+', ' ', $message);
                $message = str_replace('%2C', ',', $message);
                $res = $this->quicksmart_service($mobile_number,$message, $data);
            }
            if($data['service'] == "exotel" || (!isset($res['resp']) || ($res['resp'] && (strpos($res['resp']->getBody(), 'failed') !== false || strpos($res['resp']->getBody(), 'failed-dnd') !== false)))){
                $message = isset($data['message']) ? $data['message'] : $data;
                $message = str_replace('<br/>'," ",$message);
                $message = trim(str_replace('<br>'," ",$message));
                $message = preg_replace('%(?:
                    \xF0[\x90-\xBF][\x80-\xBF]{2}      # planes 1-3
                    | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
                    | \xF4[\x80-\x8F][\x80-\xBF]{2}      # plane 16
                )%xs', '', $message);
                $mobile_number_array = explode(',',$mobile_number);

                $mobile_number_array_new = [];

                foreach ($mobile_number_array as $mNumber) {
                    if (strlen($mNumber) == 10) {
                        $mobile_number_array_new[] = '91' . $mNumber;
                    }else{
                        $mobile_number_array_new[] = $mNumber;
                    }
                }

                $mobile_number = implode(',', $mobile_number_array_new);

                $_message = $message;
                $message = str_replace('<br/>', ' ', $message);
                $message = str_replace('<br>', ' ', $message);
                $message = str_replace('+', ' ', $message);
                $message = str_replace('%2C', ',', $message);
                $message = trim(preg_replace('/[\t\n\r\s]+/', ' ', $message));
                $message = trim(preg_replace('/\s\s+/', ' ', $message));
                $res = $this->exotel_service($mobile_number,$message, $data);
            }
            if($data['service'] == "msg91" || (!isset($res['resp']) || ($res['resp'] && (strpos($res['resp']->getBody(), 'failed') !== false || strpos($res['resp']->getBody(), 'failed-dnd') !== false)))){
                $message = isset($data['message']) ? $data['message'] : $data;
                $message = str_replace('<br/>',"\n",$message);
                $message = trim(str_replace('<br>',"\n",$message));
                $sender  = _env('SMS_SENDER', 'CRFAIR');
                $authkey = _env('SMS_API_KEY', '');
                $messageWhatsapp = urlencode($message);
                $message = preg_replace('%(?:
                    \xF0[\x90-\xBF][\x80-\xBF]{2}      # planes 1-3
                    | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
                    | \xF4[\x80-\x8F][\x80-\xBF]{2}      # plane 16
                )%xs', '', $message);
                $message = urlencode($message);
                $mobile_number_array = explode(',',$mobile_number);

                $mobile_number_array_new = [];

                foreach ($mobile_number_array as $mNumber) {
                    if (strlen($mNumber) == 10) {
                        $mobile_number_array_new[] = '91' . $mNumber;
                    }else{
                        $mobile_number_array_new[] = $mNumber;
                    }
                }

                $mobile_number = implode(',', $mobile_number_array_new);

                $_message = $message;
                $message = str_replace('<br/>', '%0A', $message);
                $message = str_replace('<br>', '%0A', $message);
                $message = str_replace('+', ' ', $message);
                $message = str_replace('%2C', ',', $message);
                $res = $this->msg91_service($mobile_number,$message, $data);
            }
        }else{
            if($data['service'] == "quicksmart" || $data['service'] == false){
                $message = isset($data['message']) ? $data['message'] : $data;
                $message = str_replace('<br/>',"\n",$message);
                $message = trim(str_replace('<br>',"\n",$message));
                $sender  = _env('SMS_SENDER', 'CRFAIR');
                $authkey = _env('SMS_API_KEY', '');
                $messageWhatsapp = urlencode($message);
                $message = preg_replace('%(?:
                    \xF0[\x90-\xBF][\x80-\xBF]{2}      # planes 1-3
                    | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
                    | \xF4[\x80-\x8F][\x80-\xBF]{2}      # plane 16
                )%xs', '', $message);
                $message = urlencode($message);
                $mobile_number_array = explode(',',$mobile_number);

                $mobile_number_array_new = [];

                foreach ($mobile_number_array as $mNumber) {
                    if (strlen($mNumber) == 10) {
                        $mobile_number_array_new[] = '91' . $mNumber;
                    }else{
                        $mobile_number_array_new[] = $mNumber;
                    }
                }

                $mobile_number = implode(',', $mobile_number_array_new);

                $_message = $message;
                $message = str_replace('<br/>', '%0A', $message);
                $message = str_replace('<br>', '%0A', $message);
                $message = str_replace('+', ' ', $message);
                $message = str_replace('%2C', ',', $message);
                $res = $this->quicksmart_service($mobile_number,$message, $data);
            }
            if ($data['service'] == "exotel" || (!isset($res['resp']) || ($res['resp'] && (strpos($res['resp']->getBody(), 'failed') !== false || strpos($res['resp']->getBody(), 'failed-dnd') !== false)))){
                $message = isset($data['message']) ? $data['message'] : $data;
                $message = str_replace('<br/>'," ",$message);
                $message = trim(str_replace('<br>'," ",$message));
                $message = preg_replace('%(?:
                    \xF0[\x90-\xBF][\x80-\xBF]{2}      # planes 1-3
                    | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
                    | \xF4[\x80-\x8F][\x80-\xBF]{2}      # plane 16
                )%xs', '', $message);
                $mobile_number_array = explode(',',$mobile_number);

                $mobile_number_array_new = [];

                foreach ($mobile_number_array as $mNumber) {
                    if (strlen($mNumber) == 10) {
                        $mobile_number_array_new[] = '91' . $mNumber;
                    }else{
                        $mobile_number_array_new[] = $mNumber;
                    }
                }

                $mobile_number = implode(',', $mobile_number_array_new);

                $_message = $message;
                $message = str_replace('<br/>', ' ', $message);
                $message = str_replace('<br>', ' ', $message);
                $message = str_replace('+', ' ', $message);
                $message = str_replace('%2C', ',', $message);
                $message = trim(preg_replace('/[\t\n\r\s]+/', ' ', $message));
                $message = trim(preg_replace('/\s\s+/', ' ', $message));
                $res = $this->exotel_service($mobile_number,$message, $data);
            }
            if($data['service'] == "msg91" || (!isset($res['resp']) || ($res['resp'] && (strpos($res['resp']->getBody(), 'failed') !== false || strpos($res['resp']->getBody(), 'failed-dnd') !== false)))){
                $message = isset($data['message']) ? $data['message'] : $data;
                $message = str_replace('<br/>',"\n",$message);
                $message = trim(str_replace('<br>',"\n",$message));
                $sender  = _env('SMS_SENDER', 'CRFAIR');
                $authkey = _env('SMS_API_KEY', '');
                $messageWhatsapp = urlencode($message);
                $message = preg_replace('%(?:
                    \xF0[\x90-\xBF][\x80-\xBF]{2}      # planes 1-3
                    | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
                    | \xF4[\x80-\x8F][\x80-\xBF]{2}      # plane 16
                )%xs', '', $message);
                $message = urlencode($message);
                $mobile_number_array = explode(',',$mobile_number);

                $mobile_number_array_new = [];

                foreach ($mobile_number_array as $mNumber) {
                    if (strlen($mNumber) == 10) {
                        $mobile_number_array_new[] = '91' . $mNumber;
                    }else{
                        $mobile_number_array_new[] = $mNumber;
                    }
                }

                $mobile_number = implode(',', $mobile_number_array_new);

                $_message = $message;
                $message = str_replace('<br/>', '%0A', $message);
                $message = str_replace('<br>', '%0A', $message);
                $message = str_replace('+', ' ', $message);
                $message = str_replace('%2C', ',', $message);
                $res = $this->msg91_service($mobile_number,$message, $data);
            }
        }
        return $res;

    }

    public function exotel_service($mobile_number,$message, $data){
        $_id = isset($data['id']) ? $data['id'] : 0;
        $id_type = isset($data['id_type']) ? $data['id_type'] : 0;
        $provider = 'exotel';
        $action_id = !(Auth::user()) ? 107 : Auth::user()->id;
        $templateDetails = isset($data['templateDetails']) ? $data['templateDetails'] : [];
        $templateId = '';
        $smsLogID = 0;
        $res = '';
        if((isset($data['templateId']) && strpos($data['templateId'], '_preferred') !== false) || isset($data['_preferred'])){
            $templateId = $data['templateId'];
        }
        if((is_object($templateDetails) && isset($templateDetails->templateid) && !empty($templateDetails->templateid)) || (isset($templateDetails['templateid']) && $templateDetails['templateid'])){
            $templateId = is_object($templateDetails) ? $templateDetails->templateid : $templateDetails['templateid'];
        }
        $url = "https://" . _env('EXOTEL_API_KEY') . ":" . _env('EXOTEL_TOKEN') ."@api.exotel.com/v1/Accounts/" . _env('EXOTEL_SID') ."/Sms/send";
        $params['headers'] = ['Content-Type' => 'application/x-www-form-urlencoded'];
        $mobile_number_array = explode(',', $mobile_number);
        $params['form_params'] = [
            'From'    => 'KMCRED',
            'To'      => $mobile_number_array,
            'Body'    => $message,
            'DltEntityId' => '1301159108481756475',
            'DltTemplateId' => $templateId,
            'SmsType' => 'transactional'
        ];

        try{
            $start_time = time();
            $client = new Client();
            $res    = $client->request('POST', $url, $params);
            (new Services())->log($provider, ['status' => true, 'service_count' => 0, 'start_time' => $start_time]);
            $smsLogID = SMSLogs::insertGetId(['mobile_number'=>$mobile_number,'message'=>$message,'request_url'=>$url,'provider'=>$provider,'response'=>$res->getBody(),'_id'=>$_id,'id_type'=>$id_type,'created_by'=>$action_id,'created_at'=>Carbon::now()->toDateTimeString(), 'isWhatsapp' => 0]);
        }catch (\Exception $e){
            (new Slack(new Request(['title'=>'SMS Error','fields'=>['mobile_number'=>$mobile_number,'message'=>$message,'provider'=>$provider,'error'=>$e->getMessage(),'line'=>$e->getLine(),'trace'=>$e->getTraceAsString(),'application_id'=>$_id,'id_type'=>$id_type]])))->send();
        }
        if((isset($res) && $resBody = $res->getBody()) || (isset($e) && $e->getCode() == 403)){
            if (isset($e) && $e->getCode() == 403){
                return ['smsLogID'=>$smsLogID, 'resp' =>$res];
            }else{
                $resBody = simplexml_load_string($resBody);
                if (isset($resBody->Status) && ($resBody->Status == 'failed' || $resBody->Status == 403)){
                    return ['smsLogID'=>$smsLogID];
                }
            }
        }
        return isset($res) ? ['resp'=>$res, 'smsLogID'=>$smsLogID] : ['smsLogID'=>$smsLogID];
    }

    public function quicksmart_service($mobile_number,$message, $data){
        $_id = isset($data['id']) ? $data['id'] : 0;
        $id_type = isset($data['id_type']) ? $data['id_type'] : 0;
        $templateDetails = isset($data['templateDetails']) ? $data['templateDetails'] : [];
        $action_id = !(Auth::user()) ? 107 : Auth::user()->id;
        $res = '';
        if(isset($data['OTP'])){
            $quic_v2_username = 'CrdtFairOtpNu';
            $quic_v2_dest = $mobile_number;
            $quic_v2_api_key = _env('QUICKSMART_API_KEY_1');
            $url = "https://api.telsp.in/pushapi/sendbulkmsg?username=$quic_v2_username&dest=$quic_v2_dest&apikey=$quic_v2_api_key&signature=KMCRED&msgtype=PM&msgtxt=$message&".http_build_query($templateDetails);
        }else{
            $quic_v2_username = 'CreditFairTrNu';
            $quic_v2_dest = $mobile_number;
            $quic_v2_api_key = _env('QUICKSMART_API_KEY_2');
            $url = "https://api.telsp.in/pushapi/sendbulkmsg?username=$quic_v2_username&dest=$quic_v2_dest&apikey=$quic_v2_api_key&signature=KMCRED&msgtype=PM&msgtxt=$message&".http_build_query($templateDetails);
        }

        $provider = "quicksmart";
        $smsLogID = 0;
        try{
            $start_time = time();
            $client = new Client();
            $res    = $client->request('GET', $url);
//            (new Slack(new Request(['title'=>'RES Error','fields'=>['mobile_number'=>$mobile_number,'message'=>$message,'res'=>json_encode($res),'application_id'=>$_id,'id_type'=>$id_type], 'group' => \App\Slack::$STAGE_TESTING])))->send();
            (new Services())->log($provider, ['status' => true, 'service_count' => 0, 'start_time' => $start_time]);
            $smsLogID = SMSLogs::insertGetId(['mobile_number'=>$mobile_number,'message'=>$message,'request_url'=>$url,'provider'=>$provider,'response'=>$res->getBody(),'_id'=>$_id,'id_type'=>$id_type,'created_by'=>$action_id,'created_at'=>Carbon::now()->toDateTimeString(), 'isWhatsapp' => 0]);
        }catch (\Exception $e){
            (new Slack(new Request(['title'=>'SMS Error','fields'=>['mobile_number'=>$mobile_number,'message'=>$message,'provider'=>$provider,'error'=>$e->getMessage(),'line'=>$e->getLine(),'trace'=>$e->getTraceAsString(),'application_id'=>$_id,'id_type'=>$id_type]])))->send();
        }

        try{
            if(isset($res) && $res && $resBody = $res->getBody()){
                $resBody = json_decode($resBody);
                if (isset($resBody->STATUS) && $resBody->STATUS == 'ERROR'){
                    unset($res);
                }
                return ['resp'=>$res, 'smsLogID'=>$smsLogID];
            }
        }catch (\Exception $e){
            (new Slack(new Request(['title'=>'RES Error','fields'=>['mobile_number'=>$mobile_number,'message'=>$message,'res'=>json_encode($res),'error'=>$e->getMessage(),'line'=>$e->getLine(),'trace'=>$e->getTraceAsString(),'application_id'=>$_id,'id_type'=>$id_type], 'group' => \App\Slack::$STAGE_TESTING])))->send();
        }
        return ['smsLogID'=>$smsLogID];
    }

    public function msg91_service($mobile_number,$message, $data){
        $_id = isset($data['id']) ? $data['id'] : 0;
        $id_type = isset($data['id_type']) ? $data['id_type'] : 0;
        $templateDetails = isset($data['templateDetails']) ? $data['templateDetails'] : [];
        $action_id = !(Auth::user()) ? 107 : Auth::user()->id;
        $sender  = _env('SMS_SENDER', 'CRFAIR');
        $authkey = _env('SMS_API_KEY', '');
        $smsLogID = 0;
        $res = '';
        try{
            $start_time = time();
            $url = "http://api.msg91.com/api/sendhttp.php?sender=$sender&route=4&mobiles=$mobile_number&authkey=$authkey&country=0&message=$message";
            if((isset($data['templateId']) && strpos($data['templateId'], '_preferred') !== false) || isset($data['_preferred'])){
                $url .= '&unicode=1';
            }

            if (isset($templateDetails['templateid']) && $templateDetails['templateid']) {
                $url .= "&DLT_TE_ID=".$templateDetails['templateid'];
            }

            $provider = 'msg91';
            $client = new Client();
            $res    = $client->request('GET', $url);
            (new Services())->log('msg91', ['status' => true, 'service_count' => 0, 'start_time' => $start_time]);
            $smsLogID = SMSLogs::insertGetId(['mobile_number'=>$mobile_number,'message'=>$message,'request_url'=>$url,'provider'=>$provider,'response'=>$res->getBody(),'_id'=>$_id,'id_type'=>$id_type,'created_by'=>$action_id,'created_at'=>Carbon::now()->toDateTimeString(), 'isWhatsapp' => 0]);
            return ['resp'=>$res, 'smsLogID'=>$smsLogID];
        }catch (\Exception $e){
            (new Slack(new Request(['title'=>'SMS Error','fields'=>['mobile_number'=>$mobile_number,'message'=>$message,'provider'=>$provider,'error'=>$e->getMessage(),'line'=>$e->getLine(),'trace'=>$e->getTraceAsString(),'application_id'=>$_id,'id_type'=>$id_type]])))->send();
        }

        return ['smsLogID'=>$smsLogID];
    }

}
