<?php
namespace ProVM\KI\Common\Controller\Web\Admin;

use Psr\Container\ContainerInterface as Container;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use Slim\Views\Blade as View;
use Carbon\Carbon;
use ProVM\Common\Factory\Model as ModelFactory;
use ProVM\KI\Producto;

class Productos {
  public function __invoke(Request $request, Response $response, View $view, ModelFactory $factory): Response {
    /*$filename = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.data'),
      'productos.json'
    ]);
    $productos = json_decode(trim(file_get_contents($filename)));*/
    $productos = $factory->find(Producto::class)->many();
    return $view->render($response, 'admin.productos', compact('productos'));
  }
  public function edit(Request $request, Response $response, View $view, Container $container, ModelFactory $factory, $producto): Response {
    /*$filename = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.data'),
      'productos.json'
    ]);
    $id = $producto;
    $productos = json_decode(trim(file_get_contents($filename)));
    $producto = $productos[$id];
    $producto->id = $id;
    $filename = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.data'),
      'destacados.json'
    ]);
    $destacados = json_decode(trim(file_get_contents($filename)));
    $destacado = false;
    if (array_search($id, $destacados) !== false) {
      $destacado = true;
    }
    $producto->destacado = $destacado;
    $folder = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.public'),
      'assets',
      'images',
      mb_strtolower($producto->nombre)
    ]);
    $producto->images = [];
    if (file_exists($folder)) {
      $files = new \DirectoryIterator($folder);
      foreach ($files as $file) {
        if ($file->isDir()) {
          continue;
        }
        $producto->images []= $file->getFilename();
      }
    }*/
    $producto = $factory->find(Producto::class)->where([['id', $producto]])->one();

    $filename = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.data'),
      'segmentos.json'
    ]);
    $segmentos = json_decode(trim(file_get_contents($filename)));
    return $view->render($response, 'admin.producto', compact('producto', 'segmentos'));
  }
  public function do_edit(Request $request, Response $response, Container $container, ModelFactory $factory, $producto): Response {
    $post = $request->getParsedBody();
    /*$filename = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.data'),
      'productos.json'
    ]);
    $id = $producto;
    $productos = json_decode(trim(file_get_contents($filename)));
    $producto = $productos[$producto];*/
    $producto = $factory->find(Producto::class)->where([['id', $producto]])->one();

    /*$fields = ['nombre', 'segmento', 'direccion', 'comuna', 'ciudad', 'bono', 'rentabilidad', 'estado',
      'cuota', 'unidades', 'modelos', 'descripcion', 'entrega'];
    foreach ($fields as $field) {
      if (!isset($producto->$field) or $post[$field] != $producto->$field) {
        $producto->$field = $post[$field];
        $changed = true;
      }
    }
    $valor = number_format($post['valor'], 0, ',', '.');
    if (!isset($producto->valor) or $producto->valor != $valor) {
      $producto->valor = $valor;
      $changed = true;
    }
    $tamaño = $post['tamaño_min'] . ' - ' . $post['tamaño_max'] . ' m²';
    if (!isset($producto->tamaño) or $producto->tamaño != $tamaño) {
      $producto->tamaño = $tamaño;
      $changed = true;
    }*/
    if (isset($post['destacado']) and $post['destacado'] == 'on') {
      $producto->destacado(true);
    }
    $post['tamaños'] = implode(' ', [
      $post['tamaño_min'],
      '-',
      $post['tamaño_max'],
      'm²'
    ]);
    $f = Carbon::today();
    $post['publicacion'] = $producto->publicacion ?? implode(' ', [
      $f->day,
      'de',
      ucfirst($f->locale('es')->isoFormat('MMMM')) . ',',
      $f->year
    ]);
    $post['id'] = $producto->id;
    $producto->map((object) $post);

    /*$status1 = false;
    if ($changed) {
      $productos[$id] = $producto;
      $status1 = (file_put_contents($filename, json_encode($productos, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES)) !== false);
    }*/
    $producto->save();

    /*$filename = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.data'),
      'destacados.json'
    ]);
    $destacados = json_decode(trim(file_get_contents($filename)));
    $changed = false;
    if (isset($post['destacado']) and $post['destacado'] == 'on') {
      if (array_search($producto->id, $destacados) === false) {
        $destacados []= $producto->id;
        sort($destacados);
        $changed = true;
      }
    } else {
      if (($i = array_search($producto->id, $destacados)) !== false) {
        unset($destacados[$i]);
        $destacados = array_values($destacados);
        $changed = true;
      }
    }
    $status2 = false;
    if ($changed) {
      $status2 = (file_put_contents($filename, json_encode($destacados)) !== false);
    }*/

    return $response
      ->withHeader('Location', implode('/', [$container->get('urls')->admin, 'productos']));
  }
  public function add(Request $request, Response $response, View $view, Container $container): Response {
    $filename = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.data'),
      'segmentos.json'
    ]);
    $segmentos = json_decode(trim(file_get_contents($filename)));
    return $view->render($response, 'admin.productos.add', compact('segmentos'));
  }
  public function do_add(Request $request, Response $response, Container $container, ModelFactory $factory): Response {
    $post = $request->getParsedBody();

    /*$producto = (object) [];
    $fields = ['nombre', 'segmento', 'direccion', 'comuna', 'ciudad', 'bono', 'rentabilidad', 'estado',
      'cuota', 'unidades', 'modelos', 'descripcion', 'entrega'];
    foreach ($fields as $field) {
      $producto->$field = $post[$field];
    }
    $valor = number_format($post['valor'], 0, ',', '.');
    $producto->valor = $valor;
    $tamaño = $post['tamaño_min'] . ' - ' . $post['tamaño_max'] . ' m²';
    $producto->tamaño = $tamaño;

    $f = Carbon::today();
    $producto->publicacion = implode(' ', [
      $f->day,
      'de',
      ucfirst($f->locale('es')->isoFormat('MMMM')) . ',',
      $f->year
    ]);

    $filename = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.data'),
      'productos.json'
    ]);
    $productos = json_decode(trim(file_get_contents($filename)));
    $productos []= $producto;
    file_put_contents($filename, json_encode($productos, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES));*/

    $f = Carbon::today();
    $post['publicacion'] = implode(' ', [
      $f->day,
      'de',
      ucfirst($f->locale('es')->isoFormat('MMMM')) . ',',
      $f->year
    ]);
    $producto = $factory->create(Producto::class, (object) $post);
    if (isset($post['destacado']) and $post['destacado'] == 'on') {
      $producto->destacado(true);
    }
    $producto->save();

    /*if (isset($post['destacado']) and $post['destacado'] == 'on') {
      //$id = count($productos) - 1;
      $id = $producto->id;
      $filename = implode(DIRECTORY_SEPARATOR, [
        $container->get('folders.data'),
        'destacados.json'
      ]);
      $destacados = json_decode(trim(file_get_contents($filename)));
      $destacados []= $proyecto->id;
      sort($destacados);
      file_put_contents($filename, json_encode($destacados));
    }*/

    return $response
      ->withHeader('Location', implode('/', [$container->get('urls')->admin, 'productos']));
  }
  public function delete(Request $request, Response $response, ModelFactory $factory): Response {
    $post = $request->getParsedBody();
    /*$filename = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.data'),
      'productos.json'
    ]);
    $id = $post['id'];
    $productos = json_decode(trim(file_get_contents($filename)));
    $producto = $productos[$id];
    $folder = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.public'),
      'assets',
      'images',
      mb_strtolower($producto->nombre)
    ]);
    unset($productos[$id]);
    $productos = array_values($productos);
    $status = false;
    $status |= (file_put_contents($filename, json_encode($productos, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES)) !== false);
    if (file_exists($folder)) {
      $status |= rmdir($folder);
    }
    $filename = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.data'),
      'destacados.json'
    ]);
    $destacados = json_decode(trim(file_get_contents($filename)));
    if (($i = array_search($id, $destacados)) !== false) {
      unset($destacados[$i]);
      $destacados = array_values($destacados);
      $status |= (file_put_contents($filename, json_encode($destacados)) !== false);
    }*/
    $producto = $factory->find(Producto::class)->where([['id', $post['id']]])->one();
    $status = $producto->delete();

    $output = [
      'information' => $post,
      'estado' => $status
    ];
    $response->getBody()->write(json_encode($output));
    return $response
      ->withHeader('Content-Type', 'application/json')
      ->withStatus(201);
  }
  public function add_image(Request $request, Response $response, ModelFactory $factory, $producto): Response {
    $post = $request->getParsedBody();
    $files = $request->getUploadedFiles();
    $file = $files['imagen'];
    /*$filename = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.data'),
      'productos.json'
    ]);
    $id = $producto;
    $productos = json_decode(trim(file_get_contents($filename)));
    $producto = $productos[$producto];
    $folder = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.public'),
      'assets',
      'images',
      mb_strtolower($producto->nombre)
    ]);
    if (!file_exists($folder)) {
      mkdir($folder);
    }
    $filename = implode(DIRECTORY_SEPARATOR, [
      $folder,
      $file->getClientFilename()
    ]);
    $file->moveTo($filename);*/
    $producto = $factory->find(Producto::class)->where([['id', $producto]])->one();
    $status = $producto->addImagen($file);

    $output = [
      'informacion' => $producto->id,
      'estado' => $status
    ];
    $response->getBody()->write(json_encode($output));
    return $response
      ->withHeader('Content-Type', 'application/json')
      ->withStatus(201);
  }
  public function set_video(Request $request, Response $response, Container $container, $producto): Response {
    $post = $request->getParsedBody();
    $files = $request->getUploadedFiles();
    die();
    $file = $files['video'];
    $folder = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.public'),
      'assets',
      'images',
      mb_strtolower($producto->nombre)
    ]);
  }
  public function delete_image(Request $request, Response $response, ModelFactory $factory, $producto): Response {
    $post = $request->getParsedBody();
    /*$filename = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.data'),
      'productos.json'
    ]);
    $id = $producto;
    $productos = json_decode(trim(file_get_contents($filename)));
    $producto = $productos[$producto];
    $folder = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.public'),
      'assets',
      'images',
      mb_strtolower($producto->nombre)
    ]);
    $filename = implode(DIRECTORY_SEPARATOR, [
      $folder,
      $post['imagen']
    ]);
    $status = unlink($filename);*/
    $producto = $factory->find(Producto::class)->where([['id', $producto]])->one();
    $status = $producto->deleteImagen($post['imagen']);

    $output = [
      'estado' => $status
    ];
    $response->getBody()->write(json_encode($output));
    return $response
      ->withHeader('Content-Type', 'application/json')
      ->withStatus(201);
  }
  public function delete_video(Request $request, Response $response, Container $container, $producto): Response {
    $post = $request->getParsedBody();
    $folder = implode(DIRECTORY_SEPARATOR, [
      $container->get('folders.public'),
      'assets',
      'images',
      mb_strtolower($producto->nombre)
    ]);
    return $response;
  }
}
