<?php
namespace App\Controller;

use Carbon\Carbon;
use Stringy\Stringy;

use App\Definition\Controller;
use App\Service\Factory;
use Incoviba\old\Proyecto\Proyecto;
use Incoviba\old\Proyecto\ProyectoTipoUnidad;
use Incoviba\old\Venta\Precio;
use Incoviba\old\Venta\EstadoPrecio;
use Incoviba\old\Venta\Unidad;
use Incoviba\old\Venta\TipoUnidad;
use Incoviba\old\Venta\TipoEstadoPrecio;

class Precios
{
  use Controller;

  public static function listProyectos()
  {
    $proyectos = \model(Proyecto::class)->orderByAsc('descripcion')->findMany();
    return view('ventas.precios.proyectos', compact('proyectos'));
  }
  public static function list()
  {
    $proyecto = \model(Proyecto::class)->findOne(get('proyecto'));
    return view('ventas.precios.list', compact('proyecto'));
  }
  public static function import()
  {
    $proyectos = \model(Proyecto::class)->orderByAsc('descripcion')->findMany();
    return view('ventas.precios.import', compact('proyectos'));
  }
  public static function importar()
  {
    $proyecto = \model(Proyecto::class)->findOne(post('proyecto'));
    $fecha = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));
    $file = explode(PHP_EOL, trim(file_get_contents($_FILES['archivo']['tmp_name'])));
    $columnas = explode(';', array_shift($file));
    $tr = model(TipoEstadoPrecio::class)->where('descripcion', 'reemplazado')->findOne()->id;
    $tv = model(TipoEstadoPrecio::class)->where('descripcion', 'vigente')->findOne()->id;
    foreach ($file as $line) {
      if (trim($line) == '') {
        continue;
      }
      $info = explode(';', $line);
      $tipo = \model(TipoUnidad::class)->where('descripcion', $info[0])->findOne();
      $unidad = \model(Unidad::class)->where('tipo', $tipo->id)->where('descripcion', $info[1])->where('proyecto', $proyecto->id)->findOne();

      self::reemplazar($unidad->id, $info[2], $fecha, $tr, $tv);
    }
    header('Location: ' . nUrl('precios', 'list', ['proyecto' => $proyecto->id]));
  }
  public static function add()
  {
    $proyecto = \model(Proyecto::class)->findOne(get('proyecto'));
    return view('ventas.precios.add', compact('proyecto'));
  }
  public static function agregar()
  {
    $proyecto = get('proyecto');
    $fecha = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));
    $precios = [];
    foreach (post() as $name => $valor) {
      if ($valor == '' or strpos($name, 'precio') === false) {
        continue;
      }
      list($tipo, $id) = explode(':', $name);
      $tipo = trim(str_replace('precio', '', $tipo), '_');
      $id = explode('-', $id);
      switch (count($id)) {
        case 1:
          $precios []= ['tipo' => 'pt', 'id' => $id[0], 'valor' => $valor];
          break;
        case 2:
          $exists = false;
          foreach ($precios as $precio) {
            if ($precio['tipo'] == 'pt' and $precio['id'] == $id[0]) {
              $exists = true;
              break;
            }
          }
          if (!$exists) {
            $precios []= ['tipo' => 'subtipo', 'id' => $id[1], 'pt' => $id[0], 'valor' => $valor];
          }
          break;
        case 3:
          $exists = false;
          foreach ($precios as $precio) {
            if ($precio['tipo'] == 'pt' and $precio['id'] == $id[0]) {
              $exists = true;
              break;
            }
            if ($precio['tipo'] == 'subtipo' and 'id' == $id[1] and 'pt' == $id[0]) {
              $exists = true;
              break;
            }
          }
          if (!$exists) {
            $precios []= ['tipo' => 'unidad', 'id' => $id[2], 'valor' => $valor];
          }
          break;
      }
    }
    foreach ($precios as $precio) {
      $precio = (object) $precio;
      switch ($precio->tipo) {
        case 'pt':
        $pt = model(ProyectoTipoUnidad::class)->findOne($precio->id);
        $pt->setPrecios($fecha, $precio->valor);
        break;
        case 'subtipo':
        $pt = model(ProyectoTipoUnidad::class)->findOne($precio->pt);
        $pt->setPreciosSubtipo($precios->id, $fecha, $precio->valor);
        break;
        case 'unidad':
        $unidad = model(Unidad::class)->findOne($precio->id);
        $unidad->setPrecio($fecha, $precio->valor);
        break;
      }
    }
    header('Location: ' . nUrl('precios', 'list', ['proyecto' => $proyecto]));
  }
  protected static function reemplazar(int $unidad_id, float $valor, \DateTime $fecha, int $tr = 0, int $tv = 0)
  {
    if ($tr == 0) {
      $tr = model(TipoEstadoPrecio::class)->where('descripcion', 'reemplazado')->findOne()->id;
    }
    if ($tv == 0) {
      $tv = model(TipoEstadoPrecio::class)->where('descripcion', 'vigente')->findOne()->id;
    }
    $olds = \model(Precio::class)->where('unidad', $unidad_id)->findMany();
    if ($olds !== false) {
      foreach ($olds as $old) {
        if (!$old->vigente()) {
          continue;
        }
        $data = [
          'precio' => $old->id,
          'fecha' => $fecha->format('Y-m-d'),
          'estado' => $tr
        ];
        $estado = \model(EstadoPrecio::class)->create($data);
        $estado->save();
      }
    }
    $data = [
      'unidad' => $unidad_id,
      'valor' => $valor
    ];
    $precio = (new Factory(Precio::class))->where($data)->find();
    if (!$precio) {
      $precio = \model(Precio::class)->create($data);
      $precio->save();
    }
    $data = [
      'precio' => $precio->id,
      'fecha' => $fecha->format('Y-m-d'),
      'estado' => $tv
    ];
    $estado = \model(EstadoPrecio::class)->create($data);
    $estado->save();
  }
}
