<?php

namespace App;

use League\Csv\Reader;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Log;
use App\Filtros\FiltroDeSubpedido;

class Subpedido extends Model
{
  public $timestamps = false;
  protected $fillable = ['grupo_de_compra_id', 'aprobado', 'nombre', 'devoluciones_total', 'devoluciones_notas'];

  public function productos()
  {
    return $this->belongsToMany('App\Producto')->withPivot(["cantidad","total", "notas"]);
  }

  //Bonos del MPS, Sororo, etc. NO devuelve bonos de transporte
  private function bonos()
  {
    return $this->productos()->where('bono',1);
  }

  public function productosSinBonos()
  {
    return $this->productos()->where('bono',false);
  }

  public function grupoDeCompra()
  {
    return $this->belongsTo('App\GrupoDeCompra');
  }

  //Permite que se apliquen los filtros al hacer una request (por ejemplo, de búsqueda)
  public function scopeFiltrar($query, FiltroDeSubpedido $filtros)
  {
      return $filtros->aplicar($query);
  }

  //Subtotal de dinero de productos del pedido, sin bonos ni transporte
  public function totalSinBonos()
  {
    return $this->productosSinBonos()->sum('total');
  }

  public function totalParaTransporte() {
      $total = 0;
      foreach ($this->productos()->get() as $producto) {
          if ($producto->pagaTransporte()) {
              $total += $producto->precio * $producto->pivot->cantidad;
          }
      }
      return ceil($total);
  }

  //Cantidad de bonos de transporte
  public function cantidadBDT()
  {
    return ceil($this->totalParaTransporte() / 500);
  }

  //Subtotal de dinero de bonos de transporte
  public function getSubtotalBDT()
  {
    return $this->cantidadBDT() * 15;
  }

  //Subtotal de dinero de bonos (MPS, Sororo, etc)
  public function getSubtotalBonos()
  {
    return $this->bonos()->sum('total');
  }

  public function getTotal()
  {
    return $this->totalSinBonos() + $this->getSubtotalBDT() + $this->getSubtotalBonos();
  }

  public function getTotalMenosDevoluciones() {
    return $this->getTotal() - $this->getDevoluciones();
  }

  //Actualiza el pedido, agregando o quitando del subpedido según sea necesario. Debe ser llamado desde el controlador de subpedidos, luego de validar que los parámetros $producto y $cantidad son correctos. También calcula el subtotal por producto.
  public function syncProducto(Producto $producto, Int $cantidad, string $notas) {
        if ($cantidad){
          //si la cantidad es 1 o más se agrega el producto o actualiza la cantidad
          $this->productos()->syncWithoutDetaching([
            $producto->id => [
              'cantidad' => $cantidad,
              'total' => $cantidad * $producto->precio,
              'notas' => $notas,
            ]
          ]);
        } else {
            //si la cantidad es 0, se elimina el producto del subpedido
            $this->productos()->detach($producto->id);
        }
  }

  public function toggleAprobacion(bool $aprobacion) {
      $this->aprobado = $aprobacion;
      $this->save();
  }

  public function generarHTML() {
      $view = view("pdfgen.subpedido_tabla", ["subpedido" => $this]);
      return $view->render();
  }

  public function getDevoluciones() {
    return $this->devoluciones_total;
  }

  public function getNotasDevoluciones() {
    return $this->devoluciones_notas;
  }
  public function syncDevoluciones(float $total, string $notas) {
    $this->devoluciones_total = $total;
    $this->devoluciones_notas = $notas;
    $this->save();
  }
}