<?php

namespace App\Http\Controllers\Reseller;

use App\DataTables\EmailPricePerBalanceDataTable;
use App\DataTables\MailPaymentHistoryDataTable;
use App\DataTables\UserMailPaymentHistoryDataTable;
use App\EmailPricing;
use App\MailPayment;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;

class ResellerEmailPricingController extends Controller
{
    public function email_price_index(Request $request, EmailPricePerBalanceDataTable $email)
    {
        $user = auth()->user();
        $id = $user->id;
        $package = $user->balance;
        return $email->user($id)->render('reseller.pricing.email_index',compact('package'));
    }

    public function email_price_create(Request $request)
    {
        $user = auth()->user();
        $limit = $user->subscriptionLimits();// check for subscription limits and redirect accordingly


        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('reseller.email.subscription.index');
            $flash = $user->under_reseller() ? 'Contact your account administrator to sign up on a mail package': 'kindly choose a package here !!';
            return redirect($route)->withErrors($flash);
        endif;

        $package = $user->balance;
        return $request->isMethod('post') ? $this->email_price_post($request) : view('reseller.pricing.email_create',compact('package'));
    }

    public function email_price_edit(Request $request,EmailPricing $package)
    {

        return $request->isMethod('post') ? $this->email_price_update($request,$package) : view('reseller.pricing.email_edit',['package'=>$package]);
    }


    public function email_price_post($request)
    {
        $user = auth()->user();
        $package = $user->balance;;  //get package limits

        $data = $request->validate(
            [
                'package'     => 'required|unique:email_pricing',
                'description' => 'sometimes|nullable|max:500',
                'no_contacts' => 'required|integer|max:'.$package->no_contacts,
                'no_audience' => 'required|integer|max:'.$package->no_audience,
                'no_emails'   => 'required|integer|max:'.$package->no_emails,
                'is_active'   => 'required',
            ]
        );


        $balance = [
            'no_contacts'   =>   $package->no_contacts - $data['no_contacts'],
            'no_audience'   =>   $package->no_audience - $data['no_audience'],
            'no_emails'     =>   $package->no_emails   - $data['no_emails'],
        ];


        DB::beginTransaction();

            $package->update($balance);
            $user->email_pricing()->create($data);
            auth()->user()->trail("CREATED Email Pricing {$data['package']}");

        DB::commit();

        return redirect()->route('reseller.email.price.setup.index')->with('success', 'Pricing Successfully Created !!');
    }


    public function email_price_update($request,$package)
    {
        $user = auth()->user();

        $balance = $user->balance;

        $data = $request->validate(
            [
                'package'     => 'required|unique:email_pricing,id,'.$package->id,
                'no_contacts' => 'required|integer',
                'no_audience' => 'required|integer',
                'no_emails'   => 'required|integer',
                'is_active'   => 'required',
                'description' => 'sometimes|nullable|max:500',
            ]
        );


        /**
         ** for balance updates when the values increases or decreases;
         **/

        $balance_data['no_contacts'] = $this->contacts($package,$request);
        $balance_data['no_audience'] = $this->no_audience($package,$request);
        $balance_data['no_emails']   = $this->no_emails($package,$request);


        $validator = Validator::make((array)$balance_data, [
            'no_contacts' => "min:0|max:$balance->no_contacts",
            'no_emails'   => "min:0|max:$balance->no_emails",
            'no_audience' => "min:0|max:$balance->no_audience",
        ]);




        if ($validator->fails()) {
            return redirect()->back()
                ->withErrors($validator)->withInput();
        }


            $balance_data =
                [
                     'no_contacts' => $balance->no_contacts + $balance_data['no_contacts'],
                     'no_audience' => $balance->no_audience + $balance_data['no_audience'],
                     'no_emails'   => $balance->no_emails   + $balance_data['no_emails'],
                ];



        DB::beginTransaction();
        $balance->update($balance_data);
        $package->update($data);
        \auth()->user()->trail("UPDATED Email Package {$data['package']}");
        DB::commit();

        return redirect()->route('reseller.email.price.setup.index')->with('success', 'Pricing Successfully UPDATED !!');

    }


    public function contacts($package,$request)
    {
        if($package->no_contacts > $request->no_contacts)
            $balance_data =  $package->no_contacts - $request->no_contacts ;
        elseif($package->no_contacts < $request->no_contacts)  //if incoming value is greater than existing
            $balance_data = -(-$package->no_contacts + $request->no_contacts);
        else
//            $balance_data = (int)$request->no_contacts;
            $balance_data = 0;

        return $balance_data;
    }

    public function no_emails($package, $request)
    {
        if($package->no_audience > $request->no_audience)
            $balance_data =  $package->no_audience - $request->no_audience ;
        elseif($package->no_audience < $request->no_audience)
            $balance_data = -(-$package->no_audience + $request->no_audience);
        else
            $balance_data = 0;

        return $balance_data;

    }

    public function no_audience($package,$request)
    {
        if($package->no_audience > $request->no_audience)
            $balance_data =  $package->no_audience - $request->no_audience ;
        elseif($package->no_audience < $request->no_audience)
            $balance_data = -(-$package->no_audience + $request->no_audience);
        else
            $balance_data = 0;


        return $balance_data;

    }

//    public function email_price_update($request,$package)
//    {
//        $user = auth()->user();
//        $balance = $user->balance;
//        $data = $request->validate(
//            [
//                'package'     => 'required|unique:email_pricing,id,'.$package->id,
//                'no_contacts' => 'required|integer',
//                'no_audience' => 'required|integer',
//                'no_emails'   => 'required|integer',
//                'is_active'   => 'required',
//                'description' => 'sometimes|nullable|max:500',
//            ]
//        );
//
//
//
//        $reverse =  (object)$this->reverseCalculation($balance,$package,(object)$data);
//
//
//
//
//
//        $balance_data = [
//
//            'no_contacts'   =>   $balance->no_contacts -  ( $reverse->no_contacts  == $data['no_contacts'] ? 0: $data['no_audience']),
//            'no_audience'   =>   $balance->no_audience -  ( $reverse->no_audience  == $data['no_audience'] ? 0: $data['no_audience']),
//            'no_emails'     =>   $balance->no_emails   -  ( $reverse->no_emails    == $data['no_emails']   ? 0: $data['no_emails']),
//        ];
//
//
//
//        $data['no_audience']  =  $reverse->no_audience;
//        $data['no_contacts']  =  $reverse->no_contacts;
//        $data['no_emails']    =  $reverse->no_emails;
//
//        dd($reverse,$balance_data,$package->toArray(),$balance->toArray());
//
//
//        DB::beginTransaction();
//            $balance->update($balance_data);
//            $package->update($data);
//            \auth()->user()->trail("UPDATED Email Package {$data['package']}");
//        DB::commit();
//
//        return redirect()->route('reseller.email.price.setup.index')->with('success', 'Pricing Successfully UPDATED !!');
//
//        //        $validator = Validator::make((array)$reverse, [
////            'no_contacts' => "lte:$balance->no_contacts",
////            'no_emails' => 'lte:'.$balance->no_audience,
////            'no_audience' => 'lte:'.$balance->no_audience,
////        ]);
////
////        dd($validator->fails(),$reverse,$balance->toArray());
////
////
////        if ($validator->fails()) {
////            return redirect()->back()
////                ->withErrors($validator)
////                ->withInput();
////        }
//    }



    function reverseCalculation($balance,$existingPackage,$request)
    {

        $data = [];
        $data['no_contacts'] = $request->no_contacts != $existingPackage->no_contacts ? $this->manipulate($request->no_contacts,$existingPackage->no_contacts) : $request->no_contacts;
        $data['no_audience'] = $request->no_audience != $existingPackage->no_audience ? $this->manipulate($request->no_audience,$existingPackage->no_audience) : $request->no_audience;
        $data['no_emails']   = $request->no_emails   != $existingPackage->no_emails   ? $this->manipulate($request->no_emails,$existingPackage->no_emails)     : $request->no_emails;

        return $data;

    }

    public function manipulate($x, $y)
    {
        if($x > $y)   //x = incoming value    and y= old value to be updated
        {
            $value =  $x -$y;
        }
        else{
            $value =  -$x + $y;
        }
        return $value;
    }

    public function email_price_destroy(EmailPricing $package)
    {
        DB::beginTransaction();
        \auth()->user()->trail("DELETED Email Package {$package->package}");
        $package->delete();
        DB::commit();

        return redirect()->back()->with('success',"Package Successfully Deleted");

    }

    public function email_payment_history(MailPaymentHistoryDataTable $history)
    {
        return $history->render('reseller.pricing.history');
    }



    public function subscription_index()
    {

        $packages = EmailPricing::query()->where([['is_active',true],['user_id',null]])->get();
        $subscription = auth()->user()->subscription;
        $subscriptionIsValid = auth()->user()->subscriptionIsValid();
        return view('reseller.subscription.index',compact('packages','subscription','subscriptionIsValid'));
    }


    public function subscription_signup(Request $request,EmailPricing $package)
    {
        return $request->isMethod('post') ? $this->subscription_post($request,$package) :view('reseller.subscription.payment',compact('package'));
    }

    public function subscription_post($request,$package)
    {


        $data = $request->validate(
            [
                'operator' => 'required',
                'momo_number' => 'required',
                'amount' => 'required',
                'voucher' => 'required_if:operator,==,vodafone',
            ]
        );

        $data['user_id']          = auth()->user()->id;
        $data['username']         = auth()->user()->username;
        $data['email_pricing_id'] = $package->id;
        $data['callback']         = route('email.payment.callback');
        $data['transaction_id']   = $data['user_id'].'_'.Str::random('20');
        $data['request_body']     = json_encode($data);
        $data = (object)$data;


        $payment = $this->chimpPaymentCurl($data);
        return $payment->status ?? 'failed' == 'success' ? redirect()->route('reseller.email.subscription.index')->with(
                'success','Payment successfully initiated Kindly check your momo wallet to approve the transaction.') :
                redirect()->back()->withErrors('Error Payment could not be initiated Kindly try again !!');

    }


    public function payment_history(UserMailPaymentHistoryDataTable $history)
    {
        return $history->render('reseller.subscription.history');
    }


    public function chimpPaymentCurl($params)
    {

        MailPayment::query()->create((array)$params);

        $paymentEndpoint = "https://pay.npontu.com/api/pay";

        $request = array(
            'number' => $params->momo_number,
            'vendor' => $params->operator,
            'uid' => 'npdeywuro',
            'pass' => 'hdgt2314',
            'tp' => $params->transaction_id,
            'cbk' => $params->callback,
            'amt' => $params->amount,
            'msg' => 'DEYWURO EMAIL PAYMENT',
            'vou' => $params->voucher,
            'trans_type' => 'Debit'
        );
        $ch = curl_init($paymentEndpoint);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        return json_decode($output);
    }
}
