<?php

namespace App\Console\Commands;

use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Yajny\Member\Models\UserPayouts;
use Yajny\Member\Models\UserSales;
use Yajny\Member\Models\UsersBalance;

class CalculatePayoutBalance extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'calculate_payout_balance:run';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'update user balance based on their payouts';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $startTime = microtime(true);

        $users = UsersBalance::where([['payout_cashback_amount', 0], ['payout_bonus_amount', 0], ['confirmed_payout_amount', '>', 0]])->limit(50)->get();
        foreach ($users as $userBalance) {
            $user_id = $userBalance->user_id;
            $userPayouts = UserPayouts::where([['user_id', $user_id], ['status', "completed"]])->get();
            foreach ($userPayouts as $userPayout) {
                $payoutDate = Carbon::parse($userPayout->created_at)->toDate();
                $userSales = UserSales::where([["user_id", $user_id], ["status", "confirmed"], ['updated_at', '<', $payoutDate]])->select(DB::raw("sum(cashback) as cashback ,sum(cashback_egp) as cashback_egp ,sum(cashback_sar) as cashback_sar ,sum(cashback_aed) as cashback_aed ,sum(cashback_kwd) as cashback_kwd"))->get();
                $actualCashback = $userSales[0]->cashback - $userBalance->payout_cashback_amount;
                $payout_cashback_amount = $actualCashback - $userPayout->amount;
                if ($payout_cashback_amount <= 0) {
                    $userBalance->payout_cashback_amount += $actualCashback;
                    $userBalance->payout_bonus_amount -= $payout_cashback_amount;
                } else {
                    $userBalance->payout_cashback_amount += $actualCashback;
                }
                // Other Currencies
                // EGP
                $actualCashback_egp = $userSales[0]->cashback_egp - $userBalance->payout_cashback_amount_egp;
                $payout_cashback_amount_egp = $actualCashback_egp - $userPayout->amount_egp;
                if ($payout_cashback_amount_egp <= 0) {
                    $userBalance->payout_cashback_amount_egp += $actualCashback_egp;
                    $userBalance->payout_bonus_amount_egp -= $payout_cashback_amount_egp;
                } else {
                    $userBalance->payout_cashback_amount_egp += $actualCashback_egp;
                }
                // SAR
                $actualCashback_sar = $userSales[0]->cashback_sar - $userBalance->payout_cashback_amount_sar;
                $payout_cashback_amount_sar = $actualCashback_sar - $userPayout->amount_sar;
                if ($payout_cashback_amount_sar <= 0) {
                    $userBalance->payout_cashback_amount_sar += $actualCashback_sar;
                    $userBalance->payout_bonus_amount_sar -= $payout_cashback_amount_sar;
                } else {
                    $userBalance->payout_cashback_amount_sar += $actualCashback_sar;
                }
                // AED
                $actualCashback_aed = $userSales[0]->cashback_aed - $userBalance->payout_cashback_amount_aed;
                $payout_cashback_amount_aed = $actualCashback_aed - $userPayout->amount_aed;
                if ($payout_cashback_amount_aed <= 0) {
                    $userBalance->payout_cashback_amount_aed += $actualCashback_aed;
                    $userBalance->payout_bonus_amount_aed -= $payout_cashback_amount_aed;
                } else {
                    $userBalance->payout_cashback_amount_aed += $actualCashback_aed;
                }
                // KWD
                $actualCashback_kwd = $userSales[0]->cashback_kwd - $userBalance->payout_cashback_amount_kwd;
                $payout_cashback_amount_kwd = $actualCashback_kwd - $userPayout->amount_kwd;
                if ($payout_cashback_amount_kwd <= 0) {
                    $userBalance->payout_cashback_amount_kwd += $actualCashback_kwd;
                    $userBalance->payout_bonus_amount_kwd -= $payout_cashback_amount_kwd;
                } else {
                    $userBalance->payout_cashback_amount_kwd += $actualCashback_kwd;
                }
            }
            $userBalance->save();
        }
        $endTime = microtime(true);
        $executionTime = $endTime - $startTime;
        Log::channel("separated_file")->info("The Script".class_basename($this)."   Took : $executionTime");
    }
}
