<?php

namespace App\Http\Controllers\Reseller;

use App\DataTables\MailPaymentHistoryDataTable;
use App\DataTables\SocialPricePerBalanceDataTable;
use App\DataTables\UserMailPaymentHistoryDataTable;
use App\EmailPricing;
use App\MediaPrice;
use App\SocialPayment;
use App\Traits\SocialSubscription;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;

class ResellerSocialPricingController extends Controller
{



    public function social_price_index(Request $request, SocialPricePerBalanceDataTable $social)
    {
        $user = auth()->user();
        $id = $user->id;
        $package = $user->social_balance;
        return $social->user($id)->render('reseller.pricing.social_index',compact('package'));
    }

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


        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('reseller.social.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->social_balance;
        return $request->isMethod('post') ? $this->social_price_post($request) : view('reseller.pricing.social_create',compact('package'));
    }

    public function social_price_edit(Request $request,MediaPrice $package)
    {

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


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

        $data = $request->validate(
            [
                'name'        => 'required|unique:media_prices',
                'cost'        => 'required',
                'no_of_post'  => 'required',
                'apply_to'    => 'required',
                'is_active'   => 'required',
            ]
        );

        if($package->media_price->package_type == 'limited')
            $request->validate(
                [
                    'no_of_post'  => 'required|max:'.$package->no_of_post,
                ]
            );



        $balance = [
            'no_of_post'   =>    $package->no_of_post - $data['no_of_post'],
        ];


        DB::beginTransaction();
            $package->update($balance);
            $user->media_price()->create($data);
            auth()->user()->trail("CREATED SOCIAL Pricing {$data['name']}");
        DB::commit();

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


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

        $balance = $user->social_balance;

        $data = $request->validate(
            [
                'name'        => 'required|unique:media_prices,id,'.$package->id,
                'cost'        => 'required',
                'no_of_post'  => 'required',
                'apply_to'    => 'required',
                'is_active'   => 'required',
            ]
        );




        if($balance->media_price->package_type == 'limited')
            $request->validate(
                [
                    'no_of_post'  => 'required|max:'.$package->no_of_post,
                ]
            );


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

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

        if($balance->media_price->package_type == 'limited') {
            $validator = Validator::make((array)$balance_data, [
                'no_of_post' => "min:0|max:$balance->no_of_post",
            ]);

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


            $balance_data = ['no_of_post' => $balance->no_of_post + $balance_data['no_of_post']];



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

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

    }


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

        return $balance_data;
    }

    public function social_price_destroy(MediaPrice $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 social_payment_history(MailPaymentHistoryDataTable $history)
    {
        return $history->render('reseller.pricing.history');
    }

    public function subscription_index()
    {
        abort(404)

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


    public function subscription_signup(Request $request,MediaPrice $package)
    {
        return $request->isMethod('post') ? $this->subscription_post($request,$package) :view('reseller.subscription.social.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['media_price_id']   = $package->id;
        $data['callback']         = route('social.payment.callback');
        $data['transaction_id']   = $data['user_id'].'_'.Str::random('20');
        $data['request_body']     = json_encode($data);
        $data = (object)$data;


        $payment = $this->socialPayCurl($data);
        return $payment->status ?? 'failed' == 'success' ? redirect()->route('reseller.social.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 socialPayCurl($params)
    {

        SocialPayment::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 SOCIAL 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);
    }

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