<?php

namespace App\Models\Service;

use Carbon\Carbon;

use App\Models\Base\ServiceType;
use App\Models\{Account,DomainRegistrar,DomainTld,Service};
use App\Interfaces\ServiceItem;
use App\Traits\{NextKey,ScopeServiceActive,ScopeServiceUserAuthorised};

/**
 * Class Domain (Service)
 * Services that domain names
 *
 * Attributes for services:
 * + service_description    : Description as shown in a Service Context
 * + service_expire         : The date the service expires
 * + service_name           : Name as shown in a Service Context
 *
 * @package App\Models\Service
 */
class Domain extends ServiceType implements ServiceItem
{
	use ScopeServiceActive,ScopeServiceUserAuthorised;

	protected $dates = [
		'domain_expire',
	];
	protected $table = 'service_domains';
	protected $with = ['tld'];

	/* RELATIONS */

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

	public function registrar()
	{
		return $this->belongsTo(DomainRegistrar::class,'domain_registrar_id');
	}

	public function tld()
	{
		return $this->belongsTo(DomainTld::class,'domain_tld_id');
	}

	/* SCOPES */

	/**
	 * Search for a record
	 *
	 * @param        $query
	 * @param string $term
	 * @return mixed
	 */
	public function scopeSearch($query,string $term)
	{
		// If we have a period in the name, we'll ignore everything after it.
		$term = strstr($term,'.',TRUE) ?: $term;

		// Build our where clause
		return parent::scopeSearch($query,$term)
			->orwhere('domain_name','like','%'.$term.'%');
	}

	/* ATTRIBUTES */

	public function getServiceDescriptionAttribute(): string
	{
		// N/A
		return 'Domain Name';
	}

	public function getServiceExpireAttribute(): Carbon
	{
		return $this->domain_expire;
	}

	/**
	 * The name of the domain with its TLD
	 *
	 * @return string
	 */
	public function getServiceNameAttribute(): string
	{
		return strtoupper(sprintf('%s.%s',$this->domain_name,$this->tld->name));
	}

	public function inContract(): bool
	{
		return $this->domain_expire->isFuture();
	}
}