<?php

namespace App\Console\Commands;

use App\Helpers\NewBonus\ConfirmNewBonusHelper;
use App\User;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use Yajny\EventsYj\Events\NewBonusUpdated;
use Yajny\Member\Models\CurrencyRate;
use Yajny\Member\Models\NewBonusType;
use Yajny\Member\Models\UserNewBonus;
use Yajny\Member\Models\UserSales;
use Yajny\Member\Models\UsersBalance;

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

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Adding first order bonus';

    /**
     * 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("first_order_bonus",false)->take(5000)->orderByDesc('id')->get();
            foreach ($users as $user) {
                    $userData=User::where("user_id",$user->user_id)->first();
                    if ($userData->is_merchant==0){
                        if ($userData->created_at>="2022-11-15 00:00:00"){
                            $confirmedOrders=UserSales::where([["user_id",$user->user_id],['status','confirmed']])->first();
                            if ($confirmedOrders) {
                                $bonusType = NewBonusType::where('code', 'first_order')->first();
                                $userBonus = UserNewBonus::where([['user_id', $confirmedOrders->user_id], ['bonus_type_id', $bonusType->id]])->first();
                                if ($userBonus) {
                                    // update the bonus status when is not confirmed
                                    $userBonus->status = "confirmed";
                                    $userBonus->save();
                                    $user->first_order_bonus = 1;
                                    $user->save();
                                } else {
                                    // creating the bonus and set it confirmed.
                                    $currencies = CurrencyRate::all();
                                    $newUserBonus = new UserNewBonus();
                                    $newUserBonus->user_id = $confirmedOrders->user_id;
                                    $newUserBonus->bonus_type_id = $bonusType->id;
                                    $newUserBonus->status = "confirmed";
                                    $newUserBonus->awarded_on = now();
                                    $newUserBonus->amount = $bonusType->amount;
                                    $newUserBonus->awarded_points = $bonusType->points;
                                    $egpRate = $newUserBonus->amount * $this->getCurrencyRate($currencies, 'EGP', $confirmedOrders->transaction_time);
                                    $sarRate = $newUserBonus->amount * $this->getCurrencyRate($currencies, 'SAR', $confirmedOrders->transaction_time);
                                    $aedRate = $newUserBonus->amount * $this->getCurrencyRate($currencies, 'AED', $confirmedOrders->transaction_time);
                                    $kwdRate = $newUserBonus->amount * $this->getCurrencyRate($currencies, 'KWD', $confirmedOrders->transaction_time);
                                    $newUserBonus->amount_egp = $egpRate;
                                    $newUserBonus->amount_sar = $sarRate;
                                    $newUserBonus->amount_aed = $aedRate;
                                    $newUserBonus->amount_kwd = $kwdRate;
                                    $newUserBonus->currency = $userData->currency_code;
                                    if ($userData->currency_code == "USD") {
                                        $newUserBonus->local_amount = $newUserBonus->amount;
                                        $newUserBonus->currency_rate = 1;
                                    }
                                    if ($userData->currency_code == "EGP") {
                                        $newUserBonus->local_amount = $egpRate;
                                        $newUserBonus->currency_rate = $this->getCurrencyRate($currencies, 'EGP', $confirmedOrders->transaction_time);
                                    }
                                    if ($userData->currency_code == "SAR") {
                                        $newUserBonus->local_amount = $sarRate;
                                        $newUserBonus->currency_rate = $this->getCurrencyRate($currencies, 'SAR', $confirmedOrders->transaction_time);
                                    }
                                    if ($userData->currency_code == "AED") {
                                        $newUserBonus->local_amount = $aedRate;
                                        $newUserBonus->currency_rate = $this->getCurrencyRate($currencies, 'AED', $confirmedOrders->transaction_time);
                                    }
                                    if ($userData->currency_code == "KWD") {
                                        $newUserBonus->local_amount = $kwdRate;
                                        $newUserBonus->currency_rate = $this->getCurrencyRate($currencies, 'KWD', $confirmedOrders->transaction_time);
                                    }
                                    $newUserBonus->expiration_date = Carbon::now()->addDays(365);
                                    $newUserBonus->is_reset = 0;
                                    $newUserBonus->save();
                                    $user->first_order_bonus = 1;
                                    $user->save();
                                }
                            }
                        }else{
                            $user->first_order_bonus=1;
                            $user->save();
                        }
                    }else{
                        $user->first_order_bonus=1;
                        $user->save();
                    }
            }
            $endTime = microtime(true);
            $executionTime = $endTime - $startTime;
            Log::channel("separated_file")->info("The Script".class_basename($this)."   Took : $executionTime");
    }

    public function getCurrencyRate($currencyRateCollection, $currencyCode, $dateTime)
    {
        $currencyRate = $currencyRateCollection->where('start_date', '<', $dateTime)
            ->where('currency_code', $currencyCode)
            ->sortByDesc('start_date')->first();
        if (is_null($currencyRate)) $currencyRate = $currencyRateCollection->where('currency_code', $currencyCode)->first();
        return $currencyRate->conversion_rate;
    }


}
