<?php

namespace App\Http\Controllers;

use App\Console\Commands\SpeedyPersoBulkSms;
use App\DataTables\TmpGroupSmsDataTable;
use App\Filters;
use App\SavedMessage;
use App\SmsImage;
use App\UserJob;
use App\Log;
use App\UserSenderId;
use App\VoiceLogs;
use Carbon\Carbon;
use GuzzleHttp\Client;
use Illuminate\Http\Request;

use Illuminate\Support\Facades\Auth;
use App\Tools\SmsTools;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel;

class voiceController extends Controller
{
    public function send_single_voice(Request $request) {
        $step=1;
        //reset current session data for sending single sms
        if($request->session()->has('single_sms_data')) {
            $request->session()->forget('single_sms_data');
        }
        if($request->session()->has('alert')) {
            $request->session()->forget('alert');
        }
        //show view :11xx
        return view('voice.send_single_voice', [
            'step'=>$step,
            'sender_ids' => UserSenderId::query()->where([['user_id',Auth::user()->id],['status',1]])->get()
        ]);
    }

    public function post_send_single_voice(Request $request) {
        //get current user
        $user = Auth::user();
        $credit = $user->credit;

        //get current step
        $step = $request->get('step', 1);

        //process for step 1
        if($step == 1)
        {
            //validate the request
            $this->validate($request, [
                'phone_numbers' => 'required|digits_between:10,15',
                'schedule_date' => 'present',
                'audio_upload' => 'required|mimes:mp3,wav|max:5000'
            ]);

            //get data for step 2
            $destination = explode(',', $request->get('phone_numbers'));


            $no_pages=1;

            $sms_count = $no_pages;

            $price = 0.0;
            foreach ($destination as $single_msisdn) {
                $network = SmsTools::get_msisdn_network($user, $single_msisdn);
                $price += (float)$network['sms_price'];
            }
            $cost = $no_pages * $price;
            // cost of sending one msg with this no_pages to one person
            $nummsisdn = count($destination);
            // no of recepients
            $tot_cost = $cost;

            $curr_bal = $credit->new_bal;
            $credit_used = $credit->credit_used;

            $rem_sms = floor($curr_bal / $cost);
            //remaining sms user can send

            $counter = floor($rem_sms / $no_pages);
            $some_cost = $cost * $counter;

//            $price_per_sms = $cost;
            $recipients = $nummsisdn;
            $total_price = $tot_cost;
            $credit_available = $curr_bal;
            $imgId = null;

            //update image if image exist
            if ($request->file('audio_upload')->isValid()) {
                $current_filename = $request->file('audio_upload')->getClientOriginalName();
                $fileMimeType = $request->file('audio_upload')->getMimeType();

                $destinationPath = storage_path() . DIRECTORY_SEPARATOR. 'uploads' . DIRECTORY_SEPARATOR;
                $fileName = $user->username. '_' . $current_filename;
                $request->file('audio_upload')->move($destinationPath, $fileName);
                $full_path = $destinationPath . $fileName;

                while(1) {
                    $imgId = uniqid();
                    if(empty(SmsImage::find($imgId))) {
                        break;
                    }
                }
                $user->sms_images()->create([
                    'path' => $full_path,
                    'file_name' => $current_filename,
                    'mime_type' => $fileMimeType,
                    'id' => $imgId
                ]);
            } else {
                return Redirect::back()->withInput()->withErrors(array('audio_upload' => 'Sorry, The file upload failed!'));
            }

            if(!empty($imgId)) {
                $voice_file_url = route('sms_image', ['id'=>$imgId]);
                $audioFile = $voice_file_url;
            }

            //store user input in the new session data
            session(['single_voice_data'=>[
                'phone_numbers' => $request->get('phone_numbers'),
                'recipients' => $recipients,
                'audioFile'=>$voice_file_url,
                'total_price' => $total_price,
                'credit_available' => number_format($credit_available, 3),
                'schedule_date' => Carbon::parse($request->get('schedule_date'))
            ]]);
            $step=2;
        }

        else if($step==2)
        {
            //check if next button was pressed
            if($request->has('submit'))
            {
                session(['alert', []]);
                //send single Voice now
                $destination = explode(',', session('single_voice_data')['phone_numbers']);
                $filePath = session('single_voice_data')['audioFile'];
                $cost = session('single_voice_data')['total_price'];
                // cost of sending one msg with this no_pages to one person
                $nummsisdn = count($destination);
                // no of recepients
                $tot_cost = $cost;
                $curr_bal = $credit->new_bal;
                $rejected_arr = [];
                if(isset(session('single_voice_data')['schedule_date']) && !empty(session('single_voice_data')['schedule_date'])) {
                    $sch_date = Carbon::parse(session('single_voice_data')['schedule_date']);
                    $now = Carbon::now();
                    $date = $now->lte($sch_date) ? $sch_date : $now;
                }
                else {
                    $date = Carbon::now();
                }

                $oneMinuteLater = Carbon::now()->addMinutes(1);
                $sentItNow = $date->lte($oneMinuteLater);
                $data = [];

                if ($curr_bal >= $tot_cost) {
                    $count = 0;
                    $no_rej_msisdn = 0;
                    while ($count !== $nummsisdn) {
                        $number = self::format_phone_number($destination[$count]);
                        $msisdn = preg_replace('/\D/', '', $number);
                        $msisdn = SmsTools::msisdn_prep($msisdn);
                        $msisdn = trim($msisdn);

                        if (is_numeric($msisdn)) {
                            while(1) {
                                $id = uniqid('NS', true);
                                if(empty(Log::find($id)))
                                    break;
                            }
                            if($sentItNow==false) {
                                $data[] = $msisdn;
                            } else {

                                $curl = curl_init();

                                $id=uniqid();
                                $callBack='http://bulk.deywuro.com/voice/callback';
                                curl_setopt_array($curl, array(
                                    CURLOPT_URL => "https://konnect.kirusa.com/api/v1/Accounts/f5L3nAw4iWPqolBAUj9iOA==/Calls",
                                    CURLOPT_RETURNTRANSFER => true,
                                    CURLOPT_ENCODING => "",
                                    CURLOPT_MAXREDIRS => 10,
                                    CURLOPT_TIMEOUT => 30,
                                    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                                    CURLOPT_CUSTOMREQUEST => "POST",
                                    CURLOPT_POSTFIELDS => "{'id':'$id','caller_id':'233242436510','recipient':['$msisdn'],'media_url':'$filePath','direction':'outbound','callback_url':'$callBack'}",
                                    CURLOPT_HTTPHEADER => array(
                                        "Authorization: 0+3I2VH+bFOa4G0KdxCaJ9ATSpn3zERnx6ax2FBvv/c=",
                                        "Content-Type: application/json"
                                    ),
                                ));

                                $response = curl_exec($curl);
                                $err = curl_error($curl);

                                curl_close($curl);

                                $user = Auth::user();
                                $userid = $user->id;

                                $voice = VoiceLogs::create([
                                    'user_ID' => $userid,
                                    'message_ID' => $id,
                                    'msisdn' => $msisdn,
                                    'status' => 'Sent'
                                ]);

                                \Illuminate\Support\Facades\Log::useFiles(storage_path().'/logs/access_voice.log');
                                \Illuminate\Support\Facades\Log::info("msisdn: $msisdn | response: $response ");

                            }
                        } else {
                            array_push($rejected_arr, $msisdn);
                            $request->session()->push('alert', $msisdn . ' not routable');
                        }
                        $no_rej_msisdn = count($rejected_arr);
                        //counts number of rejected contacts
                        $count++;
                    }

                    if($sentItNow==false) {
                        foreach ($data as $dat) {
                            $user->pending_single_sms()->create([
                                'msisdn' => $dat,
                                'sched_datetime' => $date
                            ]);
                        }

                        //update audit trails
                        $user->audit_trails()->create([
                            'username' => $user->username,
                            'date' => Carbon::now()->toDateTimeString(),
                            'activity' => $user->username.' sent a single voice message to '.count($data).' msisdn'
                        ]);

                        $logged = count($data);

                        if ($no_rej_msisdn == 0) {
                            $request->session()->flash('success', $logged . ' message(s) successfully scheduled!');
                        } else {
                            $request->session()->flash('success', $logged . ' messages successfully scheduled, ' . $no_rej_msisdn . ' rejected');
                        }
                    }
                    else {
                        $logged = $nummsisdn - $no_rej_msisdn;

                        //update audit trails
                        $user->audit_trails()->create([
                            'username' => $user->username,
                            'date' => Carbon::now()->toDateTimeString(),
                            'activity' => $user->username.' sent a single voice to '.$logged.' msisdn'
                        ]);

                        if ($no_rej_msisdn == 0) {
                            $request->session()->flash('success', $logged . ' message(s) successfully sent!');
                        } else {
                            $request->session()->flash('success', $logged . ' message(s) successfully sent!, ' . $no_rej_msisdn . ' rejected');
                        }
                    }
                } else {
                    return Redirect::back()->withInput()->withErrors(array('error' => 'Sorry, you don\'t have enough credit to proceed!'));
                }

                //reset session
                $step=0;
                $request->session()->forget('single_sms_data');
                if(!$request->session()->has('success') || empty(session('success')))
                    $request->session()->flash('success', 'Your SMS Message has been successfully sent!');

            }
            //in case back button was pressed
            else
            {
                //go back to step 1
                $step=1;
            }
        }
        return view('voice.send_single_voice', ['step'=>$step]);
    }



    public function send_bulk_voice(Request $request) {
        $step=1;
        //reset current session data for sending single sms
        if($request->session()->has('bulk_voice_data')) {
            $request->session()->forget('bulk_voice_data');
        }
        if($request->session()->has('alert')) {
            $request->session()->forget('alert');
        }

        return view('voice.send_bulk_voice', [
            'step'=>$step
        ]);
    }

    public function post_send_bulk_voice(Request $request) {
        //get current user
        $user = Auth::user();
        $credit = $user->credit;

        //get current step
        $step = $request->get('step', 1);

        //process for step 1
        if($step == 1)
        {
            //validate the request
            $this->validate($request, [
                'file_upload'       => 'required|mimes:csv,txt,xlsx,xls',
                'schedule_date'     => 'present',
                'name'              => 'required',
                'audio_upload' => 'required|mimes:mp3,wav|max:5000'
            ]);


            $current_filename = $request->file('file_upload')->getClientOriginalName();
            $filename_splitted = explode(".", $current_filename);
            $extension = end($filename_splitted);

            $destinationPath = storage_path() . DIRECTORY_SEPARATOR. 'bulk_sms' . DIRECTORY_SEPARATOR;
            $fileName = $user->username. '_'. date('YmdHis') . '.' . $extension;
            $full_filename = $destinationPath . $fileName;

            if ($request->file('file_upload')->isValid()) {
                $request->file('file_upload')->move($destinationPath, $fileName);
                @chmod($full_filename, 0777);
            } else {
                return Redirect::back()->withInput()->withErrors(array('file_upload' => 'Sorry, The file upload failed!'));
            }

            $highestRow = 0;

            try {
                Excel::load($full_filename, function ($reader) use (&$highestRow) {
                    $highestRow = $reader->getExcel()->getSheet(0)->getHighestRow();
                });
            } catch (\Throwable $e) {
                //throw $e;
                return Redirect::back()->withInput()->withErrors(array('file_upload' => 'Error! Your excel file is invalid!'));
            }

            //get data for step 2
            $imgId = null;

            //update image if image exist
            if(!empty($request['audio_upload'])) {
                if ($request->file('audio_upload')->isValid()) {
                    $current_filename = $request->file('audio_upload')->getClientOriginalName();
                    $fileMimeType = $request->file('audio_upload')->getMimeType();

                    $destinationPath = storage_path() . DIRECTORY_SEPARATOR. 'uploads' . DIRECTORY_SEPARATOR;
                    $fileName = $user->username. '_' . $current_filename;
                    $request->file('audio_upload')->move($destinationPath, $fileName);
                    $full_path = $destinationPath . $fileName;

                    while(1) {
                        $imgId = uniqid();
                        if(empty(SmsImage::find($imgId))) {
                            break;
                        }
                    }
                    $user->sms_images()->create([
                        'path' => $full_path,
                        'file_name' => $current_filename,
                        'mime_type' => $fileMimeType,
                        'id' => $imgId
                    ]);
                } else {
                    return Redirect::back()->withInput()->withErrors(array('image_upload' => 'Sorry, The file upload failed!'));
                }
            }

            if(!empty($imgId)) {
                $voice_file_url = route('sms_image', ['id'=>$imgId]);
                $audioFile = $voice_file_url;
            }

            //store user input in the new session data
            session(['bulk_voice_data'=>[
                'phone_numbers' => $current_filename,
                'audioFile' => $audioFile,
                'recipients' => $highestRow,
                'path' => $full_filename,
                'credit_available' => number_format($credit->new_bal, 2),
                'schedule_date' => Carbon::parse($request->get('schedule_date')),
                'name' => $request->get('name'),
                'remove_duplicate' => $request->has('remove_duplicate')
            ]]);
            $step=2;
        }
        //process for step 2
        else if($step==2)
        {
            //check if next button was pressed
            if($request->has('submit'))
            {
                $phone_numbers = session('bulk_voice_data')['path'];
                $nummsisdn = session('bulk_voice_data')['recipients'];
                $filePath = session('bulk_voice_data')['audioFile'];
                $remove_duplicate = session('bulk_voice_data')['remove_duplicate'];

                $info = pathinfo($phone_numbers);
                $ext = $info['extension'];

                if ($ext=='xlsx'||$ext=='csv'||$ext=='xls'){
                    $data = Excel::load($phone_numbers, function($reader) {})->get();

                    if(!empty($data) && $data->count()) {

                        foreach ($data->toArray() as $key => $value) {

                            if (!empty($value)) {

                                foreach ($value as $msisdn) {
                                    $curl = curl_init();

                                    $id=uniqid();
                                    $callBack='http://bulk.deywuro.com/voice/callback';
                                    curl_setopt_array($curl, array(
                                        CURLOPT_URL => "https://konnect.kirusa.com/api/v1/Accounts/f5L3nAw4iWPqolBAUj9iOA==/Calls",
                                        CURLOPT_RETURNTRANSFER => true,
                                        CURLOPT_ENCODING => "",
                                        CURLOPT_MAXREDIRS => 10,
                                        CURLOPT_TIMEOUT => 30,
                                        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                                        CURLOPT_CUSTOMREQUEST => "POST",
                                        CURLOPT_POSTFIELDS => "{'id':'$id','caller_id':'233242436510','recipient':['$msisdn'],'media_url':'$filePath','direction':'outbound','callback_url':'$callBack'}",
                                        CURLOPT_HTTPHEADER => array(
                                            "Authorization: 0+3I2VH+bFOa4G0KdxCaJ9ATSpn3zERnx6ax2FBvv/c=",
                                            "Content-Type: application/json"
                                        ),
                                    ));

                                    $response = curl_exec($curl);
                                    $err = curl_error($curl);

                                    curl_close($curl);

                                    \Illuminate\Support\Facades\Log::useFiles(storage_path().'/logs/access_voice.log');
                                    \Illuminate\Support\Facades\Log::info("msisdn: $msisdn | response: $response ");


                                    $user = Auth::user();
                                    $userid = $user->id;

                                    $voice = VoiceLogs::create([
                                        'user_ID' => $userid,
                                        'message_ID' => $id,
                                        'msisdn' => $msisdn,
                                        'status' => 'Sent'
                                    ]);
                                }
                            }
                        }
                    }
                }else{
                    $numbers=file_get_contents($phone_numbers);
                    foreach (explode("\n", $numbers) as $key=>$msisdn){
                        $array[$key] = explode(',', $msisdn);
                        if ($msisdn !=''){

                            $curl = curl_init();

                            $id=uniqid();
                            $callBack='http://test.deywuro.com/voice/callback';
                            curl_setopt_array($curl, array(
                                CURLOPT_URL => "https://konnect.kirusa.com/api/v1/Accounts/f5L3nAw4iWPqolBAUj9iOA==/Calls",
                                CURLOPT_RETURNTRANSFER => true,
                                CURLOPT_ENCODING => "",
                                CURLOPT_MAXREDIRS => 10,
                                CURLOPT_TIMEOUT => 30,
                                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                                CURLOPT_CUSTOMREQUEST => "POST",
                                CURLOPT_POSTFIELDS => "{'id':'$id','caller_id':'233242436510','recipient':['$msisdn'],'media_url':'$filePath','direction':'outbound','callback_url':'$callBack'}",
                                CURLOPT_HTTPHEADER => array(
                                    "Authorization: 0+3I2VH+bFOa4G0KdxCaJ9ATSpn3zERnx6ax2FBvv/c=",
                                    "Content-Type: application/json"
                                ),
                            ));

                            $response = curl_exec($curl);
                            $err = curl_error($curl);

                            curl_close($curl);


                            \Illuminate\Support\Facades\Log::useFiles(storage_path().'/logs/access_voice.log');
                            \Illuminate\Support\Facades\Log::info("msisdn: $msisdn | response: $response ");


                            $user = Auth::user();
                            $userid = $user->id;

                            $voice = VoiceLogs::create([
                                'user_ID' => $userid,
                                'message_ID' => $id,
                                'msisdn' => $msisdn,
                                'status' => 'Sent'
                            ]);
                        }
                    }
                }


//                $no_pages = SmsTools::no_pages($no_chars);
//                $curr_bal = $credit->new_bal;

                //remaining sms user can send

                //reset session
                $step=0;
                $request->session()->forget('bulk_voice_data');
                if(!$request->session()->has('success') || empty(session('success')))
                    $request->session()->flash('success', 'Your contacts was successfully processed!');
            }
            //in case back button was pressed
            else
            {
                //go back to step 1
                $step=1;
            }
        }

        $templates = SavedMessage::where('user_id', auth()->id())->get();
        return view('voice.send_bulk_voice', ['step'=>$step, 'templates'=>$templates,
            'sender_ids' => UserSenderId::query()->where([['user_id',Auth::user()->id],['status',1]])->get()
        ]);
    }


    public function get_image_for_image($id) {
        $img = SmsImage::findOrFail($id);
        $mime_type = $img->mime_type;
        return Response::download($img->path, $img->file_name, ['Content-Type: '.$mime_type]);
    }

    public static function send_sms($msisdn, $msgs)
    {
        $should_send_sms = true; // bug-fix

        if($should_send_sms && !empty(trim($msisdn))) {
            $msisdn     = self::format_phone_number($msisdn);
            $senderId   = 'Deywuro';
            $username   = 'aamalan';
            $password   = '123456';

            try {
                $client = new Client();
                $response = $client->request('GET', 'http://api.deywuro.com/bulksms', [
                    'query' => [
                        'username' => $username,
                        'password' => $password,
                        'type' => '0',
                        'dlr' => '1',
                        'destination' => $msisdn,
                        'source' => $senderId,
                        'message' => $msgs
                    ]
                ]);
                //$body = $response->getBody();
            } catch (\Exception $e) {}
        }
    }

    public static function format_phone_number($phoneNumber){
        $phoneNumber = trim($phoneNumber);
        if(strlen($phoneNumber)==9 && !starts_with($phoneNumber, '0')) {
            return '233'.$phoneNumber;
        }
        if(strlen($phoneNumber)==10 && starts_with($phoneNumber, '0')) {
            return '233'.substr($phoneNumber, 1);
        }
        return $phoneNumber;
    }




    public function voice_callback_api(Request $request) {
        $ref_id = $request['ref_id'];
        $recipient = $request['recipient'];
        $caller_id = $request['caller_id'];
        $status = trim($request['status']);

//        dd(json_decode($request->getContent(), true));


        \Illuminate\Support\Facades\Log::useFiles(storage_path().'/logs/access_voice.log');

        \Illuminate\Support\Facades\Log::info("refid: $ref_id | receipient: $recipient | caller_id: $caller_id | status: $status");

        echo "dsrds";
    }
}
