<?php

namespace App\Models;

use App\Builders\RadioStationBuilder;
use App\Models\Concerns\MorphsToFavorites;
use App\Models\Contracts\Favoriteable;
use App\Models\Contracts\Permissionable;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Concerns\HasUlids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Laravel\Scout\Searchable;
use OwenIt\Auditing\Auditable;
use OwenIt\Auditing\Contracts\Auditable as AuditableContract;

/**
 * @property string $id
 * @property int $user_id
 * @property User $user
 * @property string $url
 * @property ?string $logo The station's logo file name
 * @property ?string $description
 * @property boolean $is_public
 * @property Carbon|string $created_at
 * @property string $name
 * @property-read ?boolean $favorite Whether the (scoped) user has favorited this radio station
 */
class RadioStation extends Model implements AuditableContract, Favoriteable, Permissionable
{
    use Auditable;
    use HasFactory;
    use HasUlids;
    use MorphsToFavorites;
    use Searchable;

    protected $guarded = [];
    public $incrementing = false;

    protected $with = ['user'];
    protected $casts = [
        'created_at' => 'datetime',
        'updated_at' => 'datetime',
        'favorite' => 'boolean',
        'is_public' => 'boolean',
        'description' => 'string',
    ];

    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }

    public static function query(): RadioStationBuilder
    {
        /** @var RadioStationBuilder */
        return parent::query()->addSelect('radio_stations.*');
    }

    public function newEloquentBuilder($query): RadioStationBuilder
    {
        return new RadioStationBuilder($query);
    }

    /** @inheritdoc */
    public function toSearchableArray(): array
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'description' => $this->description,
            'user_id' => $this->user_id,
        ];
    }

    public static function getPermissionableIdentifier(): string
    {
        return 'id';
    }
}