<?php

namespace App\Models;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Rennokki\QueryCache\Traits\QueryCacheable;

use App\Traits\ScopeActive;

class Echoarea extends Model
{
	use SoftDeletes,ScopeActive,QueryCacheable;

	private const CACHE_TIME = 3600;

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

	/* RELATIONS */

	public function addresses()
	{
		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): int
	{
		$eo = Echomail::cacheFor(self::CACHE_TIME)
			->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;
			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();
	}
}