<?php

namespace App\Models;

use App\Utils\TransporteUtils;

use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Model;

class Pedido extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'nombre',  'pagado', 'terminado'
    ];

    /**
     * El barrio al que pertenece el pedido.
     */
    public function barrio(): BelongsTo {
        return $this->belongsTo(Barrio::class);
    }

    function togglePagado() : bool {
        $this->pagado = !$this->pagado;
        $this->save();
        return $this->pagado;
    }

    function toggleTerminado() : bool {
        $this->terminado = !$this->terminado;
        $this->save();
        return $this->terminado;
    }

    /**
     * Los productos que pertenecen al pedido.
     */
    public function productos(): BelongsToMany {
        return $this->belongsToMany(Producto::class)->withPivot(['cantidad']);
    }

    function agregarProducto(Producto $producto, int $cantidad) {
        $productoEnChismosa = $this->productos()->where('id', $producto->id)->first();
        if ($productoEnChismosa) {
            $productoEnChismosa->pivot->cantidad += $cantidad;
            $productoEnChismosa->save();
            return $productoEnChismosa;
        } else {
            $this->productos()->attach($producto, ['cantidad' => $cantidad]);
            return $this->productos()->where('id', $producto->id)->first();
        }
    }

    function quitarProducto(Producto $producto) {
        $this->productos()->detach($producto);
    }

    /**
     * El total de los productos del pedido
     * sumado al total de los bonos de transporte
     */
    function totalChismosa() : float {
        return $this->totalProductos() + $this->totalTransporte();
    }

    /**
     * Toma como parámetro una colección de productos
     * y devuelve la suma de los totales (precio * cantidad)
     * de cada uno.
     * 
     * Si la colección es null o no se pasa ningún parámetro
     * se toman todos los productos del pedido.
     */
    function totalProductos($productos = null) : float {
        if (!$productos)
            $productos = $this->productos();

        return $productos->sum(fn($p) => $p->price * $p->pivot->cantidad);
    }

    /**
     * El total de bonos de transporte del pedido
     */
    function totalBonosDeTransporte() : int {
        return TransporteUtils::calcularTotal($this->productosConTransporte());
    }

    function totalATransferir() : float {
        $productos = $this->productos()->where(['bono' => false, 'barrial' => false])->get();
        return $this->totalProductos($productos); 
    }
}