<?php

namespace Yajny\Member\Models;

use Illuminate\Database\Eloquent\Model;
// use Illuminate\Notifications\Notifiable;
use Yajny\Member\BalanceTransactions\CashbackBalanceTransaction;
use Yajny\Member\Traits\MemberScopes;
use Illuminate\Support\Carbon;
use Yajny\Traits\HasCurrency;

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

    protected $table = 'user_sales';
    protected $primaryKey = 'id';
    public $dateColumn = 'transaction_time';
    public $directTable = 'user_sales';

    protected $fillable = [

    ];

    protected $casts = [
        'cashback' => 'float'
    ];

    // columns to be copied from Sale table to here
    public $copyColumns = [
        'order_id','click_id','store_id','order_amount','currency','transaction_time','status','network_id','local_order_amount','currency_rate'
    ];

    private $currencyConversionFields = [
        'order_amount', 'cashback'
    ];


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

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


        static::creating(function ($userSale) {
            $user = Member::find($userSale->user_id);
            if($user->valid_merchant==1){
               // $userSale->as_merchant = 1 ;
            }
        });
        static::updated(function ($userSale) {
            $changes = $userSale->getChanges();
            if (isset($changes['cashback']) || isset($changes['status'])) {
                self::initiateBalanceTransaction($userSale);
            }
        });
    }

    public function __construct() {
        parent::__construct();
    }
    public static function initiateBalanceTransaction($userSale)
    {
        $balanceTransaction = new CashbackBalanceTransaction($userSale->user_id, $userSale->cashback, $userSale->id, $userSale->status, $userSale->transaction_time);
        $balanceTransaction->saveTransaction();
    }

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

    public function click(){
        return $this->hasOne('Yajny\Member\Models\Click','id','click_id');
    }

    public function store(){
        return $this->hasOne('Yajny\Models\Store','id','store_id')->withoutGlobalScopes();
    }

    public function sale(){
        return $this->hasOne('Yajny\Member\Models\Sale','id','sales_id');
    }

    public function network(){
        return $this->hasOne('Yajny\Member\Models\Network','id','network_id');
    }

    public function items()
    {
        return $this->hasManyThrough('Yajny\Member\Models\SaleItem', 'Yajny\Member\Models\Sale', 'id', 'sale_id', 'sales_id', 'id');
    }

    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 scopeOrderBySale($q){
        return  $q->orderBy($this->primaryKey,'DESC');
    }

    public function userBonus()
    {
        return $this->hasOneThrough(UserBonus::class, UserBonusSale::class, 'user_sale_id', 'id', 'id', 'user_bonus_id');
    }

}
