<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Arr;
use Spatie\Sluggable\HasSlug;
use Spatie\Sluggable\SlugOptions;
use Spatie\Translatable\HasTranslations;

class Truck extends Model
{
    use HasFactory;
    use HasTranslations;
    use HasSlug;

    public $translatable = [
        'highlights',
        'comments',
        'default_comments',
        'accessories',
        'search_accessories',
    ];

    protected $fillable = [
        'status',
        'slug',
        'title',
        'video_id',
        'license_plate',
        'hexon_id',
        'vehicle_type',
        'brand',
        'model',
        'body_type',
        'highlights',
        'comments',
        'default_comments',
        'accessories',
        'search_accessories',
        'axle_configuration',
        'specifications',
        'mileage',
        'transmission',
        'axle_type',
        'build_year',
        'crane',
        'tailgate',
        'construction',
        'cabine_type',
    ];

    protected $casts = [
        'specifications' => 'array',
        'axle_configuration' => 'array',
        'crane' => 'array',
        'tailgate' => 'array',
        'construction' => 'array',
    ];

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

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

    public function scopeMileageGreaterThan(Builder $query, int $mileage): Builder
    {
        return $query->where('mileage', '>=', $mileage);
    }

    public function scopeMileageLessThan(Builder $query, int $mileage): Builder
    {
        return $query->where('mileage', '<=', $mileage);
    }

    public function scopeBuildYearGreaterThan(Builder $query, int $build_year): Builder
    {
        return $query->where('build_year', '>=', $build_year);
    }

    public function scopeBuildYearLessThan(Builder $query, int $build_year): Builder
    {
        return $query->where('build_year', '<=', $build_year);
    }

    public function formattedSpecifications(): Attribute
    {
        return Attribute::make(
            get: fn() => [
                'id' => Arr::get($this->specifications, 'id'),
                'first_registration' => Arr::get($this->specifications, 'first_registration'),
                'vin' => Arr::get($this->specifications, 'vin'),
                'horse_power' => Arr::get($this->specifications, 'horse_power'),
                'emission_class' => Arr::get($this->specifications, 'emission_class'),
                'energy_label' => Arr::get($this->specifications, 'energy_label'),
                'fuel' => Arr::get($this->specifications, 'fuel'),
                'transmission_type' => Arr::get($this->specifications, 'transmission_type'),
                'gears' => Arr::get($this->specifications, 'gears'),
                'mileage' => Arr::get($this->specifications, 'mileage'),
                'apk_until' => Arr::get($this->specifications, 'apk_until'),
                'wheel_base' => Arr::get($this->specifications, 'wheel_base'),
                'gvw' => Arr::get($this->specifications, 'gvw'),
                'empty_mass' => Arr::get($this->specifications, 'empty_mass'),
                'measurements' => Arr::get($this->specifications, 'measurements'),
                'max_payload' => Arr::get($this->specifications, 'max_payload'),
                'color' => Arr::get($this->specifications, 'color'),
                'cabine_type' => Arr::get($this->specifications, 'cabine_type'),
            ],
        );
    }

    public function getSlugOptions(): SlugOptions
    {
        return SlugOptions::create()
            ->generateSlugsFrom('title')
            ->saveSlugsTo('slug');
    }

    public function axleConfigurationSvg(): Attribute
    {
        return Attribute::make(
            get: fn() => optional($this->axle_configuration)['svg'] ?? null
        );
    }
}
