<?php

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

/**
 * Description of Delivery
 *
 * @author pc
 */
class PedidosManager
{

    public $dao;

    public function __construct()
    {
        $this->dao = new dbObject();
    }

    public function getAssignedDelivery() {}

    static public function getPedidosDeliveryTimestamp($pedidosList)
    {
        $pedidoRestriction = "";
        if (is_array($pedidosList) && count($pedidosList)) {
            foreach ($pedidosList as $pedidoId) {
                $pedidoRestriction .= ($pedidoRestriction) ? ("," . $pedidoId) : $pedidoId;
            }
            $dao = new dbObject();
            $pedidosTimestampQuery = sprintf("SELECT numero_pedido_bocatti, entregado_timestamp FROM pedidos WHERE numero_pedido_bocatti IN (%s)", $pedidoRestriction);
            $res = $dao->fetchQuery($pedidosTimestampQuery);
            return $res;
        }
    }

    static public function getIdPedidoBocatti($idPedido)
    {
        $dao = new dbObject();
        $q = sprintf("SELECT numero_pedido_bocatti FROM pedidos WHERE id_pedido = %d", $idPedido);
        $res = $dao->fetchQuery($q);
        if (is_array($res) && count($res)) {
            return $res[0]['numero_pedido_bocatti'];
        } else {
            return null;
        }
    }


    public function setPedidoStatus($idPedido, $status, $idDelivery, $changeTimestamp = null, $lat = null, $lng = null)
    {

        if (is_null($changeTimestamp)) {
            $changeTimestamp = time();
        }

        $dao = new dbObject();
        switch ($status) {

            case "ENC":
                $q1 = sprintf("UPDATE pedidos SET status = 'ENC', en_camino_timestamp=%d WHERE id_pedido='%d' AND id_delivery = '%s' AND status != 'ENC'", $changeTimestamp, $idPedido, $idDelivery);
                break;

            case "ENT":
                $q1 = sprintf("UPDATE pedidos SET status = 'ENT', entregado_timestamp=%d WHERE id_pedido='%d' AND id_delivery = '%s'", $changeTimestamp, $idPedido, $idDelivery);
                break;

            default:
                $q1 = sprintf("UPDATE pedidos SET status = '%s' WHERE id_pedido='%d' AND id_delivery = '%s'", $status, $idPedido, $idDelivery);
                break;
        }

        $ar1 = $dao->execute($q1);

        $q2 = sprintf("INSERT into log_estados (id_pedido, status, change_timestamp, success, lat,lng) VALUES (%d, '%s', %d, %d, %s, %s);", $idPedido, $status, $changeTimestamp, $ar1, $lat, $lng);
        $ar2 = $dao->execute($q2);

        // $ar = $dao->getAffectedRows();
        return  $ar1 == 1;
    }

    public function reassign($idPedido, $idLocal, $newDeliveryId)
    {

        $dao = new dbObject();
        $statement = $dao->connection->prepare("UPDATE pedidos SET id_delivery = ? WHERE numero_pedido_bocatti=? AND id_local=?");
        $statement->bind_param("sss", $newDeliveryId, $idPedido, $idLocal);
        $statement->execute();

        return $statement->affected_rows == 1;
    }

    public function setDevuelto($idPedido, $idLocal)
    {

        $pedidos = array();
        $dao = new dbObject();
        $statement = $dao->connection->prepare("UPDATE pedidos SET status = ? WHERE numero_pedido_bocatti=? AND id_local = ?");
        $status = CANCEL_STATUS;
        $statement->bind_param("sss", $status, $idPedido, $idLocal);
        $statement->execute();
        return $statement->affected_rows == 1;
    }

    public function cedular($idPedido)
    {

        $pedidos = array();
        $dao = new dbObject();
        $statement = $dao->connection->prepare("UPDATE pedidos SET status = 'CAN' WHERE id_pedido=?");
        $status = DEVUELTO_STATUS;
        $statement->bind_param("s", $idPedido);
        $statement->execute();
        return $statement->affected_rows == 1;
    }

    public function getPedidosPendientes($idDelivery, $idLocal, $soloActivos)
    {
        $pedidos = array();
        $dao = new dbObject();

        if ($soloActivos) {
            $sQuery = "SELECT * FROM pedidos p WHERE status IN ('" . PENDING_STATUS . "','" . STANDBY_STATUS . "','" . ENC_STATUS . "') AND id_delivery=? AND id_local=?";
            $statement = $dao->connection->prepare($sQuery);
        } else {
            $sQuery = "SELECT * FROM pedidos p WHERE status IN ('" . PENDING_STATUS . "','" . STANDBY_STATUS . "','" . CANCEL_STATUS . "','" . ENC_STATUS . "') AND id_delivery=? AND id_local=?";
            $statement = $dao->connection->prepare($sQuery);
        }

        $statement->bind_param("si", $idDelivery, $idLocal);
        $statement->execute();

        $result = $statement->get_result();
        while ($pedido = $result->fetch_array(MYSQLI_ASSOC)) {
            $content = $this->getPedidoContent($pedido['id_pedido']);
            $pedido['content'] = $content['content'];
            $pedido['llevaBebida'] = $content['llevaBebida'];
            $pedidos[] = $pedido;
        }
        return $pedidos;
    }

    public function getPedidosPendientesDeCedulacion()
    {
        $pedidos = array();
        $dao = new dbObject();
        $statement = $dao->connection->prepare("SELECT * FROM pedidos p WHERE status IN ('" . ENTREGADO_STATUS . "','" . STANDBY_STATUS . "')");
        $statement->execute();

        $result = $statement->get_result();
        while ($pedido = $result->fetch_array(MYSQLI_ASSOC)) {
            $content = $this->getPedidoContent($pedido['id_pedido']);
            $pedido['content'] = $content['content'];
            $pedido['llevaBebida'] = $content['llevaBebida'];
            $pedidos[] = $pedido;
        }
        return $pedidos;
    }

    public static function getPedidoPosition($idPedido, $idLocal)
    {


        $q = sprintf("SELECT ped.id_pedido,ped.id_delivery,ped.latitud,ped.longitud, ped.status, ped.pedido_timestamp, ped.recogido_timestamp, ped.demora_prevista, del.current_lat, del.current_lng, del.nombre as nombre_delivery, del.telefono as telefono_delivery
                                                    FROM bocatti.pedidos ped
                                                    LEFT JOIN deliverys del ON del.id_delivery = ped.id_delivery
                                                WHERE ped.numero_pedido_bocatti = \"%s\" AND id_local = \"%s\"
                                                ORDER BY ped.order, ped.id_pedido", $idPedido, $idLocal);
        $dao = new dbObject();
        $res = $dao->fetchQuery($q);

        if (isset($res[0]) && is_array($res[0]) && count($res[0])) {
            $pedido = $res[0];
            $pedido['distance'] = round(GeoUtils::getTheDistance($pedido['latitud'], $pedido['longitud'], $pedido['current_lat'], $pedido['current_lng']));
            switch ($pedido['status']) {
                case ENC_STATUS:
                    $pedido['eta'] = round(floatval($pedido['distance']) / AVG_SPEED);
                    break;
                case PENDING_STATUS:
                    $pedido['eta'] = -1 * PedidosManager::getPedidoQueueIndex($pedido['id_delivery'], $idPedido);
                    break;
                default:
                    $pedido['eta'] = 0;
            }
        } else {
            $pedido = null;
        }
        return $pedido;
    }

    public static function getPedidoQueueIndex($idDelivery, $idPedido)
    {
        $dao = new dbObject();
        $statement = $dao->connection->prepare("SELECT ped.* FROM pedidos ped WHERE status IN ('PEN','ENC') AND id_delivery = ? ORDER BY ped.order,ped.id_pedido;");
        $statement->bind_param("i", $idDelivery);
        $statement->execute();

        $result = $statement->get_result();
        $order = 1;
        while ($pedido = $result->fetch_array(MYSQLI_ASSOC)) {
            if ($pedido['numero_pedido_bocatti'] != $idPedido) {
                $order++;
            } else {
                break;
            }
        }
        return $order;
    }

    public static function removePedido($idPedido, $idLocal)
    {

        $newStatus = "DEL";

        $dao = new dbObject();
        $q = sprintf("UPDATE pedidos SET status = \"%s\" WHERE numero_pedido_bocatti =\"%s\" AND id_local=\"%s\";", $newStatus, $idPedido, $idLocal);
        if ($affectedRows = $dao->execute($q)) {


            WebStatusManager::updateStatus($idPedido, $newStatus);
        }
        return $affectedRows == 1;
    }

    public static function getPedidoStatus($idPedido, $idLocal)
    {

        $dao = new dbObject();
        $statement = $dao->connection->prepare("SELECT status FROM pedidos p WHERE numero_pedido_bocatti = ? AND id_local=?;");
        $statement->bind_param("ss", $idPedido, $idLocal);
        $statement->execute();

        $result = $statement->get_result();
        $pedido = $result->fetch_array(MYSQLI_ASSOC);
        if ($pedido) {
            return $pedido['status'];
        } else {
            return false;
        }
    }

    public function getPedido($idPedido, $idDelivery)
    {
        $pedidos = array();
        $dao = new dbObject();
        $statement = $dao->connection->prepare("SELECT * FROM pedidos p WHERE id_pedido = ? AND id_delivery = ?");

        $statement->bind_param("is", $idPedido, $idDelivery);
        $statement->execute();

        $result = $statement->get_result();
        while ($pedido = $result->fetch_array(MYSQLI_ASSOC)) {
            $content = $this->getPedidoContent($pedido['id_pedido']);
            $pedido['content'] = $content['content'];
            $pedido['llevaBebida'] = $content['llevaBebida'];
            $pedidos[] = $pedido;
        }
        return $pedidos;
    }

    public function getPedidoContent($idPedido)
    {
        $pc = array();
        $pc['content'] = null;
        $llevaBebida = false;

        $statement = $this->dao->connection->prepare("SELECT * FROM pedidos_contenido pc WHERE id_pedido = ?");

        $statement->bind_param("i", $idPedido);
        $statement->execute();

        $result = $statement->get_result();
        while ($pedidoContent = $result->fetch_array(MYSQLI_ASSOC)) {
            $pc['content'][] = $pedidoContent;
            $llevaBebida = $llevaBebida || $pedidoContent['es_bebida'];
        }
        $pc['llevaBebida'] = $llevaBebida;
        return $pc;
    }
}
