<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Mpdf\Mpdf;
use League\Csv\CannotInsertRecord;
use League\Csv\Writer;
use App\Producto;
use DB;
use League\Csv\Reader;

class GrupoDeCompra extends Model
{
  public $timestamps = false;
  protected $fillable = [ "nombre","region","telefono","correo","referente_finanzas","cantidad_de_nucleos","fila", "devoluciones_habilitadas"];
  protected $table = 'grupos_de_compra';
  protected $hidden = ['password'];

  public function toggleDevoluciones()
  {
      $this->devoluciones_habilitadas = !$this->devoluciones_habilitadas;
      $this->save();
      return $this->devoluciones_habilitadas;
  }

  public function subpedidos() {
  	return $this->hasMany('App\Subpedido');
  }

  public function pedidosAprobados() {
    return $this->subpedidos->where('aprobado',1);
  }

  public function exportarPlanillasAPdf() {
      $subpedidos = $this->pedidosAprobados();
      //generar pdf
      $mpdf = new Mpdf();
      foreach ($subpedidos as $subpedido) {
          $tabla = $subpedido->generarHTML();
          // agregar la tabla al pdf en una nueva página
          $mpdf->WriteHTML($tabla);
          $mpdf->AddPage();
      }
      $filename = $this->nombre . '.pdf';
      // imprimir el pdf
      $mpdf->Output($filename, "D");
  }

  function filaVacia(string $product, int $columns) {
    $fila = [$product];
    for ($i = 1; $i <= $columns; $i++) {
      $fila[$i] = "0";
    }
    return $fila;
  }

  //Asume que los productos están gruadados en orden de fila
  public function obtenerTemplateDeFilasVacias(int $columns){
    $productosFilaID = Producto::productosFilaID();
    $productosIDNombre = Producto::productosIDNombre();
    $num_fila = 1;
    $template = [];
    foreach ($productosFilaID as $fila => $id) {
      for ($i = $num_fila; $i < $fila; $i++) {
        $template[$i] = $this->filaVacia("", $columns);
      }
      $template[$fila] = $this->filaVacia($productosIDNombre[$id], $columns);
      $num_fila = $fila+1;
    }
    $template[$this->obtenerFilaDeBonoTransporte()] = $this->filaVacia("Bonos de transporte", $columns);
    return $template;
  }

  private function obtenerFilaDeBonoTransporte() {
    $csv = Reader::createFromPath(resource_path('csv/productos.csv'), 'r');
    $csv->setDelimiter("|");
    $csv->setEnclosure("'");
    $registros = $csv->getRecords();

    foreach($registros as $key => $registro)
      if ($registro[0] == 'T') return $key;

    throw new Exception('No hay bono de transporte');
  }

  private function totalPedidosSinBonos() {
    $total = 0;
    foreach ($this->pedidosAprobados() as $pedido) {
      $total += ceil($pedido->totalSinBonos());
    }
    return $total;
  }

  public function calcularCantidadBDT() {
      return ceil($this->totalPedidosSinBonos() / 500);
  }

  public function totalBonosBarriales() {
    $total = 0;
    $bonoBarrial = Producto::where('nombre','LIKE','%barrial%')->first();
    if ($bonoBarrial) {
      $pedidos = $this->pedidosAprobados();
      foreach ($pedidos as $pedido) {
        $bonoPedido = $pedido->productos()->find($bonoBarrial["id"]);
        if ($bonoPedido) {
          $total += $bonoPedido["pivot"]["total"];
        }
      }
    }
    return $total;
  }

  public function exportarPedidoEnCSV(){
    $productos_en_pedido = DB::table('pedidos_aprobados')->where('grupo_de_compra_id',$this->id)->get()->keyBy('producto_id');

    //si no hay pedidos aprobados, salir
    if ($productos_en_pedido->count() == 0) { \Log::debug("El grupo de compra ". $this->nombre . " no tiene pedidos aprobados."); return; }
    $records = $this->obtenerTemplateDeFilasVacias(1);
    $productos_id_fila = Producto::productosIdFila();
    foreach ($productos_en_pedido as $id => $producto_pedido){
      $fila = $productos_id_fila[$id];
      $records[$fila][1] = $producto_pedido->cantidad_pedida;
    }

    $records[$this->obtenerFilaDeBonoTransporte()][1] = $this->calcularCantidadBDT();

    try {
      $writer = Writer::createFromPath(resource_path('csv/exports/'.$this->nombre.'.csv'), 'w');
      $writer->insertAll($records);
    } catch (CannotInsertRecord $e) {
      var_export($e->getRecords());
    }
  }

  public function exportarPedidoConNucleosEnCSV() {
    $productos_en_pedido = DB::table('pedidos_aprobados')->where('grupo_de_compra_id',$this->id)->get()->keyBy('producto_id');

    // si no hay pedidos aprobados, salir
    if ($productos_en_pedido->count() == 0) { \Log::debug("El grupo de compra ". $this->nombre . " no tiene pedidos aprobados."); return; }

    $pedidos = $this->pedidosAprobados();
    // Generar tabla vacía con una columna por núcleo
    $records = $this->obtenerTemplateDeFilasVacias($pedidos->count());
    $productos_id_fila = Producto::productosIdFila();

    foreach ($productos_en_pedido as $id => $producto_pedido) {
      $fila = $productos_id_fila[$id];
      $i = 1;
      // Poner cantidad de cada producto para cada núcleo
      foreach ($pedidos as $pedido) {
        $producto = $pedido->productos()->find($id);
        $records[$fila][$i] = $producto == NULL ? 0 : $producto["pivot"]["cantidad"];
        $i++;
      }
    }
    // Insertar lista de núcleos en la primera fila
    $nucleos = [""];
    $i = 1;
    foreach ($pedidos as $pedido) {
      $nucleos[$i] = $pedido->nombre;
      $i++;
    }
    array_splice($records, 0, 0, array($nucleos));

    // Guardar en un archivo .csv
    try {
      $writer = Writer::createFromPath(resource_path('csv/exports/'.$this->nombre.'-completo.csv'), 'w');
      $writer->insertAll($records);
    } catch (CannotInsertRecord $e) {
      var_export($e->getRecords());
    }
  }

  public static function exportarTodosLosPedidosEnCSV(){
    $gdcs=GrupoDeCompra::all();
    foreach ($gdcs as $gdc){ $gdc->exportarPedidoEnCSV(); }
  }
}