<?php

namespace App\Models;

use App\Traits\Categorizable;
use App\Traits\Imageable;
use App\Traits\Ownable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Joined extends Model
{
    use HasFactory;
    use Ownable;
    use Categorizable;
    use Imageable;

    protected $table = 'joined';

    protected $fillable = [
        'url',
        'subject',
        'approved',
        'image',
    ];

    protected $casts = [
        'approved' => 'boolean',
    ];

    /* ----------------------------------------------------------------------- relationships ---- */

    // injected by trait: collective (belongsTo)

    // injected by trait: categories (morph many-to-many)

    /* ------------------------------------------------------------------------------ joined ---- */

    public static function store(array $validated) : Joined
    {
        $validated['image']    = $validated['image'] ?? null;

        $joined           = new static();
        $joined->url      = $validated['url'];
        $joined->subject  = $validated['subject'];
        $joined->image    = self::imagePath($validated['image']);
        $joined->approved = $validated['approved'] ?? false;

        auth_collective()->joined()->save($joined);
        $joined->categories()->sync($validated['categories']);

        return $joined;
    }

    /* ------------------------------------------------------------------------------- patch ---- */

    public function patch(array $validated) : Joined
    {
        $validated['image'] = $validated['image'] ?? null;

        $this->url      = $validated['url'];
        $this->subject  = $validated['subject'];
        $this->image    = $this->updateImage($validated['image']);
        $this->approved = $validated['approved'] ?? false;

        if ($this->isDirty()) {
            $this->save();
        }

        if (isset($validated['categories'])) {
            $this->categories()->sync($validated['categories']);
        }

        return $this;
    }

    /* ------------------------------------------------------------------------------ remove ---- */

    public function remove() : void
    {
        $this->categories()->detach();
        $this->delete();
    }
}