<?php

namespace App\Models;

use App\Enums\TipoPromocion;
use App\Models\Admin\Estacion;
use App\Traits\HasFiles;
use App\Traits\HasSortsTrait;
use App\Traits\ImagenesGetterTrait;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;

class Promociones extends Model
{
    use HasFactory, HasSortsTrait, ImagenesGetterTrait, HasFiles;

    protected $table = 'promociones';

    protected $fillable = [
        'titulo',
        'slug',
        'subtitulo',
        'fecha_desde',
        'fecha_hasta',
        //'archivo',
        'estado',
        'orden',
        'all_dias',
        'all_estaciones',
        'operadores',
        'copete',
        'descripcion',
        'popup',
        'app',
        'bank_id',
    ];

    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',
        'popup' => 'boolean',
        'app' => TipoPromocion::class,
        //'fecha_desde' => 'date:d-m-Y',
        //'fecha_hasta' => 'date:d-m-Y',
    ];

    protected $appends = [
        'image_large',
        'fecha_desde_formateada',
        'fecha_hasta_formateada'
    ];

    public function enlace()
    {
        return asset("/promociones/{$this->id}/{$this->slug}");
    }

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

    public function getFechaDesdeFormateadaAttribute()
    {
        if ($this->fecha_desde) {
            return Carbon::parse($this->fecha_desde)->format('d-m-Y');
        }

        return null;
    }

    public function getFechaHastaFormateadaAttribute()
    {
        if ($this->fecha_hasta) {
            return Carbon::parse($this->fecha_hasta)->format('d-m-Y');
        }

        return null;
    }

    public function metodosPagos()
    {
        return $this->belongsToMany(MetodosPagos::class, 'promociones_metodos_pagos', 'promocion_id', 'metodo_pago_id');
    }


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

    public function estaciones()
    {
        return $this->belongsToMany(Estacion::class, 'promociones_estaciones', 'promocion_id', 'estacion_id');
    }

    public function bank(): BelongsTo
    {
        return $this->belongsTo(Bank::class, 'bank_id');
    }

    public function dias()
    {
        return DB::table('promociones_dias')
            ->where('promocion_id', $this->id)
            ->get();

        return $this->belongsToMany(Promociones::class, 'promociones_dias', 'promocion_id', 'dia');
    }

    public function syncDias(array $dias)
    {
        $existente = $this->dias()
            ->pluck('dia')
            ->toArray();

        $eliminar = collect($existente)->diff($dias)->all();

        if (sizeof($eliminar)) {
            DB::table('promociones_dias')
                ->where('promocion_id', $this->id)
                ->whereIn('dia', $eliminar)
                ->delete();

            $existente = $this->dias()
                ->pluck('dia')
                ->toArray();
        }

        $agregar = collect($dias)->diff($existente)->all();
        if (sizeof($agregar)) {
            foreach ($agregar as $dia) {
                DB::table('promociones_dias')
                    ->insert([
                        'promocion_id' => $this->id,
                        'dia' => $dia,
                        'created_at' => Carbon::now(),
                        'updated_at' => Carbon::now()
                    ]);
            }
        }
    }
}
