<?php

namespace App\Models;

use Awobaz\Compoships\Compoships;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;

use App\Traits\SiteID;

/**
 * CLEANUP NOTES:
 * + Charge Date should not be null
 * + Attributes should be a collection array
 * + type should not be null
 * + It would be useful, given an array of Charges to call a function that renders them into invoice format. This may provide consistence and be the single view of how charges do look on an invoice.
 */
class Charge extends Model
{
	use Compoships,SiteID;

	protected $casts = [
		'attributes' => 'json',
	];

	protected $dates = [
		'start_at',
		'stop_at',
		'charge_at',			// The date the charge applies - since it can be different to created_at
	];

	public const sweep = [
	//	0 => 'Daily',
	//	1 => 'Weekly',
	//	2 => 'Monthly',
	//	3 => 'Quarterly',
	//	4 => 'Semi-Annually',
	//	5 => 'Annually',
		6 => 'Service Rebill',
	];

	/* RELATIONS */

	public function account()
	{
		return $this->belongsTo(Account::class);
	}

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

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

	/* SCOPES */

	public function scopeUnprocessed($query)
	{
		return $query
			->where('active',TRUE)
			->whereNotNull('charge_at')
			->whereNotNull('type')
			->where(function($q) {
				return $q->where('processed',FALSE)
					->orWhereNull('processed');
			});
	}

	/* ATTRIBUTES */

	public function getNameAttribute()
	{
		return sprintf('%s %s',$this->description,$this->getAttribute('attributes') ? join('|',unserialize($this->getAttribute('attributes'))) : '');
	}

	public function getTypeNameAttribute(): string
	{
		return Arr::get(InvoiceItem::type,$this->type);
	}
}