<?php

namespace App\Models;

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

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

    /**
     * La región a la que pertenece el barrio.
     */
    public function region(): BelongsTo
    {
        return $this->belongsTo(Region::class);
    }

    /**
     * Los pedidos que pertenecen al barrio.
     */
    public function pedidos(): HasMany
    {
        return $this->hasMany(Pedido::class);
    }

    function crearPedido(string $nombre) : Pedido {
        return $this->pedidos()->create(['name' => $name]);
    }

    function pedidosConfirmados() {
        return $this->pedidos()->where('confirmed',true);
    }

    private function calcularTotalConfirmados(Closure $closure = null) : float {
        if (!$closure)
            $closure = fn($p) => $p->totalChismosa();

        return $this->pedidosConfirmados()->sum($closure);
    }

    function totalARecaudar() : float {
        return $this->calcularTotalConfirmados();
    }

    function totalNoBarriales() : float {
        return $this->calcularTotalConfirmados(fn($p) => $p->total($p->productosNoBarriales()));
    }

    function totalTransporte() : float {
        $totalSinTransporte = $this->calcularTotalConfirmados(
            fn($p) => $p->total($p->productosSinTransporte())
        );
        return ($totalSinTransporte / Constants::DIVISOR_TRANSPORTE) * Constants::COSTO_TRANSPORTE;
    }

    function totalATransferir() : float {
        return $this->totalNoBarriales() + $this->totalTransporte();
    }

    /**
     * Los productos que pertenecen al barrio.
     */
    public function productos(): HasMany
    {
        return $this->hasMany(Producto::class);
    }
}