<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class PurchaseLine extends Model
{
    /**
     * The attributes that aren't mass assignable.
     *
     * @var array
     */
    protected $guarded = ['id'];

    public function transaction()
    {
        return $this->belongsTo(\App\Transaction::class);
    }

    public function product()
    {
        return $this->belongsTo(\App\Product::class, 'product_id');
    }

    public function variations()
    {
        return $this->belongsTo(\App\Variation::class, 'variation_id');
    }
    
    public static function boot()
    {
        parent::boot();
        
        self::creating(function($model){
            // ... code here
        });

        self::created(function($model){
            // ... code here
            if($model->uids){
                foreach($model->uids as $uid){
                    $uid->purchase_line_id = $model->id;
                    $uid->save();
                }
            }
        });

        self::updating(function($model){
            // unset($model->uids);
        });

        self::updated(function($model){
            // ... code here
            // $existingUids = [];
            if($model->uids){
                foreach($model->uids as $uid){
                    // $existingUids[] = $uid->uid;
                    $exists = \App\Uid::where('uid', $uid->uid)->first();
                    if ($exists === null) {
                        $uid->purchase_line_id = $model->id;
                        $uid->save();
                    }
                }
            }
            // echo json_encode($existingUids); die();
            // \App\Uid::whereNotIn('uid', $existingUids)->delete();
        });

        self::deleting(function($model){
            // ... code here
        });

        self::deleted(function($model){
            // ... code here
        });
    }
    
    public function uids()
    {
        return $this->hasMany(\App\Uid::class, 'purchase_line_id');
    }

    /**
     * Set the quantity.
     *
     * @param  string  $value
     * @return float $value
     */
    public function getQuantityAttribute($value)
    {
        return (float) $value;
    }

    /**
     * Get the unit associated with the purchase line.
     */
    public function sub_unit()
    {
        return $this->belongsTo(\App\Unit::class, 'sub_unit_id');
    }

    /**
     * Give the quantity remaining for a particular
     * purchase line.
     *
     * @return float $value
     */
    public function getQuantityRemainingAttribute()
    {
        return (float) ($this->quantity - $this->quantity_used);
    }

    /**
     * Give the sum of quantity sold, adjusted, returned.
     *
     * @return float $value
     */
    public function getQuantityUsedAttribute()
    {
        return (float) ($this->quantity_sold + $this->quantity_adjusted + $this->quantity_returned + $this->mfg_quantity_used);
    }

    public function line_tax()
    {
        return $this->belongsTo(\App\TaxRate::class, 'tax_id');
    }

    public function purchase_order_line()
    {
        return $this->belongsTo(\App\PurchaseLine::class, 'purchase_order_line_id');
    }

    public function purchase_requisition_line()
    {
        return $this->belongsTo(\App\PurchaseLine::class, 'purchase_requisition_line_id');
    }
}
