<?php

namespace App\Controllers\Logistica;

use App\Controllers\BaseController;
use App\Services\ImpresoraEtiquetaService;
use App\Services\LogisticaService;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
use Hermawan\DataTables\DataTable;

class LogisticaController extends BaseController
{

    protected ImpresoraEtiquetaService $impresoraEtiquetaService;
    protected string $locale;
    protected array $viewData;

    protected static $controllerSlug = 'logistica';
    protected static $viewPath = 'themes/vuexy/form/logistica/';

    public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
    {
        $this->impresoraEtiquetaService = service('impresora_etiqueta');
        $this->locale = session()->get('lang');

        $this->viewData['pageTitle'] = lang('Logistica.logistica');

        // Breadcrumbs
        $this->viewData['breadcrumb'] = [
            ['title' => lang("App.menu_logistica"), 'route' => route_to("LogisticaPanel"), 'active' => false],
        ];


        parent::initController($request, $response, $logger);
    }
    public function print_test_label()
    {
        $etiquetaData = $this->impresoraEtiquetaService->test();
        $responseMessage = $etiquetaData["status"] ? "OK" : "ERROR";
        return $this->response->setJSON(["message" => $responseMessage, "data" => $etiquetaData, "status" => $etiquetaData["status"]]);
    }

    public function panel()
    {
        $viewData = [
            'currentModule' => static::$controllerSlug,
            'boxTitle' => lang('Logistica.panel'),
            'pageSubTitle' => 'Panel',
            'usingServerSideDataTable' => true,
        ];

        $viewData = array_merge($this->viewData, $viewData); // merge any possible values from the parent controller class

        return view(static::$viewPath . 'viewPanelLogistica', $viewData);
    }

    public function gestionEnvios()
    {
        $viewData = [
            'currentModule' => static::$controllerSlug,
            'boxTitle' => lang('Logistica.gestionEnvios'),
            'usingServerSideDataTable' => true,
        ];

        $viewData = array_merge($this->viewData, $viewData); // merge any possible values from the parent controller class

        return view(static::$viewPath . 'viewLogisticaSelectEnvios', $viewData);
    }

    public function searchPedidoOrISBN($search = "", $envio_id = null)
    {

        if (empty($search)) {
            $result = [
                'status' => false,
                'message' => lang('Logistica.errors.noDataToFind'),
            ];
            return $this->response->setJSON($result);
        }
        $result = LogisticaService::findPedidoOrISBN($search);
        return $this->response->setJSON($result);
    }

    public function selectAddEnvioLinea()
    {

        if ($this->request->isAJAX()) {
            $query = LogisticaService::findLineaEnvioPorEnvio($this->request->getGet('envio'));
            if ($this->request->getGet("q")) {
                $query->groupStart()
                    ->orLike("p.id", $this->request->getGet("q"))
                    ->orLike("pr.titulo", $this->request->getGet("q"))
                    ->groupEnd();
            }


            $result = $query->orderBy("name", "asc")->get()->getResultObject();

            return $this->response->setJSON($result);
        } else {
            return $this->failUnauthorized('Invalid request', 403);
        }
    }

    public function addEnvioLinea()
    {

        if ($this->request->isAJAX()) {
            $pedido_id = $this->request->getGet('pedido_id');
            $envio_id = $this->request->getGet('envio_id');
            $envioModel = model('App\Models\Logistica\EnvioModel');
            $direccion = $envioModel->find($envio_id)->direccion;

            $result = LogisticaService::addLineaEnvio($envio_id, $pedido_id, $direccion);
            return $this->response->setJSON($result);
        } else {
            return $this->failUnauthorized('Invalid request', 403);
        }
    }

    public function datatable_envios()
    {
        $model = model('App\Models\Logistica\EnvioModel');
        $q = $model->getDatatableQuery();


        $result = DataTable::of($q)
            ->edit(
                "finalizado",
                function ($row, $meta) {
                    if ($row->finalizado == 1)
                        return '<i class="ti ti-check"></i>';
                    else
                        return '<i class="ti ti-x"></i>';
                }
            )
            ->add("action", callback: function ($q) {

                return '
                        <div class="btn-group btn-group-sm">
                            <a href="javascript:void(0);"><i class="ti ti-eye ti-sm btn-edit mx-2" data-id="' . $q->id . '"></i></a>
                        </div>
                    ';
            });

        return $result->toJson(returnAsObject: true);
    }

    public function editEnvio($id = null)
    {

        if (empty($id)) {
            return redirect()->to(base_url('logistica/selectEnvios/simple'))->with('error', lang('Logistica.errors.noEnvio'));
        }
        $model = model('App\Models\Logistica\EnvioModel');
        $envioEntity = $model->select('envios.*, lg_paises.nombre as pais')
            ->join('lg_paises', 'lg_paises.id = envios.pais_id', 'left')
            ->where('envios.id', $id)
            ->first();
        if (empty($envioEntity)) {
            return redirect()->to(base_url('logistica/selectEnvios/simple'))->with('error', lang('Logistica.errors.noEnvio'));
        }
        
        $modelProveedor = model('App\Models\Compras\ProveedorModel');
        $proveedor = $modelProveedor->select('id, nombre')
            ->where('deleted_at', null)
            ->where('id', $envioEntity->proveedor_id)
            ->orderBy('nombre', 'asc')
            ->first();
        if(!empty($proveedor)){
            $envioEntity->proveedor_nombre = $proveedor->nombre;
        }

        $viewData = [
            'currentModule' => static::$controllerSlug,
            'boxTitle' => '<i class="ti ti-truck ti-xl"></i>' . ' ' . lang('Logistica.envio') . ' [' . $envioEntity->id . ']: ' . $envioEntity->direccion,
            'usingServerSideDataTable' => true,
            'envioEntity' => $envioEntity,
        ];

        $viewData = array_merge($this->viewData, $viewData); // merge any possible values from the parent controller class

        return view(static::$viewPath . 'viewEnvioEditForm', $viewData);
    }

    public function updateCajasEnvio()
    {
        if ($this->request->isAJAX()) {
            $id = $this->request->getPost('id');
            $cajas = $this->request->getPost('cajas');
            $model = model('App\Models\Logistica\EnvioModel');
            $result = $model->update($id, [
                'cajas' => $cajas,
            ]);
            return $this->response->setJSON([
                "status" => $result,
            ]);
        } else {
            return $this->failUnauthorized('Invalid request', 403);
        }
    }

    public function finalizarEnvio()
    {
        if ($this->request->isAJAX()) {

            $id = $this->request->getPost('id') ?? null;
            $finalizar_ots = $this->request->getPost('finalizar_ots') ?? false;
            
            $result = LogisticaService::finalizarEnvio($id);
            return $this->response->setJSON($result);
        } else {
            return $this->failUnauthorized('Invalid request', 403);
        }
    }

    public function finalizarEnvioYOts()
    {
        if ($this->request->isAJAX()) {

            $id = $this->request->getPost('id') ?? null;
            $finalizar_ots = $this->request->getPost('finalizar_ots') ?? false;
            
            $result = LogisticaService::finalizarEnvio($id, $finalizar_ots);
            return $this->response->setJSON($result);
        } else {
            return $this->failUnauthorized('Invalid request', 403);
        }
    }

    public function datatable_enviosEdit($idEnvio)
    {
        $model = model('App\Models\Logistica\EnvioLineaModel');
        $q = $model->getDatatableQuery($idEnvio);


        $result = DataTable::of($q)
            ->add(
                "rowSelected",
                callback: function ($q) {
                    return '<input type="checkbox" class="form-check-input checkbox-linea-envio" name="row_selected[]" value="' . $q->id . '">';
                }
            )
            ->edit(
                "pedido",
                function ($row, $meta) {
                    return '<a href="' . base_url('pedidos/edit/' . $row->pedido) . '" target="_blank">' . $row->pedido . '</a>';
                }
            )
            ->edit(
                "presupuesto",
                function ($row, $meta) {
                    return '<a href="' . base_url('presupuestoadmin/edit/' . $row->presupuesto) . '" target="_blank">' . $row->presupuesto . '</a>';
                }
            )->edit(
                "unidadesEnvio",
                function ($row, $meta) {
                    if($row->finalizado == 1){
                        return $row->unidadesEnvio;
                    }
                    return '<input type="number" class="form-control input-lineas input-unidades text-center" 
                        data-id="'. $row->id.'" data-name="unidades_envio" value="' . $row->unidadesEnvio . '">';
                }
            );

        return $result->toJson(returnAsObject: true);
    }

    public function setCajaLinea()
    {

        if ($this->request->isAJAX()) {
            $id = $this->request->getPost('id');
            $caja = $this->request->getPost('caja');


            $model = model('App\Models\Logistica\EnvioLineaModel');
            $result = $model->update($id, [
                'cajas' => $caja,
            ]);
            return $this->response->setJSON([
                "status" => $result,
            ]);
        } else {
            return $this->failUnauthorized('Invalid request', 403);
        }
    }

    public function deleteLineas()
    {
        if ($this->request->isAJAX()) {
            $ids = $this->request->getPost('ids');
            $model = model('App\Models\Logistica\EnvioLineaModel');
            $result = $model->delete($ids);
            return $this->response->setJSON([
                "status" => $result,
            ]);
        } else {
            return $this->failUnauthorized('Invalid request', 403);
        }
    }

    public function updateLineaEnvio()
    {
        $id = $this->request->getPost('id');
        $fieldName = $this->request->getPost('name');
        $fieldValue = $this->request->getPost('value');

        if (!$id || !$fieldName || ($fieldName=='unidades_envio' && !$fieldValue)) {
            return $this->response->setJSON([
                'status' => false,
                'message' => 'Datos inválidos'
            ]);
        }

        $model = model('App\Models\Logistica\EnvioLineaModel');
        $updated = $model->update($id, [
            "" . $fieldName => $fieldValue==""? null: $fieldValue,
        ]);

        return $this->response->setJSON([
            'status' => $updated,
            'message' => $updated ? 'Actualizado' : 'Error al actualizar'
        ]);
    }

    public function updateCodigoSeguimiento()
    {
        $id = $this->request->getPost('id');
        $fieldValue = $this->request->getPost('codigo_seguimiento');

        if (!$id) {
            return $this->response->setJSON([
                'status' => false,
                'message' => 'Datos inválidos'
            ]);
        }

        $model = model('App\Models\Logistica\EnvioModel');
        $updated = $model->update($id, [
            "codigo_seguimiento" => $fieldValue==""? null: $fieldValue,
        ]);

        return $this->response->setJSON([
            'status' => $updated,
            'message' => $updated ? 'Actualizado' : 'Error al actualizar'
        ]);
    }

    public function updateProveedorEnvio()
    {
        $id = $this->request->getPost('id');
        $fieldValue = $this->request->getPost('proveedor_id');

        if (!$id) {
            return $this->response->setJSON([
                'status' => false,
                'message' => 'Datos inválidos'
            ]);
        }

        $model = model('App\Models\Logistica\EnvioModel');
        $updated = $model->update($id, [
            "proveedor_id" => $fieldValue==""? null: $fieldValue,
        ]);

        return $this->response->setJSON([
            'status' => $updated,
            'message' => $updated ? 'Actualizado' : 'Error al actualizar'
        ]);
    }

    public function saveComments()
    {
        $id = $this->request->getPost('id');
        $comments = $this->request->getPost('comentarios');

        if (!$id || !$comments) {
            return $this->response->setJSON([
                'status' => false,
                'message' => 'Datos inválidos'
            ]);
        }

        $model = model('App\Models\Logistica\EnvioModel');
        $updated = $model->update($id, [
            'comentarios' => $comments,
        ]);

        return $this->response->setJSON([
            'status' => $updated,
            'message' => $updated ? 'Actualizado' : 'Error al actualizar'
        ]);
    }

}
