<?php

namespace App\Http\Controllers\Admin;

use App\Bank;
use App\ConsumerApplication;
use App\Http\Controllers\Controller;
use App\Merchant;
use App\MerchantBank;
use App\MerchantBankCenter;
use App\PayoutCF\PayoutCFAPI;
use Illuminate\Http\Request;

class CFPayoutService extends Controller
{
    /**
     * @var Request
     */
    private $request;

    public function __construct(Request $request){
        $this->request = $request;
    }

    public function addBeneficiary(PayoutCFAPI  $payoutCFAPI){

        $application = ConsumerApplication::with('bank_details', 'merchant', 'merchant_bank_details', 'application_element.merchant_center.bank_details')->where('id',$this->request->get('application_id'))->first(['id', 'merchant_id', 'lender_id', 'purpose']);


        $uniCode = substr(md5(uniqid(rand(), true)), 0, 5);

        if ($application->purpose == 3){

            $email = $application->email;
            $phone = $application->mobile_number;
            $address = $application->current_address_line_1;
            $city = $application->current_address_city;
            $state = $application->current_address_state;
            $pincode = $application->current_address_pincode;
            $beneID = strtoupper($application->id.$uniCode);
            $bank = ['bank' => $application->bank_details, 'type' => 'application'];

        }else {

            $bank = $this->getBankDetails($application);

            if ($bank['type'] == 'centre') {
                $email = explode(',', $application->application_element->merchant_center->email)[0];
                $phone = $application->application_element->merchant_center->phone;
                $address = $application->application_element->merchant_center->location;
                $city = '';
                $state = $application->application_element->merchant_center->state;
                $pincode = '';
                $beneID = strtoupper($application->application_element->merchant_center->id.$uniCode);
            } else {
                $email = explode(',', $application->merchant->email)[0];
                $phone = $application->merchant->contact;
                $address = $application->merchant->address;
                $city = $application->merchant->city;
                $state = $application->merchant->state;
                $pincode = $application->merchant->pincode;
                $beneID = strtoupper($application->merchant->id.$uniCode);
            }
        }

        $this->request->merge([
            "beneId" => $beneID,
            "name" => $bank['bank']->name,
            "email" => $email,
            "phone" => $phone,
            "bankAccount" => $bank['bank']->account_number,
            "ifsc" => $bank['bank']->ifsc ?? $bank['bank']->ifsc_code,
            "address1" => $address,
            "city" => $city,
            "state" => $state,
            "pincode" => $pincode
        ]);

        $CFBeneID = $payoutCFAPI->getBeneficiaryDetails();
        if ($payoutCFAPI->error){
            return $payoutCFAPI->error;
        }
        if ($CFBeneID){
            if ($bank['type'] == 'centre'){
                MerchantBankCenter::where('id', $bank['bank']->id)->update(['beneficiary_id' => $CFBeneID]);
            }else if ($bank['type'] == 'merchant'){
                MerchantBank::where('id',$bank['bank']->id)->update(['beneficiary_id' => $CFBeneID]);
            }else if ($bank['type'] == 'application'){
                Bank::where('id',$bank['bank']->id)->update(['beneficiary_id' => $CFBeneID]);
            }
        }
    }

    private function getBankDetails($application){
        $bankDetail = 1;

        $is_gst_applicable = $application->merchant->is_gst ?? 0;
        $bank_details = $application->application_element->merchant_center->bank_details ?? '';

        $user['center_bank'] = $bank_details;
        $user['center_gst_number'] = $application->application_element->merchant_center->gst_number ?? '';

        if ($is_gst_applicable == 0 && isset($user['center_bank']->account_holder)){
            if ($user['center_bank']->account_holder && empty($user['center_gst_number'])){
                $bankDetail = 0;
            }else if(!empty($user['center_gst_number']) && !$user['center_bank']->account_holder){
                $bankDetail = 1;
            }else if(!empty($user['center_gst_number']) && $user['center_bank']->account_holder){
                $bankDetail = 0;
            }else if(empty($user['center_gst_number']) && !$user['center_bank']->account_holder){
                $bankDetail = 1;
            }
        }else{
            if (isset($user['center_bank']->account_holder) && $user['center_bank']->account_holder && empty($user['center_gst_number'])){
                $bankDetail = 1;
            }else if(!empty($user['center_gst_number']) && (!isset($user['center_bank']->account_holder) || !$user['center_bank']->account_holder)){
                $bankDetail = 1;
            }else if(!empty($user['center_gst_number']) && (isset($user['center_bank']->account_holder) && $user['center_bank']->account_holder)){
                $bankDetail = 0;
            }else if(empty($user['center_gst_number']) && (!isset($user['center_bank']->account_holder) || !$user['center_bank']->account_holder)){
                $bankDetail = 1;
            }
        }
        if ($bankDetail){
            return ['bank' => $application->merchant_bank_details, 'type' => 'merchant'];
        }else{
            return ['bank' => $user['center_bank'], 'type' => 'centre'];
        }
    }
}