<?php

namespace Yajny\Member\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Carbon;
use Yajny\EventsYj\Events\BonusNew;
use Yajny\EventsYj\Events\BonusUpdated;
use Yajny\EventsYj\Events\RecalculateBalance;
use Yajny\Member\BalanceTransactions\BonusBalanceTransaction;
use Yajny\Member\Traits\MemberScopes;
use Yajny\Traits\HasCurrency;

// use Illuminate\Notifications\Notifiable;

class UserBonus extends Model
{
    // use Notifiable;
    use MemberScopes, HasCurrency;

    protected $table = 'user_bonus';
    protected $primaryKey = 'id';
    public $dateColumn = 'awarded_on';
    public $directTable = 'user_bonus';

    protected $guarded = ['id'];
    public $timestamps = false;

    private $currencyConversionFields = [
        'amount'
    ];


    public static function boot()
    {
        parent::boot();
        static::saving(function ($userBonus) {
            $userBonus->expiration_date = Carbon::now()->addDays(365)->toDateTimeString();
            $currencies = Currencies::all()->pluck('conversion_rate', 'iso_code')->toArray();
            $userBonus->amount_egp = $userBonus->amount * $currencies['EGP'];
            $userBonus->amount_sar = $userBonus->amount * $currencies['SAR'];
            $userBonus->amount_aed = $userBonus->amount * $currencies['AED'];
            $userBonus->amount_kwd = $userBonus->amount * $currencies['KWD'];
        });
        static::created(function ($userBonus) {
            self::initiateBalanceTransaction($userBonus);
            $userBonus->expiration_date = Carbon::now()->addDays(365)->toDateTimeString();
            $currencies = Currencies::all()->pluck('conversion_rate', 'iso_code')->toArray();
            $userBonus->amount_egp = $userBonus->amount * $currencies['EGP'];
            $userBonus->amount_sar = $userBonus->amount * $currencies['SAR'];
            $userBonus->amount_aed = $userBonus->amount * $currencies['AED'];
            $userBonus->amount_kwd = $userBonus->amount * $currencies['KWD'];
            $userBonus->save();
            event(new BonusNew(Member::find($userBonus->user_id), $userBonus));
            event(new RecalculateBalance($userBonus->user));
        });
        static::updating(function ($userBonus) {
            if (isset($changes['status']) && $userBonus->status == 'confirmed')
                $userBonus->expiration_date = Carbon::now()->addDays(365)->toDateTimeString();

        });
        static::updated(function ($userBonus) {
            $changes = $userBonus->getChanges();
            if (isset($changes['amount']) || isset($changes['status'])) {
                self::initiateBalanceTransaction($userBonus);
            }
            event(new BonusUpdated($userBonus->user, $userBonus));
            event(new RecalculateBalance($userBonus->user));
        });
    }

    public static function initiateBalanceTransaction($userBonus)
    {
        $balanceTransaction = new BonusBalanceTransaction($userBonus->user_id, $userBonus->amount, $userBonus->id, $userBonus->status, $userBonus->created_at);
        $balanceTransaction->saveTransaction();
    }

    // protected $hidden = [
    //     'password', 'remember_token',
    // ];

    public function user()
    {
        return $this->hasOne('Yajny\Member\Models\Member', 'user_id', 'user_id');
    }

    public function type_info()
    {
        return $this->belongsTo('Yajny\Member\Models\BonusType', 'bonus_code', 'code');
    }

    public function scopeExpiring($q)
    {
        $date = new Carbon;

        return $q->where('expires_on', '<', $date->addDays(7));
    }

    public function scopeOrderByBonus($q)
    {

        return $q->orderBy($this->primaryKey, 'DESC');
    }

    public function bonus_type()
    {
        return $this->hasOne('Yajny\Member\Models\BonusType', 'code', 'bonus_code');
    }

    public function userSales()
    {
        return $this->hasManyThrough(UserSales::class, UserBonusSale::class, 'user_bonus_id', 'id', 'id', 'user_sale_id');
    }

    public function loyaltyBonus()
    {
        return $this->hasOne(LoyaltyBonus::class);
    }

    public function loyaltyProgram()
    {
        return $this->hasOneThrough(LoyaltyProgram::class, LoyaltyBonus::class, 'user_bonus_id', 'id', 'id', 'loyalty_program_id');
    }
}
