<?php

declare(strict_types=1);

namespace Engelsystem\Models;

use Engelsystem\Models\Shifts\NeededAngelType;
use Engelsystem\Models\Shifts\ShiftEntry;
use Illuminate\Database\Eloquent\Builder;
use Engelsystem\Models\User\User;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Query\Builder as QueryBuilder;

/**
 * @property int                               $id
 * @property string                            $name
 * @property string                            $description
 * @property string                            $contact_name
 * @property string                            $contact_dect
 * @property string                            $contact_email
 * @property boolean                           $restricted # If users need an introduction
 * @property boolean                           $requires_driver_license # If users must have a driver license
 * @property boolean                           $no_self_signup # Users can sign up for shifts
 * @property boolean                           $show_on_dashboard # Show on public dashboard
 * @property boolean                           $hide_register # Hide from registration page
 *
 * @property-read Collection|NeededAngelType[] $neededBy
 * @property-read UserAngelType                $pivot
 * @property-read Collection|ShiftEntry[]      $shiftEntries
 * @property-read Collection|User[]            $userAngelTypes
 *
 * @method static QueryBuilder|AngelType[] whereId($value)
 * @method static QueryBuilder|AngelType[] whereName($value)
 * @method static QueryBuilder|AngelType[] whereDescription($value)
 * @method static QueryBuilder|AngelType[] whereContactName($value)
 * @method static QueryBuilder|AngelType[] whereContactDect($value)
 * @method static QueryBuilder|AngelType[] whereContactEmail($value)
 * @method static QueryBuilder|AngelType[] whereRestricted($value)
 * @method static QueryBuilder|AngelType[] whereRequiresDriverLicense($value)
 * @method static QueryBuilder|AngelType[] whereNoSelfSignup($value)
 * @method static QueryBuilder|AngelType[] whereShowOnDashboard($value)
 * @method static QueryBuilder|AngelType[] whereHideRegister($value)
 */
class AngelType extends BaseModel
{
    use HasFactory;

    /** @var array<string> */
    protected $fillable = [ // phpcs:ignore
        'name',
        'description',

        'contact_name',
        'contact_dect',
        'contact_email',

        'restricted',
        'requires_driver_license',
        'no_self_signup',
        'show_on_dashboard',
        'hide_register',
    ];

    /** @var array<string, string> */
    protected $casts = [ // phpcs:ignore
        'restricted'              => 'boolean',
        'requires_driver_license' => 'boolean',
        'no_self_signup'          => 'boolean',
        'show_on_dashboard'       => 'boolean',
        'hide_register'           => 'boolean',
    ];

    public function neededBy(): HasMany
    {
        return $this->hasMany(NeededAngelType::class);
    }

    public function shiftEntries(): HasMany
    {
        return $this->hasMany(ShiftEntry::class);
    }

    public function userAngelTypes(): BelongsToMany
    {
        return $this
            ->belongsToMany(User::class, 'user_angel_type')
            ->using(UserAngelType::class)
            ->withPivot(UserAngelType::getPivotAttributes());
    }

    public function hasContactInfo(): bool
    {
        return !empty($this->contact_name)
            || !empty($this->contact_dect)
            || !empty($this->contact_email);
    }

    /**
     * @codeCoverageIgnore For some reasons parent::boot get s ignored here 0o
     */
    protected static function boot(): void
    {
        parent::boot();
        static::addGlobalScope('order', fn(Builder $builder) => $builder->orderBy('name'));
    }
}