<?php

namespace App\Models\Admin;

use App\Models\Ciudad;
use App\Models\Servicio;
use App\Traits\HasSortsTrait;
use Hamcrest\Type\IsObject;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Model;

use function PHPSTORM_META\type;

class Estacion extends Model
{
    use HasFactory, HasSortsTrait;

    protected $table = 'estaciones';

    protected $fillable = [
        'titulo',
        'slug',
        'estado',
        'ciudad_id',
        'ubicacion',
        'direccion'
    ];

    protected $dates = ['created_at', 'updated_at'];
    protected $casts = [
        'created_at' => 'datetime:d-m-Y H:i:s',
        'updated_at' => 'datetime:d-m-Y H:i:s',
    ];

    public function getUbicacionAttribute($value)
    {
        $decodedValue = json_decode($value);

        if (is_string($decodedValue)) {
            $decodedValue = json_decode($decodedValue);
        }

        if (is_object($decodedValue)) {
            return $decodedValue;
        }

        // Si la decodificación no fue exitosa, devuelve un objeto vacío
        return (object) ['lat' => null, 'lng' => null];
    }

    public function setTituloAttribute($value)
    {
        $this->attributes['titulo'] = ucfirst(trim($value));
        $this->attributes['slug'] =  str_slug(trim($value));
    }

    public function setUbicacionAttribute($value)
    {
        // Si ya es un string, lo guardamos directamente
        if (is_string($value)) {
            $this->attributes['ubicacion'] = $value;
        }
        // Si es un array o un objeto con 'lat' y 'lng', lo codificamos como JSON
        elseif (is_array($value) || is_object($value)) {
            $array_operator = (is_array($value) && array_key_exists('lat', $value) && array_key_exists('lng', $value));

            if ($array_operator || is_object($value)) {
                $this->attributes['ubicacion'] = json_encode($value);
            }
        }
    }

    public function servicios()
    {
        return $this->belongsToMany(Servicio::class, 'estaciones_servicios');
    }

    /**
     * Expone la ciudad para evitar resolver ubicación administrativa con N+1.
     */
    public function ciudad(): BelongsTo
    {
        return $this->belongsTo(Ciudad::class, 'ciudad_id');
    }
}
