<?php

namespace Yajny\Member\Models;

use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Yajny\Member\BalanceTransactions\NewBonusBalanceTransaction;
use Yajny\Member\Traits\MemberScopes;
use Yajny\Traits\HasCurrency;

class UserNewBonus extends Model
{
    use MemberScopes, HasCurrency;

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

    protected $guarded = ['id'];
    public $timestamps = true;
    private $currencyConversionFields = [
        'amount'
    ];

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

    public function newBonusType()
    {
        return $this->belongsTo('Yajny\Member\Models\NewBonusType', 'bonus_type_id', 'id');
    }

    public static function boot()
    {
        parent::boot();

        static::creating(function ($userBonus) {
            $points_value = DB::table('tb_settings')->where('setting_key', 'points_value')->first();
            if ($userBonus->newBonusType->amount != 0)
                $userBonus->amount = $userBonus->newBonusType->amount;
            if ($userBonus->amount == 0)
                $userBonus->amount = $userBonus->awarded_points / $points_value->setting_value;
            if ($userBonus->newBonusType->auto_completed) $userBonus->status = 'confirmed';
            if (empty($userBonus->awarded_on)) $userBonus->awarded_on = now();
            $userBonus->expiration_date = Carbon::now()->addDays(365);
        });
        static::created(function ($userBonus) {
            if ($userBonus->status == 'confirmed')
                self::initiateBalanceTransaction($userBonus);
        });
        static::updating(function ($userBonus) {
            if (isset($changes['status']) && $userBonus->status == 'confirmed')
                $userBonus->expiration_date = Carbon::now()->addDays(365);
        });
        static::updated(function ($userBonus) {
            $changes = $userBonus->getChanges();
            if (isset($changes['status']) && $userBonus->status == 'confirmed')
                self::initiateBalanceTransaction($userBonus);
        });
    }

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