<?php

include_once("server/lib/mod_dbm/package.dbm.php");
include_once("server/class/Delivery.php");
include_once("server/class/LocalesManager.php");

class Pedido {

    public $idPedido;
    public $idLocal;
    public $idDelivery;

    public function __construct() {
        $this->idDelivery = null;
        $this->idPedido = null;
        $this->idLocal = null;
    }

    public function setById($numeroPedido, $idLocal) {
        $this->idPedido = $numeroPedido;
        $this->idLocal = $idLocal;
        $this->retrieve();
        $this->getContent();
    }

    public function retrieve() {

        $dao = new dbObject();
        $q = sprintf("SELECT * FROM pedidos WHERE numero_pedido=%s AND id_local='%s';", $this->idPedido, $this->idLocal);
        $res = $dao->fetchQuery($q);

        if (is_array($res) && count($res)) {
            $this->token = $res[0]['token'];
            $this->tarjeta = $res[0]['tarjeta'];
            $this->direccion = $res[0]['direaccion'];
            $this->tipoDireccion = $res[0]['direccion_tipo'];
            $this->indicaciones = $res[0]['indicaciones'];
            $this->lat = $res[0]['lat'];
            $this->lng = $res[0]['lng'];
            $this->solicitadoTimestamp = $res[0]['solicitado_timestamp'];
            $this->demoraPrevista = $res[0]['demora_prevista'];
            $this->recogidoTimestamp = $res[0]['recogido_timestamp'];
            $this->concluidoTimestamp = $res[0]['concluido_timestamp'];
            $this->status = $res[0]['status'];
        }
    }

    public function getContent() {
        $dao = new dbObject();
        $q = sprintf("SELECT * FROM pedidos_contenido WHERE numero_pedido = %d AND id_local = '%s';", $this->idPedido, $this->idLocal);
        $this->content = $dao->fetchQuery($q);
        if (is_array($res) && count($res)) {
            foreach ($res as $item) {
                if ($item['es_bebida']) {
                    $this->llevaBebida = true;
                    break;
                }
            }
        }
    }

    public function persistData($pObj, $idDelivery) {

        $result = true;

        $idBrodevo = $pObj->idPedido;  // Es el número asignado por Brodevo.
        $idLocal = $pObj->idLocal;
        $nombreCliente = $pObj->clienteName;
        $telefonoCliente = $pObj->telefonoCliente;
        $direccion = $this->crearDireccion($pObj->nombreCalle, $pObj->numeroPuerta, $pObj->complemento, $pObj->esquinaName);
        $tipoDireccion = null;
        $indicaciones = $pObj->indicaciones;
        $lat = $pObj->lat;
        $lng = $pObj->lng;

        $pedidoTimestamp = $pObj->tsSolicitado;
        //$pedidoTimestamp = date('Y-m-d H:i:s',$pObj->tsSolicitado); // $pObj->tsSolicitado
        $recogidoTimestamp = ($pObj->tsPickup > 0) ? $pObj->tsPickup : time();
        $status = PENDING_STATUS;

        $timeout = $pObj->timeout;
        $fPago = $pObj->formaDePago;
        $entregadoTimestamp = null;

        $dao = new dbObject();

        // Preparar la sentencia SQL para la inserción

        $delivery = new Delivery($idDelivery);
        $delivery->retrieve();
        $idLocalDelivery = $delivery->getLocalActual();

        $pedidoStatement = $dao->connection->prepare("INSERT INTO pedidos (numero_pedido_bocatti, id_local, id_delivery, nombre_cliente, telefono_cliente, direccion, "
                . "                                                              direccion_tipo, indicaciones, latitud, longitud, pedido_timestamp, demora_prevista, "
                . "                                                              recogido_timestamp, entregado_timestamp, status, forma_de_pago) "
                . "                                   VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
        $pedidoStatement->bind_param("ssssssssddiiiiss", $idBrodevo, $idLocal, $idDelivery, $nombreCliente, $telefonoCliente, $direccion, $tipoDireccion, $indicaciones, $lat, $lng, $pedidoTimestamp, $timeout, $recogidoTimestamp, $entregadoTimestamp, $status, $fPago);

        if ($result = $pedidoStatement->execute()) {
            if (is_array($pObj->items) && count($pObj->items)) {
                $idPedido = mysqli_insert_id($dao->connection);
                foreach ($pObj->items as $j => $item) {
                    $stmt = $dao->connection->prepare("INSERT INTO pedidos_contenido (id_pedido, item, cantidad, es_bebida) VALUES (?, ?, ?, ?)");
                    $stmt->bind_param("issi", $idPedido, $item->item, $item->cantidad, $item->esRefresco);
                    if (!($result = $result && $stmt->execute())) {
                        break;
                    }
                }
                $coords = LocalesManager::getLocalCoords($idLocal);
                $localLat = (isset($coords['lat'])) ? $coords['lat'] : null;
                $localLng = (isset($coords['lng'])) ? $coords['lng'] : null;
                $lQ = sprintf("INSERT INTO log_estados (id_pedido, status, change_timestamp, lat, lng) VALUES (%d, 'PEN', %d, %s,%s)", $idPedido, $recogidoTimestamp, is_null($localLat)?"null":$localLat, is_null($localLng)?"null":$localLng);
                $res = $dao->execute($lQ);
            } else {
                $result = false;
            }
        } else {
            $result = false;
        }



        return $result;
    }

    public function crearDireccion($nombreCalle, $numero, $complemento, $esquina) {
        $dir = sprintf("%s\n%s\n%s", $nombreCalle, $numero, $complemento);
        $dir .= ($esquina) ? sprintf("\n%s", $esquina) : "";
        return $dir;
    }

    public function setIdDelivery($idDelivery) {
        $this->idDelivery = $idDelivery;
    }

    public function setAndPersistStatus($numeroBocatti, $idLocal, $newStatus) {

        $dao = new dbObject();

        // Preparar la sentencia SQL para la inserción
        $stmt = $dao->connection->prepare("UPDATE pedidos SET status = ? WHERE numero_pedido_bocatti = ? AND id_local=? LIMIT 1;");
        $stmt->bind_param("sss", $newStatus, $numeroBocatti, $idLocal);
        $stmt->execute();
    }
}
