<?php

namespace App\Http\Controllers;

use App\Helpers\AppDataFormatter;
use Yajny\EventsYj\Events\InitiateUserBalance;
use Yajny\EventsYj\Listeners\InitiateBalance;
use Yajny\Member\Models\Member;
use Yajny\Member\Models\PayoutMethods;
use App\User;
use Yajny\Member\Models\Currencies;
use Illuminate\Support\Facades\DB;
use Yajny\Member\Models\UserExpiredAvailableAmount;
use Yajny\Member\Models\UserFavourite;
use Yajny\Member\Models\UserPayouts;
use Yajny\Member\Models\UsersBalance;

class WalletController extends MemberController
{
    public function getUserWallet()
    {

        $memberCurrency = $this->member->getUserCurrency();
        $userBalanceOld=UsersBalance::where("user_id",$this->member->user_id)->first();
        if (!$userBalanceOld){
            $newUserBalance=New UsersBalance();
            $newUserBalance->user_id=$this->member->user_id;
            $newUserBalance->save();
        }
        $userBalanceModel = UsersBalance::where('user_id', $this->member->user_id)->first();
        if (is_null($userBalanceModel)) {
            $WalletBalance = $this->member->getWalletBalance();
            $userBalance = AppDataFormatter::formatBalanceForWalletPage($WalletBalance, $memberCurrency);
            $BalanceFormatted = $this->getBalanceFormatted();
            $userBalance["cashback"] = $BalanceFormatted["cashback"]["available"];
            $userBalance["cashback_formatted"] = $BalanceFormatted["cashback"]["available_formatted"];
            $userBalance["reward"] = $BalanceFormatted["reward"]["available"];
            $userBalance["reward_formatted"] = $BalanceFormatted["reward"]["available_formatted"];
            $userBalance["total_earned"] = $BalanceFormatted["cashback"]["available"] + $BalanceFormatted["reward"]["available"];
            if (is_null($memberCurrency) || $memberCurrency->iso_code == 'USD') {
                $userBalance["total_earned_formatted"] = $userBalance["total_earned"] . ' USD';
                $userBalance["total_unwithdrawn_formatted"] = 0 . ' USD';
            } else {
                $userBalance["total_earned_formatted"] = ($userBalance["total_earned"]) . ' ' . $memberCurrency->iso_code;
                $userBalance["total_unwithdrawn_formatted"] = 0 . ' ' . $memberCurrency->iso_code;
            }
            // converting user balance to stars
            $UserConvertedBalance = $WalletBalance["balance"] * 1000;
        } else {
            $userBalance["balance"] = $userBalanceModel->available_amount + $userBalanceModel->pending_amount;
            if (is_null($memberCurrency) || $memberCurrency->iso_code == 'USD') {
                $userBalance["balance_formatted"] = $userBalance["balance"] . ' USD';
                $userBalance["pending_formatted"] = ($userBalanceModel->pending_amount) . ' USD';
                $userBalance["available_formatted"] = $userBalanceModel->available_amount . ' USD';
                $userBalance["bonus_formatted"] = ($userBalanceModel->confirmed_bonus + $userBalanceModel->pending_bonus) . ' USD';
                $userBalance["cashback_formatted"] = ($userBalanceModel->confirmed_cashback) . ' USD';
                $userBalance["total_earned"] = $userBalanceModel->confirmed_cashback + $userBalanceModel->confirmed_bonus;
                $userBalance["total_earned_formatted"] = $userBalance["total_earned"] . ' USD';
                $userBalance["total_unwithdrawn_formatted"] = UserExpiredAvailableAmount::where('user_id', $this->member->user_id)->sum('amount');
                $userBalance["total_payout_formatted"] = $userBalanceModel->confirmed_payout_amount . ' USD';
                $userBalance["reward_formatted"] = $userBalanceModel->confirmed_bonus . ' USD';
            } else {
                $availableAmountField = 'available_amount_' . strtolower($memberCurrency->iso_code);
                $confirmedAmountField = 'confirmed_amount_' . strtolower($memberCurrency->iso_code);
                $pendingAmountField = 'pending_amount_' . strtolower($memberCurrency->iso_code);
                $confirmedPayoutAmountField = 'confirmed_payout_amount_' . strtolower($memberCurrency->iso_code);
                $confirmedBonusField = 'confirmed_bonus_' . strtolower($memberCurrency->iso_code);
                $pendingBonusField = 'pending_bonus_' . strtolower($memberCurrency->iso_code);
                $confirmedCashbackField = 'confirmed_cashback_' . strtolower($memberCurrency->iso_code);
                $pendingCashbackField = 'pending_cashback_' . strtolower($memberCurrency->iso_code);
                $userBalance["balance_formatted"] = ($userBalanceModel->$availableAmountField + $userBalanceModel->$pendingAmountField) . ' ' . $memberCurrency->iso_code;
                $userBalance["pending_formatted"] = ($userBalanceModel->$pendingAmountField) . ' ' . $memberCurrency->iso_code;
                $userBalance["available_formatted"] = $userBalanceModel->$availableAmountField . ' ' . $memberCurrency->iso_code;
                $userBalance["bonus_formatted"] = ($userBalanceModel->$confirmedBonusField + $userBalanceModel->$pendingBonusField) . ' ' . $memberCurrency->iso_code;
                $userBalance["cashback_formatted"] = ($userBalanceModel->$confirmedCashbackField) . ' ' . $memberCurrency->iso_code;
                $userBalance["total_earned"] = $userBalanceModel->$confirmedCashbackField + $userBalanceModel->$confirmedBonusField;
                $userBalance["total_earned_formatted"] = $userBalance["total_earned"] . ' ' . $memberCurrency->iso_code;
                $userBalance["total_payout_formatted"] = $userBalanceModel->$confirmedPayoutAmountField . ' ' . $memberCurrency->iso_code;
                $userBalance["total_unwithdrawn_formatted"] = UserExpiredAvailableAmount::where('user_id', $this->member->user_id)->sum('amount_' . strtolower($memberCurrency->iso_code));
                $userBalance["reward_formatted"] = $userBalanceModel->$confirmedBonusField . ' ' . $memberCurrency->iso_code;
            }

            $userBalance["pending"] = $userBalanceModel->pending_amount;
            $userBalance["available"] = $userBalanceModel->available_amount;
            $userBalance["bonus"] = $userBalanceModel->confirmed_bonus + $userBalanceModel->pending_bonus;
            $userBalance["cashback"] = $userBalanceModel->confirmed_cashback + $userBalanceModel->pending_cashback;
            $userBalance["reward"] = $userBalanceModel->confirmed_bonus;
            // converting user balance to stars
            $UserConvertedBalance = $userBalance["balance"] * 1000;
        }
        $Balance=[];
        $UserBalance=UsersBalance::where("user_id",$this->user_id)->first();
        $Balance["Formatted_Balance_USD"]=$UserBalance->available_amount.' USD';
        $Balance["Formatted_Balance_EGP"]=$UserBalance->available_amount_egp.' EGP';
        $Balance["Formatted_Balance_SAR"]=$UserBalance->available_amount_sar.' SAR';
        $Balance["Formatted_Balance_AED"]=$UserBalance->available_amount_aed.' AED';
        $Balance["Formatted_Balance_KWD"]=$UserBalance->available_amount_kwd.' KWD';
        $Balance["Balance_USD"]=$UserBalance->available_amount;
        $Balance["Balance_EGP"]=$UserBalance->available_amount_egp;
        $Balance["Balance_SAR"]=$UserBalance->available_amount_sar;
        $Balance["Balance_AED"]=$UserBalance->available_amount_aed;
        $Balance["Balance_KWD"]=$UserBalance->available_amount_kwd;
        $Max_Withdraw_Amount=[];
        if ($UserBalance->confirmed_cashback==0){
            $Max_Withdraw_Amount["Max_Withdraw_Formatted_USD"]='0 USD';
            $Max_Withdraw_Amount["Max_Withdraw_Formatted_EGP"]='0 EGP';
            $Max_Withdraw_Amount["Max_Withdraw_Formatted_SAR"]='0 SAR';
            $Max_Withdraw_Amount["Max_Withdraw_Formatted_AED"]='0 AED';
            $Max_Withdraw_Amount["Max_Withdraw_Formatted_KWD"]='0 KWD';
            $Max_Withdraw_Amount["Max_Withdraw_USD"]=0;
            $Max_Withdraw_Amount["Max_Withdraw_EGP"]=0;
            $Max_Withdraw_Amount["Max_Withdraw_SAR"]=0;
            $Max_Withdraw_Amount["Max_Withdraw_AED"]=0;
            $Max_Withdraw_Amount["Max_Withdraw_KWD"]=0;
        }
        if ($UserBalance->confirmed_bonus<=$UserBalance->confirmed_cashback){

            $Max_Withdraw_Amount["Max_Withdraw_Formatted_USD"]=$UserBalance->available_amount.' USD';
            $Max_Withdraw_Amount["Max_Withdraw_Formatted_EGP"]=$UserBalance->available_amount_egp.' EGP';
            $Max_Withdraw_Amount["Max_Withdraw_Formatted_SAR"]=$UserBalance->available_amount_sar.' SAR';
            $Max_Withdraw_Amount["Max_Withdraw_Formatted_AED"]=$UserBalance->available_amount_aed.' AED';
            $Max_Withdraw_Amount["Max_Withdraw_Formatted_KWD"]=$UserBalance->available_amount_kwd.' KWD';
            $Max_Withdraw_Amount["Max_Withdraw_USD"]=$UserBalance->available_amount;
            $Max_Withdraw_Amount["Max_Withdraw_EGP"]=$UserBalance->available_amount_egp;
            $Max_Withdraw_Amount["Max_Withdraw_SAR"]=$UserBalance->available_amount_sar;
            $Max_Withdraw_Amount["Max_Withdraw_AED"]=$UserBalance->available_amount_aed;
            $Max_Withdraw_Amount["Max_Withdraw_KWD"]=$UserBalance->available_amount_kwd;
        }else{

            $Max_Withdraw_Amount["Max_Withdraw_Formatted_USD"]=2*$UserBalance->confirmed_cashback.' USD';
            $Max_Withdraw_Amount["Max_Withdraw_Formatted_EGP"]=2*$UserBalance->confirmed_cashback_egp.' EGP';
            $Max_Withdraw_Amount["Max_Withdraw_Formatted_SAR"]=2*$UserBalance->confirmed_cashback_sar.' SAR';
            $Max_Withdraw_Amount["Max_Withdraw_Formatted_AED"]=2*$UserBalance->confirmed_cashback_aed.' AED';
            $Max_Withdraw_Amount["Max_Withdraw_Formatted_KWD"]=2*$UserBalance->confirmed_cashback_kwd.' KWD';
            $Max_Withdraw_Amount["Max_Withdraw_USD"]=2*$UserBalance->confirmed_cashback;
            $Max_Withdraw_Amount["Max_Withdraw_EGP"]=2*$UserBalance->confirmed_cashback_egp;
            $Max_Withdraw_Amount["Max_Withdraw_SAR"]=2*$UserBalance->confirmed_cashback_sar;
            $Max_Withdraw_Amount["Max_Withdraw_AED"]=2*$UserBalance->confirmed_cashback_aed;
            $Max_Withdraw_Amount["Max_Withdraw_KWD"]=2*$UserBalance->confirmed_cashback_kwd;
        }

        $availableCashback=$availableBonus=[];
        // available cashback
        $availableCashbackUSD=$userBalanceModel->confirmed_cashback-$userBalanceModel->payout_cashback_amount;
        $availableCashbackEGP=$userBalanceModel->confirmed_cashback_egp-$userBalanceModel->payout_cashback_amount_egp;
        $availableCashbackSAR=$userBalanceModel->confirmed_cashback_sar-$userBalanceModel->payout_cashback_amount_sar;
        $availableCashbackAED=$userBalanceModel->confirmed_cashback_aed-$userBalanceModel->payout_cashback_amount_aed;
        $availableCashbackKWD=$userBalanceModel->confirmed_cashback_kwd-$userBalanceModel->payout_cashback_amount_kwd;
        $availableCashback["available_cashback_amount_USD"]=$availableCashbackUSD." USD";
        $availableCashback["available_cashback_amount_EGP"]=$availableCashbackEGP." EGP";
        $availableCashback["available_cashback_amount_SAR"]=$availableCashbackSAR." SAR";
        $availableCashback["available_cashback_amount_AED"]=$availableCashbackAED." AED";
        $availableCashback["available_cashback_amount_KWD"]=$availableCashbackKWD." KWD";
        // available bonus
        $availablebonusUSD=$userBalanceModel->confirmed_bonus-$userBalanceModel->payout_bonus_amount;
        $availablebonusEGP=$userBalanceModel->confirmed_bonus_egp-$userBalanceModel->payout_bonus_amount_egp;
        $availablebonusSAR=$userBalanceModel->confirmed_bonus_sar-$userBalanceModel->payout_bonus_amount_sar;
        $availablebonusAED=$userBalanceModel->confirmed_bonus_aed-$userBalanceModel->payout_bonus_amount_aed;
        $availablebonusKWD=$userBalanceModel->confirmed_bonus_kwd-$userBalanceModel->payout_bonus_amount_kwd;
        $availableBonus["available_bonus_amount_USD"]=$availablebonusUSD." USD";
        $availableBonus["available_bonus_amount_EGP"]=$availablebonusEGP." EGP";
        $availableBonus["available_bonus_amount_SAR"]=$availablebonusSAR." SAR";
        $availableBonus["available_bonus_amount_AED"]=$availablebonusAED." AED";
        $availableBonus["available_bonus_amount_KWD"]=$availablebonusKWD." KWD";
        $payoutRule=DB::table('options_manager')->where('option_key',"payout_rule")->first();
        $usedRule="oldRule";
        if ($payoutRule->option_value==1)
            $usedRule="newRule";

        return [
            "Max_Withdraw"=>$Max_Withdraw_Amount,
            "Formatted_balance"=>$Balance,
            'user' => $this->member,
            'balance' => $userBalance,
            'available_cashback'=>$availableCashback,
            'available_bonus'=>$availableBonus,
            'points' => number_format($UserConvertedBalance, 0, ",", " "),
            //'favorites' => AppDataFormatter::formatFavoritesForWalletPage(UserFavourite::getUserFavoritesGrouped($this->member->user_id)['store']),
            'transactions' => AppDataFormatter::formatTransactionsForWalletPage($this->member->getTransactions(5), $memberCurrency, true),
            'cashouts' => AppDataFormatter::formatPayoutsForWalletPage($this->member->getWalletPayouts(5)->items(), $memberCurrency),
            //'clicks' => AppDataFormatter::formatClicksForWalletPage($this->member->getWalletClicks(5)-
            "payoutRule"=>$usedRule
        ];
    }

    public function getTransaction()
    {
        $memberCurrency = $this->member->getUserCurrency();
        return AppDataFormatter::formatTransactions($this->member->getWalletTransactions($memberCurrency->iso_code), $memberCurrency, true);
    }

    public function getUserFavoriteStores()
    {
        return [
            'stores' => AppDataFormatter::formatFavoritesForWalletPage(UserFavourite::getUserFavoritesGrouped($this->member->user_id)['store'])
        ];
    }

    public function getUserTransactions()
    {
        if (request('page') && filter_var(request('page'), FILTER_VALIDATE_INT) !== false && request('page') >= 1) {
            $limit = 20;
            $memberCurrency = $this->member->getUserCurrency();
            $transactionsSettings = $this->member->getTransactionsPaginationSettings($limit);
            $transactions = AppDataFormatter::formatTransactionsForWalletPage($this->member->getTransactions($limit, request('page')), $memberCurrency, true, true);

            return [
                'transactions' => $transactions,
                'current_page' => request('page'),
                'last_page' => request('page') >= $transactionsSettings['pages_count']
            ];
        } else
            return;
    }

    public function getUserCashouts()
    {
            $memberCurrency = $this->member->getUserCurrency();
            $cashouts = UserPayouts::where('user_id',$this->member->user_id)
                ->with([
                'method_info' => function ($q) {
                    $q->withoutGlobalScopes()->selectRaw(PayoutMethods::colSelect());
                }
            ])
                ->orderBy('id', 'DESC')
                ->get();
            $dataFormatted=[];
                foreach ($cashouts as $payout) {
                    $payout->applyCurrencyConversion($memberCurrency);
                    $dataFormatted[]= [
                        'id' => $payout->id,
                        'user_id' => $payout->user_id,
                        'method_code' => $payout->method_code,
                        'title' => [
                            'en' => $payout->method_info->name_en,
                            'ar' => $payout->method_info->name_ar
                        ],
                        'account' => $payout->account,
                        'amount' => $payout->local_amount,
                        'amount_formatted' => $payout->local_amount_formatted,
                        'currency' => $payout->local_currency,
                        'status' => $payout->status,
                        'paid_at' => $payout->paid_at,
                        'created_at' => $payout->created_at->toDateTimeString(),
                    ];
                }
                return [
                    'cashouts' => $dataFormatted,

                ];



    }

    public function getUserClicks()
    {
        if (request('page') && filter_var(request('page'), FILTER_VALIDATE_INT) !== false && request('page') >= 1) {
            $limit = 20;
            $clicks = $this->member->getWalletClicks($limit, request('page'));
            $clicksFormatted = AppDataFormatter::formatClicksForWalletPage($clicks->items());

            return [
                'clicks' => $clicksFormatted,
                'current_page' => request('page'),
                'last_page' => request('page') >= $clicks->lastPage()
            ];
        } else
            return;
    }
}
