<?php

class Mensajeria_model extends Databases {

    protected $token = false;
    protected $tabla = "PNL_MENSAJES";

    public function enviar($datos) {

        $return = array('return' => FALSE, 'error' => "", 'id' => 0);

        if (!isset($datos['local']) || $datos['local'] === NULL) {
            $return['error'] = "Ingresar local";
        } elseif (!isset($datos['asunto']) || !$datos['asunto']) {
            $return['error'] = "Ingresar el asunto del mensaje";
        } elseif ($this->tabla == "PNL_MENSAJES" && (!isset($datos['cuerpo']) || !$datos['cuerpo'])) {
            $return['error'] = "Ingresar el cuerpo del mensaje";
        } elseif (!isset($datos['ID_usuario']) || $datos['ID_usuario'] === NULL) {
            $return['error'] = "Ingresar ID del usuario";
        } elseif (!isset($datos['respuesta_ID']) || $datos['respuesta_ID'] === NULL) {
            $return['error'] = "Ingresar el ID del mensaje a responder";
        } else {

            if ($datos['respuesta_ID']) {
                $datos['respuesta_ID'] = $this->getPrimerRespuestaMensaje($datos['respuesta_ID']);
            }

            $datos['fecha_recibido'] = date('Ymd H:i:s');
            if (isset($datos['destinatario']) && $datos['destinatario']) {
                $destinatarios = $datos['destinatario'];
                unset($datos['destinatario']);
            } else {
                $destinatarios = array('0');
            }

            if (parent::insert($this->tabla, $datos)) {
                $id = parent::query("SELECT TOP 1 ID FROM {$this->tabla} ORDER BY ID DESC");
                $id = $id[0]['ID'];

                foreach ($destinatarios as $destinatario) {
                    $destinatario = array(
                        'id_mensaje' => $id,
                        'destinatario' => $destinatario
                    );

                    parent::insert($this->tabla . '_DESTINATARIOS', $destinatario);
                }
                $return['return'] = TRUE;
                $return['id'] = $id;
            }
        }

        return $return;
    }

    public function getMensajes($idLocal = 0, $respuestaId = 0, $order_by = "fecha_recibido DESC") {
        $mensajes = $this->_getMensajes($idLocal, $respuestaId, $order_by);

        if ($mensajes) {
            // ordenar por fecha de recibido según mensajes reenviados o respondidos
            $_mensajes = array();

            foreach ($mensajes as $k => $item) {
                $recibido = strtotime($item['fecha_recibido']);
                if ($item['respuestas']) {
                    foreach ($item['respuestas'] as $sb_it) {
                        $_sb_recibido = strtotime($sb_it['fecha_recibido']);
                        if ($_sb_recibido > $recibido) {
                            $recibido = $_sb_recibido;
                        }
                    }
                }
                $_mensajes[$recibido + $k] = $item;
            }

            $mensajes = $_mensajes;
            krsort($mensajes);
        }

        $mensajes = array(
            'mensajes' => $mensajes
        );

        if ($idLocal == 0) {
            $mensajes['locales'] = $this->getLocales(0);
        }

        return $mensajes;
    }

    private function _getMensajes($idLocal = 0, $respuestaId = 0, $order_by = "fecha_recibido DESC") {

        $where = " WHERE respuesta_ID=$respuestaId ";

        if ($idLocal) {
            $where .= " AND (local=$idLocal OR destinatario=$idLocal) ";
        }
        
        $top = '';
        if ($this->tabla == 'PNL_MENSAJES_SISTEMA') {
            //$where .= " AND fecha_recibido > '" . date('Ymd H:i:s', strtotime(date('Y-m-d')) - (30 * 24 * 3600)) . "' "; //solo los últimos 45 días
            $top = " TOP 1000 ";
        }

        $sql = "SELECT $top ID, local, asunto, nombre_usuario, CONVERT(varchar(20), fecha_recibido, 20) AS fecha_recibido, nombre_usuario, cuerpo, respuesta_ID FROM {$this->tabla} WHERE ID IN (SELECT ID FROM {$this->tabla} m INNER JOIN {$this->tabla}_DESTINATARIOS d ON m.ID=d.id_mensaje $where GROUP BY ID) ORDER BY $order_by";

        $data = parent::query($sql);
        if ($data && count($data) > 0) {
            foreach ($data as $k => $v) {
                if ($this->tabla == 'PNL_MENSAJES_SISTEMA') {
                    $data[$k]['respuestas'] = 0;
                    $data[$k]['sin_leer'] = 0;
                } else {
                    $data[$k]['respuestas'] = $this->_getMensajes($idLocal, $v['ID'], $order_by);
                    $data[$k]['sin_leer'] = $this->countMensajesSinLeer($idLocal, $v['respuesta_ID']);
                }
                    
                $destinatarios = $this->getDestinatarios($v['ID'], $idLocal);
                if ($idLocal) {
                    $data[$k]['destinatario'] = $destinatarios[0]['destinatario'];
                    $data[$k]['fecha_leido'] = $destinatarios[0]['fecha_leido'];
                } else {
                    $data[$k]['destinatarios'] = $destinatarios;
                }
            }
            return $data;
        } else {
            return 0;
        }
    }

    public function getDestinatarios($idMensaje, $idLocal = 0) {

        $where = "";
        if ($idLocal) {
            $where = " AND (destinatario=0 ";
            if ($idLocal) {
                $where .= " OR destinatario=$idLocal";
            }
            $where .= ")";
        }

        if ($this->tabla == "PNL_MENSAJES_SISTEMA") {
            $respuesta = ", respuesta ";
        } else {
            $respuesta = "";
        }
        $sql = "SELECT destinatario, CONVERT(varchar(20), fecha_leido, 20) AS fecha_leido $respuesta FROM {$this->tabla}_DESTINATARIOS WHERE id_mensaje=$idMensaje $where";

        $data = parent::query($sql);
        if ($data && count($data) > 0) {
            return $data;
        } else {
            return 0;
        }
    }

    public function countMensajesSinLeer($idLocal = 0, $respuesta_ID = false) {
        $where = " AND destinatario=$idLocal ";

        if ($respuesta_ID) {
            $where.=" AND respuesta_ID=$respuesta_ID ";
        }

        $sql = "SELECT COUNT(ID) AS total FROM {$this->tabla} m INNER JOIN {$this->tabla}_DESTINATARIOS d ON m.ID=d.id_mensaje WHERE fecha_leido IS NULL $where";

        $data = parent::query($sql);
        if ($data && count($data) > 0) {
            return $data[0]['total'];
        } else {
            return 0;
        }
    }

    public function setLeido($idLocal, $idMensaje, $mensaje = FALSE) {
        $datos = array('fecha_leido' => date('Ymd H:i:s'));
        if ($mensaje) {
            $datos['respuesta'] = $mensaje;
        }

        if (parent::update($this->tabla . '_DESTINATARIOS', $datos, 'destinatario=' . $idLocal . ' AND id_mensaje=' . $idMensaje)) {
            return TRUE;
        }

        return FALSE;
    }

    public function getLocales($idLocal) {
        $sql = "SELECT NOM, COD FROM NOMBRE WHERE COD!=$idLocal ORDER BY COD ASC";

        $data = parent::query($sql);
        if ($data && count($data) > 0) {
            return $data;
        } else {
            return 0;
        }
    }

    public function getMensaje($idMensaje, $idLocal = 0) {
        $sql = "SELECT TOP 1 ID, local, asunto, nombre_usuario, cuerpo, CONVERT(varchar(20), fecha_recibido, 20) AS fecha_recibido, nombre_usuario FROM {$this->tabla} WHERE ID=$idMensaje ORDER BY fecha_recibido DESC";

        $data = parent::query($sql);
        if ($data && count($data) > 0) {
            $data = $data[0];
            $data['respuestas'] = $this->_getMensajes($idLocal, $data['ID'], "ID ASC");
            $destinatarios = $this->getDestinatarios($data['ID'], $idLocal);
            if ($idLocal) {
                $data['destinatario'] = $destinatarios[0]['destinatario'];
                $data['fecha_leido'] = $destinatarios[0]['fecha_leido'];
            } else {
                $data['destinatarios'] = $destinatarios;
            }


            return $data;
        } else {
            return 0;
        }
    }

    public function getMensajesByLocal($idLocal = 0) {

        $sql = "SELECT ID, local, asunto, nombre_usuario, CONVERT(varchar(20), fecha_recibido, 20) AS fecha_recibido, nombre_usuario, cuerpo FROM {$this->tabla} WHERE ID IN (SELECT ID FROM {$this->tabla} m INNER JOIN {$this->tabla}_DESTINATARIOS d ON m.ID=d.id_mensaje WHERE destinatario=$idLocal AND fecha_leido IS NULL GROUP BY ID)";

        $data = parent::query($sql);
        if ($data && count($data) > 0) {
            return $data;
        } else {
            return 0;
        }
    }

    public function getPrimerRespuestaMensaje($id) {
        $sql = "SELECT ID, respuesta_ID FROM {$this->tabla} WHERE ID=$id";

        $data = parent::query($sql);
        if ($data && count($data) > 0) {
            $data = $data[0];

            if ($data['respuesta_ID']) {
                return $this->getPrimerRespuestaMensaje($data['respuesta_ID']);
            }
            return $data['ID'];
        } else {
            return $id;
        }
    }

    public function enviarSistema($datos, $retroalim = FALSE) {
        $aux = $this->tabla;
        $this->tabla = "PNL_MENSAJES_SISTEMA";
        if($retroalim && isset($datos['cuerpo'])) {
            $respuesta = $datos['cuerpo'];
            unset($datos['cuerpo']); //se reserva para la respuesta
        } else {
            $retroalim = FALSE; //para retroalimentacion debe tener cuerpo el mensaje
        }
        $return = $this->enviar($datos);

        if ($retroalim && $return['return']) {
            $datos = array(
                'local' => 0,
                'asunto' => 'Re: '.$datos['asunto'],
                'cuerpo' => $respuesta,
                'respuesta_ID' => $return['id'],
                'ID_usuario' => '0',
                'nombre_usuario' => 'sistema',
                'destinatario' => array($datos['local']),
                'fecha_generado' => date('Ymd H:i:s')
            );
            $this->enviar($datos);
        }
        $this->tabla = $aux;

        return $return;
    }

    public function getMensajesSistema($idLocal = 0, $respuestaId = 0, $order_by = "fecha_recibido DESC") {
        $aux = $this->tabla;
        $this->tabla = "PNL_MENSAJES_SISTEMA";
        $return = $this->getMensajes($idLocal, $respuestaId, $order_by);
        $this->tabla = $aux;

        return $return;
    }

    public function getDestinatariosSistema($idMensaje, $idLocal = 0) {
        $aux = $this->tabla;
        $this->tabla = "PNL_MENSAJES_SISTEMA";
        $return = $this->getDestinatarios($idMensaje, $idLocal);
        $this->tabla = $aux;

        return $return;
    }

    public function countMensajesSinLeerSistema($idLocal = 0, $respuesta_ID = false) {
        $aux = $this->tabla;
        $this->tabla = "PNL_MENSAJES_SISTEMA";
        $return = $this->countMensajesSinLeer($idLocal, $respuesta_ID);
        $this->tabla = $aux;

        return $return;
    }

    public function getMensajeSistema($idMensaje, $idLocal = 0) {
        $aux = $this->tabla;
        $this->tabla = "PNL_MENSAJES_SISTEMA";
        $return = $this->getMensaje($idMensaje, $idLocal);
        $this->tabla = $aux;

        return $return;
    }

    public function getPrimerRespuestaMensajeSistema($id) {
        $aux = $this->tabla;
        $this->tabla = "PNL_MENSAJES_SISTEMA";
        $return = $this->getPrimerRespuestaMensaje($id);
        $this->tabla = $aux;

        return $return;
    }

    public function getMensajesByLocalSistema($idLocal = 0) {
        $sql = "SELECT m.ID, m.asunto, m.cuerpo, c.comando, c.tipo FROM PNL_MENSAJES_SISTEMA m  LEFT JOIN PNL_MENSAJES_SISTEMA_COMANDOS c ON (m.comando_id!=0 AND m.asunto=c.nombre) WHERE m.ID IN (SELECT ID FROM PNL_MENSAJES_SISTEMA m INNER JOIN PNL_MENSAJES_SISTEMA_DESTINATARIOS d ON m.ID=d.id_mensaje WHERE destinatario=$idLocal AND fecha_leido IS NULL GROUP BY ID)";

        $data = parent::query($sql);
        if ($data && count($data) > 0) {
            return $data;
        } else {
            return 0;
        }

        return $return;
    }

    public function setLeidoSistema($idLocal, $idMensaje, $mensaje = false) {
        $aux = $this->tabla;
        $this->tabla = "PNL_MENSAJES_SISTEMA";
        $return = $this->setLeido($idLocal, $idMensaje, $mensaje);
        $this->tabla = $aux;

        return $return;
    }

    public function getComandos() {
        $sql = "SELECT * FROM PNL_MENSAJES_SISTEMA_COMANDOS";

        $data = parent::query($sql);
        if ($data && count($data) > 0) {
            return $data;
        } else {
            return FALSE;
        }
    }

    public function getComando($id) {
        if ($id) {
            $sql = "SELECT TOP 1 * FROM PNL_MENSAJES_SISTEMA_COMANDOS WHERE id=$id";

            $data = parent::query($sql);
            if ($data && count($data) > 0) {
                return $data[0];
            }
        }
        return FALSE;
    }

    public function getComandoByName($nombre, $id) {
        $sql = "SELECT * FROM PNL_MENSAJES_SISTEMA_COMANDOS WHERE nombre LIKE '$nombre'";
        if ($id) {
            $sql .= " AND id!=$id";
        }

        $data = parent::query($sql);
        if ($data && count($data) > 0) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    public function updateComando($id, $datos) {
        if ($id) {
            if (parent::update('PNL_MENSAJES_SISTEMA_COMANDOS', $datos, 'id=' . $id)) {
                return TRUE;
            }
        } else {
            if (parent::insert('PNL_MENSAJES_SISTEMA_COMANDOS', $datos)) {
                return TRUE;
            }
        }

        return FALSE;
    }

    public function removeComando($id) {
        if (parent::delete('PNL_MENSAJES_SISTEMA_COMANDOS', "id='$id'")) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

}

?>