<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

use App\Traits\{QueryCacheableConfig,ScopeActive};

class Zone extends Model
{
	use QueryCacheableConfig,ScopeActive;

	/* SCOPES */

	public function scopeDomainZoneOrder($query)
	{
		return $query
			->select('zones.*')
			->join('domains',['domains.id'=>'zones.domain_id'])
			->orderBy('domains.name')
			->orderBy('zone_id');
	}

	/* RELATIONS */

	public function addresses()
	{
		return $this->hasMany(Address::class)
			->active()
			->FTNorder()
			->with(['system.sessions','system.setup','zone.domain']);
	}

	public function domain()
	{
		return $this->belongsTo(Domain::class);
	}

	public function hosts()
	{
		return $this->hasMany(Address::class)
			->where(function($query) {
				return $query
					->where(fn($q)=>$q->where('node_id',0)->where('point_id',0))
					->orWhere('role',Address::NODE_HC);
			})
			->FTNorder()
			->with(['system','zone.domain']);
	}

	public function hubs()
	{
		// @todo we should be able to add to this query, to count children of an address by using a group by?
		return $this->hasMany(Address::class)
			->where(function($query) {
				return $query
					->where(fn($q)=>$q->where('point_id',0))
					->orWhere('role',Address::NODE_HC);
			})
			->FTNorder()
			->with(['system','zone.domain']);
	}

	public function regions()
	{
		return $this->hasMany(Address::class)
				->where(function($query) {
					return $query
						->where(fn($q)=>$q->where('node_id',0)->where('point_id',0))
						->orWhere('role',Address::NODE_RC);
				})
				->orderBy('region_id')
				->active()
				->with(['system','zone.domain']);
	}

	public function system()
	{
		return $this->belongsTo(System::class);
	}

	/**
	 * Get the default route for this zone
	 */
	public function systems()
	{
		return $this->belongsToMany(System::class)
			->withPivot(['default']);
	}
}