<?php
/**
 * Created by PhpStorm.
 * User: sunilkhorwal
 * Date: 2021-05-21
 * Time: 12:36
 */

namespace App;


use App\Avanse\Logging\Logging;
use Carbon\Carbon;
use Illuminate\Http\Request;

class Bureau extends Logging {

    public function getReport(Request $request){

        if ($data = $this->hasReport($request)){
            return $request->merge($data);
        }

        $this->api = _env('AVANSE_BUREAU_API');
        $this->messageID = $this->request->get('id');

        $this->setPayload($request);
        $this->headers = array(
            'user_id:'._env('AVANSE_BUREAU_USER_ID'),
            'auth_key:'._env('AVANSE_BUREAU_AUTH_KEY'),
            'resp_type:'._env('AVANSE_BUREAU_RESP_TYPE'),
            'Content-Type:application/json',
            'Accept:application/json',
            'loan_type:'._env('AVANSE_BUREAU_LOAN_TYPE'),
            'product_type:'._env('AVANSE_BUREAU_PRODUCT_TYPE')
        );

        $curl = curl_init();

        curl_setopt_array($curl, array(
        CURLOPT_URL => $this->api,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => 'POST',
        CURLOPT_POSTFIELDS => json_encode($this->payload),
        CURLOPT_HTTPHEADER => $this->headers,
        ));

        $this->response = curl_exec($curl);

        curl_close($curl);

        $this->logging();
        return $this->mergeResponse($request);
    }

    private function hasReport(Request $request){
        $cibil = CibilBureau::where('application_id', $request->get('id'))->where('applicant_type', $request->get('applicant_type'))->first();
        return ['cibil_data' => $cibil, 'cibil_score' => ['min' => -1, 'max' => 0]];
        if(isset($cibil->id)){
            $cibil =  $cibil->toArray();
            unset($cibil['id']);
            return ['cibil_data' => $cibil, 'cibil_score' => $this->getScore($cibil)];
        }

        return false;
    }

    public function getScore($cibil){
        if (isset($cibil['band'])){

            switch ($cibil['band']){
                case 1 :
                    return ['min' => -1, 'max' => 0];
                    break;
                case 2 :
                    return ['min' => 1, 'max' => 299];
                    break;
                case 3 :
                    return ['min' => 300, 'max' => 709];
                    break;
                case 4 :
                    return ['min' => 710, 'max' => 720];
                    break;
                case 5 :
                    return ['min' => 721, 'max' => 730];
                    break;
                case 6 :
                    return ['min' => 731, 'max' => 735];
                    break;
                case 7 :
                    return ['min' => 736, 'max' => 750];
                    break;
                case 8 :
                    return ['min' => 751, 'max' => 766];
                    break;
                case 9 :
                case 10 :
                    return ['min' => 767, 'max' => '> 767'];
                    break;
            }
        }

        return false;
    }

    private function mergeResponse(Request $request){
        $data = $this->saveResponse($request);

        return is_array($data) ? $request->merge($data) : $request;
    }

    private function saveResponse(Request $request){
        $data = [];


        $report = json_decode($this->response);

        if (isset($report->errorDetails)){
            if($request->has('is_manually')){
                $response = '';
                if (is_object($report)) {
                    foreach ($report->errorDetails as $item) {
                        $response .= $item->errorMessage."\n";
                    }
                }
                return ['cibil_error' => false, 'message' => $response];
            }

            return ['cibil_error' => false];
        }

        if($report) {
            $date = Carbon::now()->toDateTimeString();
            foreach ($report as $item) {
                $data[] = array_merge((array) $item, ['application_id' => $request->get('id'), 'applicant_type' => $request->get('applicant_type') ?? 1, 'response' => $this->response, 'created_at' => $date]);
            }
        }
        if ($data) {
            CibilBureau::insert($data);
        }

        if($request->has('is_manually') && isset($data[0])){
            return ['status' => 'OK', 'message' => 'Cibil report generated successfully'];
        }

        return isset($data[0]) ? $data[0] : '';
    }

    private function setPayload(Request $request){

        $stateModel = StateModel::where('name', $request->get('state'))->first(['code_number']);

        $this->payload = [
            "id" => $request->get('id'),
            "enqAmount" => $request->get('loan_amount'),
            "fName" => $this->request->get('name'),
            "mName" => $this->request->get('mName'),
            "lName" => $this->request->get('lName'),
            "dob" => date('dmY', strtotime($request->get('dob'))),
            "gender" => $request->get('gender') == 'MALE' ? 2 : 1,
            "panNo" => $this->request->get('pan'),
            "mobile" => $this->request->get('mobile'),
            "resiAddress" => $request->get('address_line_1'),
            "landmark" => $request->get('landmark'),
            "city" => $request->get('city'),
            "state" => $request->get('state'),
            "pin" => $request->get('pincode'),
            "stateCode" => isset($stateModel->code_number) ? $stateModel->code_number : '',
            "country" => "India"
        ];
    }

    public function setBureauRequest(){
        $applicant_type = $this->request->get('applicant_type') ?? 1;
        $application = ConsumerApplication::find($this->request->get('id'));
        $_name = $applicant_type == 1 ? $application->name : $application->co_applicant_name;
        $dob = $applicant_type == 1 ? $application->dob : $application->co_applicant_dob;
        $gender = $applicant_type == 1 ? $application->gender : $application->co_applicant_gender;
        $pan = $applicant_type == 1 ? $application->pan_card : $application->co_applicant_pan_card;
        $mobile = $applicant_type == 1 ? $application->mobile_number : $application->co_applicant_mobile_number;
        $address_line_1 = $applicant_type == 1 ? $application->current_address__line_1 : $application->co_applicant_address_line_1;
        $landmark = $applicant_type == 1 ? $application->current_address_landmark : $application->co_applicant_address_landmark;
        $city = $applicant_type == 1 ? $application->current_address_city : $application->co_applicant_address_city;
        $state = $applicant_type == 1 ? $application->current_address_state : $application->co_applicant_address_state;
        $pin = $applicant_type == 1 ? $application->current_address_pincode : $application->co_applicant_address_pincode;

        $name = explode(' ', $_name);

        $firstName = isset($name[0]) ? $name[0] : '';
        $middleName = isset($name[1]) && isset($name[2]) ? $name[1] : '';
        $lastName = !isset($name[2]) && isset($name[1]) ? $name[1] : (isset($name[1]) && isset($name[2]) ? $name[2].(isset($name[3]) ? $name[3] : '') : '');

        $this->request->merge([
            'id' => $this->request->get('id'),
            'loan_amount' => $application->loan_amount,
            'name' => $firstName,
            'mName' => $middleName,
            'lName' => $lastName,
            'dob' => $dob,
            'gender' => $gender,
            'pan' => $pan,
            'mobile' => $mobile,
            'address_line_1' => $address_line_1,
            'landmark' => $landmark,
            'city' => $city,
            'state' => $state,
            'pincode' => $pin,
            'is_manually' => true,
            'applicant_type' => $applicant_type
        ]);

        return $this->request;
    }
}
