<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class InvoiceItem extends Model
{
	protected $dates = ['date_start','date_stop'];
	protected $table = 'ab_invoice_item';
	protected $with = ['taxes'];

	private $_tax = 0;

	public function invoice()
	{
		return $this->belongsTo(Invoice::class);
	}

	public function product()
	{
		return $this->belongsTo(Product::class);
	}

	public function service()
	{
		return $this->belongsTo(Service::class);
	}

	public function taxes()
	{
		return $this->hasMany(InvoiceItemTax::class);
	}

	public function getItemTypeNameAttribute()
	{
		$types = [
			1=>'Hardware',                          // *
			2=>'Service Relocation Fee',            // * Must have corresponding SERVICE_ID
			3=>'Service Change',                    // * Must have corresponding SERVICE_ID
			4=>'Service Connection',                // * Must have corresponding SERVICE_ID
			6=>'Service Cancellation',              // * Must have corresponding SERVICE_ID
			7=>'Extra Product/Service Charge',      // * Service Billing in advance, Must have corresponding SERVICE_ID
			8=>'Product Addition',                  // * Additional Product Customisation, Must have corresponding SERVICE_ID
			120=>'Credit/Debit Transfer',           // * SERVICE_ID is NULL, MODULE_ID is NULL, MODULE_REF is NULL : INVOICE_ID is NOT NULL
			123=>'Shipping',
			124=>'Late Payment Fee',                // * SERVICE_ID is NULL, MODULE_ID = CHECKOUT MODULE,
			125=>'Payment Fee',                     // * SERVICE_ID is NULL, MODULE_ID = CHECKOUT MODULE, MODULE_REF = CHECKOUT NAME
			126=>'Other',                           // * MODEL_ID should be a module
			127=>'Rounding',                        // * SERVICE_ID is NULL, MODULE_ID is NULL, MODULE_REF is NULL
		];

		switch ($this->item_type)
		{
			// * Line Charge Topic on Invoice.
			case 0:
				return sprintf('%s [%s]','Product/Service',
					$this->date_start == $this->date_stop ? $this->date_start->format('Y-m-d') : sprintf('%s -> %s',$this->date_start->format('Y-m-d'),$this->date_stop->format('Y-m-d')));

			// * Excess Service Item, of item 0, must have corresponding SERVICE_ID
			case 5:
				return sprintf('%s [%s] (%s)','Excess Usage',
					$this->date_start == $this->date_stop ? $this->date_start->format('Y-m-d') : sprintf('%s -> %s',$this->date_start->format('Y-m-d'),$this->date_stop->format('Y-m-d')),
					$this->module_text()
				);

			default:
				return array_get($types,$this->item_type,'Unknown');
		}
	}

	public function module_text()
	{
		switch ($this->module_id)
		{
			// Charges Module
			case 30: return Charge::findOrFail($this->module_ref)->name;

			default: abort(500,'Unable to handle '.$this->module_id);
		}

	}
	public function getSubTotalAttribute()
	{
		return $this->quantity * $this->price_base;
	}

	public function getTaxAttribute()
	{
		if (! $this->_tax)
		{
			foreach ($this->taxes as $o)
			{
				$this->_tax += $o->amount;
			}
		}

		return $this->_tax;
	}

	public function getTotalAttribute()
	{
		return $this->tax + $this->sub_total;
	}
}