<?php

namespace App\Models;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

use App\Traits\{AreaSecurity,ScopeActive};

/**
 * Echomail echoareas
 *
 * Security thoughts:
 * + ZCs/RCs/NCs/HUBs carry all echos
 * + echos for HUBs only (not NODES/POINTs, thus Hub/NC/RC/ZC)
 * + echos for NCs only (NC/RC/ZC)
 * + echos for RCs only (RC/ZC)
 * YYRRRWWW
 *
 * Thus YY:
 * + 0 - not exported
 * + 1 - Sent to RCs (RW)
 * + 2 - Sent to NCs as well (RW)
 * + 3 - Sent to Hubs as well (RW)
 *
 * Thus RRR: (Read)
 * + 0-7
 * = 0 no read access
 * = 1-7 minimum access required to perform
 * Thus WWW: (Write)
 * + 0-7
 * = 0 no write access
 * = 1-7 minimum access required to perform
 *
 * - If a node has 0, or an echoarea has 0, then no access to the function
 * - So if node has 1, and echoarea has 2, no access to function
 *
 * @note change "public" to "bot posts"?
 */
class Echoarea extends Model
{
	use SoftDeletes,ScopeActive,AreaSecurity;

	private const CACHE_TIME = 3600;

	protected $casts = [
		'first_message' => 'datetime:Y-m-d H:i:s',
		'last_message' => 'datetime:Y-m-d H:i:s',
	];

	/* RELATIONS */

	public function addresses()
	{
		return $this->belongsToMany(Address::class);
	}

	public function addresses_active()
	{
		return $this->belongsToMany(Address::class);
	}

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

	public function echomail()
	{
		return $this->hasMany(Echomail::class)
			->orderBy('datetime','ASC');
	}

	/* METHODS */

	public function messages_count(int $period=NULL): int
	{
		$eo = Echomail::where('echoarea_id',$this->id);

		$dt = Carbon::now()->startOfday();

		switch ($period) {
			case 1: // day
				$eo->where('datetime','>=',$dt->subDay());
				break;
			case 7: // week
				$eo->where('datetime','>=',$dt->subWeek());
				break;
			case 30: // month
				$eo->where('datetime','>=',$dt->subMonth());
				break;

			case NULL: // all
				break;

			default:
				return 0;
		}

		return $eo->count();
	}

	/**
	 * Number of messages waiting for address
	 *
	 * @param Address $ao
	 * @return Collection
	 */
	public function waiting(Address $ao): Collection
	{
		return $this->echomail()
			->join('echomail_seenby',['echomail_seenby.echomail_id'=>'echomails.id'])
			->whereNull('sent_at')
			->whereNotNull('export_at')
			->where('address_id',$ao->id)
			->get();
	}
}