# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.storage.jsonstore import JsonStore
from kivy.uix.listview import ListItemButton, ListItemLabel, ListView
from kivy.adapters.simplelistadapter import SimpleListAdapter
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.popup import Popup
from kivy.uix.textinput import TextInput

from kivy.core.window import Window

from kivy.clock import Clock
from kivy.network.urlrequest import UrlRequest
from kivy.config import Config

from urllib2 import Request, urlopen, URLError, HTTPError
from functools import partial

from kivy.properties import ObjectProperty

import codecs
from os import path
from os import remove
import os
import json
import random
import threading
import socket
import urllib
import time

'''
T O D O
=======

- Alta de Parte (desde hab y desde SSTT)

'''


# Globales de configuración

version="1.21"
idEDF = 0
nomEDF = ""
sFechaHoraHab = ""
sFechaHoraPartes = ""
gl_password = 0
gl_clave = ""
gl_perfil = ""
gl_subgober = 0
gl_modotest = 1
gl_tip_partes = ""
modo = 1
devuelve = ""
ocultar = ""

url_ghot = 'http://pms.hotelesglobales.com/ghot/api/api.php?'
url_app = 'http://pms.hotelesglobales.com/app'

color_f = (0.3, 0.2, 0.6, 1)
color_sucia = (1, 0.0, 0.0, 1)
color_limpia = (24/255.0, 219/255.0, 74/255.0, 1)
color_bloqueada = (0, 0.5, 1, 1)
color_boton_actualizar = (0.957, 0.0, 0.6, 1)
color_error = (0.957, 0.0, 0.0, 1)
color_asignada = (128/255.0, 255/255.0, 0/255.0, 1)
color_gris = (0.572, 0.572, 0.572, 1)
color_amarillo = (0.847, 0.866, 0.239, 1)
color_letra = (0,0,0,1)

store_ListaHabs = JsonStore('lista_habitaciones.json')
lista_Habitaciones = list((x[1] for x in sorted(store_ListaHabs)))

store = JsonStore('habitaciones.json')
data = list((x[1] for x in sorted(store.find(ES_HAB='S'))))

#
storePartes = JsonStore('partes.json')
partes = list((x[1] for x in sorted(storePartes.find(ES_ITEM='S'))))

tip_bus = 'T'
tip_bus_partes = 'T'

def cuantos(iterable):
    try:
        return iterable.__len__()
    except AttributeError:
        return int(sum(1 for _ in iterable))


#-------------------------------------------------------
# Cola de envíos
#-------------------------------------------------------

def poner_en_cola_Sent(contenido):
    # Primero verifico si ya existe la Carpeta Sent
    if os.path.exists('Sent'):
        pass
    else:
        os.mkdir('Sent')
    # Generar archivo con nombre Random con el contenido
    nom = random.randint(1, 99999999999)
    path = 'Sent/' + str(nom)
    # Falta ver si ya existe
    f = open(path, 'w')
    f.write(str(contenido))
    f.close()


def Hab_AC(index, data_item):
    global color_letra

    store = JsonStore('conf.json')
    modo = store.get('modo')

    if modo == 1:
        color_letra = (0,0,0,1)
    else:
        color_letra = (1,1,1,1)

    item = data_item
    eos_val = list("---")
    hora_val = ""
    bloq = item['BLOQ']
    if item['SAL'] > 0:
        eos_val[0] = "S"
        hora_val = item['HSAL']
    if item['ENT'] == 1:
        eos_val[2] = "E"
        hora_val = hora_val + " " + item['HENT']
    if item['OCU'] == 1:
        eos_val[1] = "O"
    if item['ESTADO'] == 'Limpia':
        text_but = item['ID']
        bg_color = color_limpia
    else:
        text_but = item['ID']
        bg_color = color_sucia

    if item['BLOQ'] == 0:
        eos_val = "BLO"
        text_but = item['ID']
        bg_color = color_bloqueada

    r_vip = {'cls': VIPLabel, 'kwargs': {'text': item['VIP']}}

    # Si está libre muestro en zona VIP los días sin ocupar
    if item['DLIB'] > 0:
        dias_vacia = item['DLIB'] - 1
        r_vip = {'cls': VIPLabel, 'kwargs': {'text': "Libre: " + str(dias_vacia) + 'd', 'color': color_error}}

    # Si es salida y Tiene guarda, uso el la zona vip para indicarlo
    if item['SAL'] != 0:
        if item['GUARDA'] == 1:
            r_vip = {'cls': VIPLabel, 'kwargs': {'text': "GUARDA", 'color': color_error}}

    # Si ya ha salido, uso el la zona vip para indicarlo
    if item['SAL'] == 2:
        r_vip = {'cls': VIPLabel, 'kwargs': {'text': "OUT", 'color': color_error}}

    # Si es MEDIA y no han salido las dos
    if item['SAL'] == 3:
        r_vip = {'cls': VIPLabel, 'kwargs': {'text': "MEDIA", 'color': color_error}}

    #
    r_eos = {'cls': EOSLabel, 'kwargs': {'color':color_letra,'text': ''.join(eos_val)}}
    r_hora = {'cls': HoraLabel, 'kwargs': {'color':color_letra,'text': hora_val}}
    r_gober = {'cls': GoberLabel, 'kwargs': {'color':color_letra,'text': str(item['GGOB'])}}
    r_pax = {'cls': PaxLabel, 'kwargs': {'color':color_letra,'text': item['PAX']}}
    r_button = {'cls': HabButton, 'kwargs': {'num': item['ID'], 'text': text_but, 'estado': item['ESTADO'],
        'emp': item['EMP'],'cnt': item['CNT'],'background_normal': '','selected_color': bg_color,'deselected_color': bg_color, 'bloq': bloq,
                         'ggob': item['GGOB'], 'vip': item['VIP'], 'extras': item['EXTRAS'], 'obs': item['OBS']}}
    return {'size_hint_y': None, 'height': '60dp', 'cls_dicts' : (r_button, r_gober, r_eos, r_hora, r_pax, r_vip)}

def Partes_AC(index, data_item):
    global color_letra

    store = JsonStore('conf.json')
    modo = store.get('modo')

    if modo == 1:
        color_letra = (0,0,0,1)
    else:
        color_letra = (1,1,1,1)
    item = data_item
    urgente = ""
    if item['URG'] == "1":
        urgente = "Urgente"
    if item['CRI'] == "1":
        urgente = "Crítico"
    bg_color = color_limpia
    if item['ESTADO'] == "A":
        bg_color = color_sucia
    if item['ESTADO'] == "E":
        bg_color = color_bloqueada
    if item['ASIGNADO_A'] != "0":
        r_tipo = {'cls': Parte_Tipo, 'kwargs': {'text': ''+str(item['ASIGNADO_A'])+"-"+item['TIP_PART_NAME'],
                                                'color': color_asignada}}
    else:
        r_tipo = {'cls': Parte_Tipo, 'kwargs': {'color':color_letra,'text': ''.join(item['TIP_PART_NAME'])}}
    r_aper = {'cls': Parte_Apertura, 'kwargs': {'color':color_letra,'text': item['FCH_APE'][0:5] + ' ' + item['HOR_APE']}}
    r_urgente = {'cls': Parte_Urgente, 'kwargs': {'color':color_letra,'text': urgente}}
    r_button = {'cls': Parte_Button, 'kwargs': {'num': item['ID'], 'text': item['HAB'] + item['ZON_COM'][0:12],'background_normal': '',
        'selected_color': bg_color,'deselected_color': bg_color, 'estado': item['ESTADO'],
        'hab': item['HAB'],'zona': item['ZON_COM'], 'tip': item['TIP_PART_NAME'],
        'desc': item['DESC'],'fape': item['FCH_APE'],'hape': item['HOR_APE'],'urgente': item['URG'],
        'critico': item['CRI'],'obs': item['OBS'],'motesp': item['MOT_ESP'],'diasesp': item['DIAS_ESP'],
        'asignado_a': item['ASIGNADO_A']}}
    return {'size_hint_y':None,'height':'62dp', 'spacing': 5,
            'cls_dicts' : (r_button, r_tipo, r_aper, r_urgente)}


#________________________________________________________
#________________________________________________________
# C L A S E S
#________________________________________________________
#________________________________________________________

class HabButton(ListItemButton):
    num = ObjectProperty()
    estado = ObjectProperty()
    emp = ObjectProperty()
    cnt = ObjectProperty()
    bloq = ObjectProperty()
    ggob = ObjectProperty()
    extras = ObjectProperty()
    vip = ObjectProperty()
    obs = ObjectProperty()

class EOSLabel(ListItemLabel):
    pass

class PaxLabel(ListItemLabel):
    pass

class VIPLabel(ListItemLabel):
    pass

class HoraLabel(ListItemLabel):
    pass

class GoberLabel(ListItemLabel):
    pass

class LimpSucButton(Button):
    emp = ObjectProperty()
    cnt = ObjectProperty()
    num = ObjectProperty()
    estado = ObjectProperty()
    bloq = ObjectProperty()

class Bt_cambia_rango(Button):
    emp = ObjectProperty()
    cnt = ObjectProperty()
    num = ObjectProperty()
    ggob = ObjectProperty()

class Bt_obs_gober(Button):
    emp = ObjectProperty()
    cnt = ObjectProperty()
    num = ObjectProperty()

class ExtrasListView(ListView):
    pass

class ExtrasLabel(ListItemLabel):
    pass

class Hab_PopUp(BoxLayout):
    pass

#==================================== Clases elementos Partes
class Parte_Button(ListItemButton):
    num = ObjectProperty()
    tip = ObjectProperty()
    estado = ObjectProperty()
    hab = ObjectProperty()
    zona = ObjectProperty()
    desc = ObjectProperty()
    fape = ObjectProperty()
    hape = ObjectProperty()
    urgente = ObjectProperty()
    critico = ObjectProperty()
    obs = ObjectProperty()
    motesp = ObjectProperty()
    diasesp = ObjectProperty()
    asignado_a = ObjectProperty()

class Parte_Tipo(ListItemLabel):
    pass

class Parte_Apertura(ListItemLabel):
    pass

class Parte_Urgente(ListItemLabel):
    pass

class Parte_PopUp(BoxLayout):
    # A -> Alta
    # M -> Modificación
    AltaMod = ObjectProperty()
    NuevoEstado = ObjectProperty()
    pass

class ConfCierre_PopUp(BoxLayout):
    pass

class Parte_Acc_Button(Button):
    num = ObjectProperty()
    estado = ObjectProperty()
    nuevo_estado = ObjectProperty()
    len_hz = ObjectProperty()

class Parte_Esp_Button(Button):
    num = ObjectProperty()
    nuevo_estado = ObjectProperty()

class Parte_Asignarme_Button(Button):
    num = ObjectProperty()

#======================================================================================================================
#
#======================================================================================================================

class PantallaRoot(BoxLayout):
    search_input_hab = ObjectProperty()
    search_input_rango = ObjectProperty()
    search_results = ObjectProperty()
    partes_solo_abiertos = ObjectProperty()
    partes_ver_espera = ObjectProperty()
    ordenar_habitacion = ObjectProperty()
    opciones_hab = ObjectProperty()
    opciones_hab2 = ObjectProperty()
    ordenar_por_hora = ObjectProperty()
    opcion1 = ObjectProperty()
    opcion2 = ObjectProperty()
    opcion3 = ObjectProperty()

    popup_Hab = Popup()
    PU_confirmar = Popup()
    PU_ConfCierre = Popup()
    Info_Parte = Parte_PopUp()

    def carga_nomEDF(self):
        return nomEDF + "  -  " + sFechaHoraHab

    def poner_en_cola_Sent(self, contenido):
        # Primero verifico si ya existe la Carpeta Sent
        if os.path.exists('Sent'):
            pass
        else:
            os.mkdir('Sent')
        # Generar archivo con nombre Random con el contenido
        nom = random.randint(1, 99999999999)
        path = 'Sent/' + str(nom)
        # Falta ver si ya existe
        f = open(path, 'w')
        f.write(str(contenido))
        f.close()
        self.actualiza_contador_cola_Hab()

    def actualiza_contador_cola_Hab(self):
        if os.path.exists('Sent'):
            contadorcola = str(len(os.listdir('Sent')))
        else:
            contadorcola = "0"
        self.ids.contadorcola_box.text = "Envíos: " + str(contadorcola)

    def acc_limp_suc_accion(self, i):
        if i.bloq == 0:
            # Bloqueada. No hago nada
            return

        if i.estado == "Sucia":
            url = url_ghot + 'vars=clave:' + str(gl_clave) + '@acc:hab_estado_mod@emp:' + str(i.emp) + '@cnt:' + str(
                i.cnt) + '@id:' + \
                  str(i.num) + '@estado:L'
            i.estado = "Limpia"
        else:
            url = url_ghot + 'vars=clave:' + str(gl_clave) + '@acc:hab_estado_mod@emp:' + str(i.emp) + '@cnt:' + str(
                i.cnt) + '@id:' + \
                  str(i.num) + '@estado:S'
            i.estado = "Sucia"
        # Marco el JSON
        store = JsonStore('habitaciones.json')
        m = store.get(i.num)
        store.put(i.num, EMP=m['EMP'], CNT=m['CNT'], EDF=m['EDF'], ID=m['ID'], ESTADO=i.estado, GUARDA=m['GUARDA'],
                  OCU=m['OCU'], BLOQ=m['BLOQ'], ENT=m['ENT'], SAL=m['SAL'], GGOB=m['GGOB'], RET=m['RET'],
                  HENT=m['HENT'], HSAL=m['HSAL'], PAX=m['PAX'], VIP=m['VIP'], EXTRAS=m['EXTRAS'], DLIB=m['DLIB'],
                  OBS=m['OBS'], ES_HAB=m['ES_HAB'])

        self.poner_en_cola_Sent(url)
        global data
        data = list((x[1] for x in sorted(store.find(ES_HAB='S'))))
        self.rebuscar()
        self.popup_Hab.dismiss()

    def popup_hab(self, i):
        if gl_perfil == "SSTT":
            return
        bl_content = BoxLayout()
        bl_content.orientation = 'vertical'
        bl_content.padding = 10
        bl_content.spacing = 10

        m_pop = Hab_PopUp()

        m_pop.ids.TI_Rango.text = str(i.ggob)

        m_pop.ids.Bt_Cambia_Rango.emp = i.emp
        m_pop.ids.Bt_Cambia_Rango.cnt = i.cnt
        m_pop.ids.Bt_Cambia_Rango.num = i.num
        m_pop.ids.Bt_Cambia_Rango.ggob = i.ggob

        m_pop.ids.P_B_Obs_Gober.emp = i.emp
        m_pop.ids.P_B_Obs_Gober.cnt = i.cnt
        m_pop.ids.P_B_Obs_Gober.num = i.num


        if len(i.vip):
            m_pop.ids.Lab_Tratamiento.text = 'Tratamiento:  ' + i.vip
        else:
            m_pop.ids.Lab_Tratamiento.text = 'Tratamiento:  ' + 'NORMAL'

        if len(i.extras):
            # El height que paso es para cada fila del LisView
            args_converter = lambda row_index, rec: {'text': rec, 'size_hint_y': None, 'height': '35dp'}
            sla = SimpleListAdapter(data=i.extras, cls=ExtrasLabel, args_converter=args_converter)
            m_pop.ids.ExtrasListView.adapter = sla

        # Botón Limpiar / Sucia
        m_pop.ids.H_Boton.emp = i.emp
        m_pop.ids.H_Boton.cnt = i.cnt
        m_pop.ids.H_Boton.num = i.num
        m_pop.ids.H_Boton.estado = i.estado
        m_pop.ids.H_Boton.bloq = i.bloq
        if i.estado == 'Limpia':
            m_pop.ids.H_Boton.text = "Marcar como SUCIA"
            m_pop.ids.H_Boton.background_normal = ''
            m_pop.ids.H_Boton.background_color = color_sucia
        else:
            m_pop.ids.H_Boton.text = "Marcar como LIMPIA"
            m_pop.ids.H_Boton.background_normal = ''
            m_pop.ids.H_Boton.background_color = color_limpia
        if i.bloq == 0:
            m_pop.ids.H_Boton.text = "BLOQUEADA"
            m_pop.ids.H_Boton.background_color = color_bloqueada
            m_pop.ids.H_Boton.disabled = True
            m_pop.ids.H_Boton.disabled_color = color_bloqueada

        s_alfa = i.obs
        m_pop.ids.text_ObsGober.text = s_alfa.replace("#n#", "\n")

        bl_content.add_widget(m_pop)
        self.popup_Hab.title = u'Habitación: ' + i.num
        self.popup_Hab.content = bl_content
        # open the popup
        self.popup_Hab.open()

    def cambia_rango(self, i, nuevo):
        url = url_ghot + 'vars=clave:' + str(gl_clave) + '@acc:hab_rango_mod@emp:' + str(i.emp) + '@cnt:' + str(
            i.cnt) + '@id:' + \
              str(i.num) + '@ggob:' + nuevo.text
        self.poner_en_cola_Sent(url)
        # Marco el JSON
        store = JsonStore('habitaciones.json')
        m = store.get(i.num)
        store.put(i.num, EMP=m['EMP'], CNT=m['CNT'], EDF=m['EDF'], ID=m['ID'], ESTADO=m['ESTADO'], GUARDA=m['GUARDA'],
                  OCU=m['OCU'], BLOQ=m['BLOQ'], ENT=m['ENT'], SAL=m['SAL'], GGOB=nuevo.text, RET=m['RET'],
                  HENT=m['HENT'], HSAL=m['HSAL'], PAX=m['PAX'], VIP=m['VIP'], EXTRAS=m['EXTRAS'], DLIB=m['DLIB'],
                  OBS=m['OBS'], ES_HAB=m['ES_HAB'])
        global data
        data = list((x[1] for x in sorted(store.find(ES_HAB='S'))))
        self.rebuscar()
        self.popup_Hab.dismiss()

    def Reset_Rangos(self):
        self.PU_confirmar.title = u'Confirmar'
        bl_content = BoxLayout()
        bl_content.orientation = 'vertical'
        bl_content.padding = [10,10,10,10]
        #
        lab = Label(text='Confirmar')
        lab.font_size = '32dp'
        lab.color = color_error
        bl_content.add_widget(lab)
        #
        lab = Label(text='¿Quiere resetear los Rangos?')
        lab.font_size = '24dp'
        lab.color = color_error
        bl_content.add_widget(lab)
        #
        lab = Label(text='Deberá Actualizar Datos')
        lab.font_size = '20dp'
        lab.color = color_bloqueada
        bl_content.add_widget(lab)
        #
        bl_prompt = BoxLayout()
        bl_prompt.spacing = 20
        #
        bt = Button(text='Salir')
        bt.size_hint = None, None
        bt.height = "60dp"
        bt.width = "120dp"
        bt.font_size = '22dp'
        bt.bold = True
        bl_prompt.add_widget(bt)
        bt.bind(on_press=self.PU_confirmar.dismiss)
        #
        btok = Button(text='Resetear')
        btok.size_hint = 0.6, None
        btok.height = "60dp"
        btok.width = "120dp"
        btok.font_size = '22dp'
        btok.bold = True
        btok.background_color = color_boton_actualizar
        bl_prompt.add_widget(btok)
        btok.bind(on_press=self.Reset_Rangos_OK)
        #
        bl_content.add_widget(bl_prompt)
        #
        self.PU_confirmar.content = bl_content
        self.PU_confirmar.open()
        return

    def Reset_Rangos_OK(self, i):
        url = url_ghot + 'vars=clave:' + str(gl_clave) + '@acc:hab_rango_reset@edf:' + str(idEDF)
        self.poner_en_cola_Sent(url)
        self.PU_confirmar.dismiss()



    def Obs_Gober_enviar(self, i, Hab):
        unicObs = urllib.quote(Hab.ids.text_ObsGober.text.encode('utf-8'))
        url = url_ghot + 'vars=clave:' + str(gl_clave) + '@acc:hab_obs_gober_mod@emp:' + str(i.emp) + '@cnt:' + str(
            i.cnt) + '@id:' + \
              str(i.num) + '@obs:' + unicObs
        self.poner_en_cola_Sent(url)
        # Marco el JSON
        store = JsonStore('habitaciones.json')
        m = store.get(i.num)
        store.put(i.num, EMP=m['EMP'], CNT=m['CNT'], EDF=m['EDF'], ID=m['ID'], ESTADO=m['ESTADO'], GUARDA=m['GUARDA'],
                  OCU=m['OCU'], BLOQ=m['BLOQ'], ENT=m['ENT'], SAL=m['SAL'], GGOB=m['GGOB'], RET=m['RET'],
                  HENT=m['HENT'], HSAL=m['HSAL'], PAX=m['PAX'], VIP=m['VIP'], EXTRAS=m['EXTRAS'], DLIB=m['DLIB'],
                  OBS=Hab.ids.text_ObsGober.text, ES_HAB=m['ES_HAB'])
        global data
        data = list((x[1] for x in sorted(store.find(ES_HAB='S'))))
        self.rebuscar()
        self.popup_Hab.dismiss()

# ======================================================================================================================
    def search_quita_espacios(self):
        self.search_input_hab.text = self.search_input_hab.text.replace(' ', '')
        self.search_input_rango.text = self.search_input_rango.text.replace(' ', '')

    def boton_estado_actu(self):
        global tip_bus
        if tip_bus == "T":
            self.ids.bt_todas.state = 'down'
            self.ids.bt_clientes.state = 'normal'
            self.ids.bt_entran.state = 'normal'
            self.ids.bt_salen.state = 'normal'
            self.ids.bt_libres.state = 'normal'
        elif tip_bus == "C":
            self.ids.bt_todas.state = 'normal'
            self.ids.bt_clientes.state = 'down'
            self.ids.bt_entran.state = 'normal'
            self.ids.bt_salen.state = 'normal'
            self.ids.bt_libres.state = 'normal'
        elif tip_bus == "E":
            self.ids.bt_todas.state = 'normal'
            self.ids.bt_clientes.state = 'normal'
            self.ids.bt_entran.state = 'down'
            self.ids.bt_salen.state = 'normal'
            self.ids.bt_libres.state = 'normal'
        elif tip_bus == "S":
            self.ids.bt_todas.state = 'normal'
            self.ids.bt_clientes.state = 'normal'
            self.ids.bt_entran.state = 'normal'
            self.ids.bt_salen.state = 'down'
            self.ids.bt_libres.state = 'normal'
        elif tip_bus == "L":
            self.ids.bt_todas.state = 'normal'
            self.ids.bt_clientes.state = 'normal'
            self.ids.bt_entran.state = 'normal'
            self.ids.bt_salen.state = 'normal'
            self.ids.bt_libres.state = 'down'

    def sort_by_hent(self, d):
        return d['HENT']

    def sort_by_hsal(self, d):
        return d['HSAL']

    def rebuscar(self):
        global tip_bus
        if tip_bus == "T":
            self.search_todas()
        elif tip_bus == "C":
            self.search_clientes()
        elif tip_bus == "E":
            self.search_entran()
        elif tip_bus == "S":
            self.search_salen()
        elif tip_bus == "L":
            self.search_libres()


    def search_todas(self):
        global tip_bus
        global habitaciones
        tip_bus = 'T'
        self.opciones_hab.opacity = 0
        self.opciones_hab2.opacity = 0
        self.ids.ordenar_habitacion.disabled = True
        self.ids.ordenar_por_hora.disabled = True
        self.opcion1.opacity = 0
        self.opcion2.opacity = 0
        self.opcion3.opacity = 0
        self.search_quita_espacios()
        if len(self.search_input_hab.text):
            habitaciones = [(d) for d in data if
                            str(d['ID']).lower().startswith(str(self.search_input_hab.text).lower())]
        elif len(self.search_input_rango.text):
            habitaciones = [(d) for d in data if str(d['GGOB']) == self.search_input_rango.text]
        else:
            habitaciones = [(d) for d in data]
        self.muestra_habs(habitaciones)

    def search_clientes(self):
        global tip_bus
        global habitaciones
        tip_bus = 'C'
        self.opciones_hab.opacity = 0
        self.opciones_hab2.opacity = 0
        self.ids.ordenar_habitacion.disabled = True
        self.ids.ordenar_por_hora.disabled = True
        self.opcion1.opacity = 0
        self.opcion2.opacity = 0
        self.opcion3.opacity = 0
        self.search_quita_espacios()
        if len(self.search_input_hab.text):
            habitaciones = [(d) for d in data if d['OCU'] == 1 and
                            str(d['ID']).lower().startswith(str(self.search_input_hab.text).lower())]
        elif len(self.search_input_rango.text):
            habitaciones = [(d) for d in data if d['OCU'] == 1 and
                            str(d['GGOB']) == self.search_input_rango.text]
        else:
            habitaciones = [(d) for d in data if d['OCU'] == 1]
        self.muestra_habs(habitaciones)
    def search_entran(self):
        global tip_bus
        global habitaciones
        tip_bus = 'E'
        self.opciones_hab.opacity = 1
        self.opciones_hab2.opacity = 1
        self.ordenar_habitacion.disabled = False
        self.ordenar_por_hora.disabled = False
        self.opcion1.opacity = 1
        self.opcion2.opacity = 1
        self.opcion3.opacity = 1
        self.search_quita_espacios()
        if len(self.search_input_hab.text):
            habitaciones = [(d) for d in data if d['ENT'] == 1 and
                            str(d['ID']).lower().startswith(str(self.search_input_hab.text).lower())]
        elif len(self.search_input_rango.text):
            habitaciones = [(d) for d in data if d['ENT'] == 1 and
                            str(d['GGOB']) == self.search_input_rango.text]
        else:
            habitaciones = [(d) for d in data if d['ENT'] == 1]
        if self.ordenar_habitacion.active == True:
            self.muestra_habs(habitaciones)
        else:
            self.muestra_habs(sorted(habitaciones,key=self.sort_by_hent))

    def search_salen(self):
        global tip_bus
        global habitaciones
        tip_bus = 'S'
        self.opciones_hab.opacity = 1
        self.opciones_hab2.opacity = 1
        self.ordenar_habitacion.disabled = False
        self.ordenar_por_hora.disabled = False
        self.opcion1.opacity = 1
        self.opcion2.opacity = 1
        self.opcion3.opacity = 1
        self.search_quita_espacios()
        if len(self.search_input_hab.text):
            habitaciones = [(d) for d in data if d['SAL'] > 0 and
                            str(d['ID']).lower().startswith(str(self.search_input_hab.text).lower())]
        elif len(self.search_input_rango.text):
            habitaciones = [(d) for d in data if d['SAL'] > 0 and
                            str(d['GGOB']) == self.search_input_rango.text]
        else:
            habitaciones = [(d) for d in data if d['SAL'] > 0]
        if self.ordenar_habitacion.active == True:
            self.muestra_habs(habitaciones)
        else:
            self.muestra_habs(sorted(habitaciones,key=self.sort_by_hent))

    def search_libres(self):
        global tip_bus
        global habitaciones
        tip_bus = 'L'
        self.opciones_hab.opacity = 0
        self.opciones_hab2.opacity = 0
        self.ids.ordenar_habitacion.disabled = True
        self.ids.ordenar_por_hora.disabled = True
        self.opcion1.opacity = 0
        self.opcion2.opacity = 0
        self.opcion3.opacity = 0
        self.search_quita_espacios()
        if len(self.search_input_hab.text):
            habitaciones = [(d) for d in data if d['DLIB'] > 0 and
                            str(d['ID']).lower().startswith(str(self.search_input_hab.text).lower())]
        elif len(self.search_input_rango.text):
            habitaciones = [(d) for d in data if d['DLIB'] > 0 and
                            str(d['GGOB']) == self.search_input_rango.text]
        else:
            habitaciones = [(d) for d in data if d['DLIB'] > 0]
        self.muestra_habs(habitaciones)
    def muestra_habs(self, habitaciones):
        self.search_results.item_strings = str(habitaciones)
        del self.search_results.adapter.data[:]
        self.search_results.adapter.data.extend(habitaciones)
        self.search_results._trigger_reset_populate()

        self.boton_estado_actu()

# ------------------------------------------------------------------------------------
# -- FUNCIONES de PARTES
# ------------------------------------------------------------------------------------
    def boton_estado_partes_actu(self):
        pass

    def sort_by_hab(self, d):
        return d['HAB']

    def muestra_partes(self, lista):
        lista = sorted(lista, key=self.sort_by_hab)
        # Filtro ver Sólo Abiertos
        if self.partes_solo_abiertos.active == True:
            lista_partes = [(d) for d in lista if d['ESTADO'] != "C"]
        else:
            lista_partes = lista
        # Filtro ver En Espera
        if self.partes_ver_espera.active == False:
            lista_filtrada = [(d) for d in lista_partes if d['ESTADO'] != "E"]
        else:
            lista_filtrada = lista_partes
        self.partes_results.item_strings = lista_filtrada
        del self.partes_results.adapter.data[:]
        self.partes_results.container.spacing = 4
        self.partes_results.container.padding = 2
        self.partes_results.adapter.data.extend(lista_filtrada)
        self.partes_results._trigger_reset_populate()
        self.boton_estado_partes_actu()
        # Contador partes
        abiertos = 0
        for item in lista_partes:
            if item['ESTADO'] == "A":
                abiertos = abiertos +1
        self.ids.atb_Partes.text = "Partes (" + str(abiertos) + ")"
    #
    def cambia_check_solo_abiertos(self):
        storePartes = JsonStore('partes.json')
        partes = list((x[1] for x in sorted(storePartes.find(ES_ITEM='S'))))
        self.muestra_partes(partes)
    def cambia_check_ordenar_por_habitacion(self):
        global tip_bus
        global habitaciones
        if self.ordenar_habitacion.active == True:
            self.muestra_habs(habitaciones)
        else:
            self.muestra_habs(sorted(habitaciones,key=self.sort_by_hent))
    def cambia_check_en_espera(self):
        storePartes = JsonStore('partes.json')
        partes = list((x[1] for x in sorted(storePartes.find(ES_ITEM='S'))))
        self.muestra_partes(partes)


    def popup_Parte(self, i):
        bl_content = BoxLayout()
        bl_content.orientation = 'vertical'
        bl_content.padding = 2
        bl_content.spacing = 10

        m_pop = Parte_PopUp()
        m_pop.AltaMod = "M"

        # Ocultamos check y texto de Avisarme al cerrar.
        m_pop.ids.partes_avisar_al_cerrar.opacity = 0
        m_pop.ids.partes_avisar_al_cerrar.disabled = True
        m_pop.ids.lb_partes_avisar_al_cerrar.opacity = 0

        m_pop.ids.P_1_1.text = 'Zona/Hab:'
        m_pop.ids.P_1_2.text = i.zona
        m_pop.ids.P_1_3.text = str(i.hab)
        #
        m_pop.ids.P_2_1.text = 'Tipo Parte:'
        m_pop.ids.P_2_2.text = i.tip
        #
        m_pop.ids.P_2_2.values = gl_tip_partes
        #
        m_pop.ids.P_3_1.text = 'Apertura.:'
        m_pop.ids.P_3_2.text = str(i.fape)
        m_pop.ids.P_3_3.text = i.hape
        #
        m_texto = ''
        if i.urgente == "1":
            m_texto = 'URGENTE'
        if i.critico == "1":
            m_texto = m_texto + " " + 'CRITICO'
        m_pop.ids.P_2_3.text = m_texto
        m_pop.ids.P_2_3.color = color_error
        #
        m_pop.ids.P_Desc.text = i.desc
        #
        s_alfa = i.obs
        m_pop.ids.P_Obs.text = s_alfa.replace("#n#", "\n")
        #
        m_pop.ids.P_B_Espera.num = i.num
        m_pop.ids.P_B_Espera.nuevo_estado = "E"
        s_alfa = i.motesp
        m_pop.ids.P_MotEsp.text = s_alfa.replace("#n#", "\n")
        m_pop.ids.P_DiasEspera.text = i.diasesp
        #
        m_pop.ids.P_Boton_Asignarme.num = i.num
        m_pop.ids.P_asigando_a.text = "Asignado a: "
        if i.asignado_a != "0":
            m_pop.ids.P_Boton_Asignarme.disabled = True
            m_pop.ids.P_Boton_Asignarme.opacity = 0
            m_pop.ids.P_asigando_a.text = "Asignado a: " + str(i.asignado_a)
        #
        m_pop.ids.P_Boton.num = i.num
        m_pop.ids.P_Boton.estado = i.estado
        if i.estado == "A":
            m_pop.ids.P_Boton.text = "Cerrar Parte"
            m_pop.ids.P_Boton.background_color = color_error
            m_pop.ids.P_Boton.nuevo_estado = "C"
        elif i.estado == "E":
            m_pop.ids.P_Boton.text = "Cerrar Parte"
            m_pop.ids.P_Boton.background_color = color_bloqueada
            m_pop.ids.P_Boton.nuevo_estado = "C"
        else:
            m_pop.ids.P_Boton.text = "Re-abrir Parte"
            m_pop.ids.P_Boton.background_color = color_limpia
            m_pop.ids.P_Boton.nuevo_estado = "A"

        bl_content.add_widget(m_pop)

        self.popup_Hab.title = u'Parte Num: ' + i.num
        self.popup_Hab.content = bl_content
        self.popup_Hab.open()

    def popup_Parte_Nuevo(self, **kwargs):
        bl_content = BoxLayout()
        bl_content.orientation = 'vertical'
        bl_content.padding = 2
        bl_content.spacing = 10

        m_pop = Parte_PopUp()
        m_pop.AltaMod = "A"

        # Oculatar asignación
        m_pop.ids.P_Boton_Asignarme.disabled = True
        m_pop.ids.P_Boton_Asignarme.opacity = 0
        m_pop.ids.P_asigando_a.opacity = 0

        m_pop.ids.P_1_1.text = 'Zona/Hab:'
        if len(kwargs.items()):
            # Si me pasan la habitación
            m_pop.ids.P_1_3.text = kwargs.items()[0][1]
        #m_pop.ids.P_1_2.hint_text = u'Introducir Zona'
        #m_pop.ids.P_1_3.hint_text = u'Introducir Hab.'
        #
        m_pop.ids.P_2_1.text = 'Tipo Parte:'
        m_pop.ids.P_2_2.text = "Seleccionar un Tipo"
        #
        m_pop.ids.P_2_2.values = gl_tip_partes
        #
        m_pop.ids.P_3_1.text = 'Apertura.:'
        m_pop.ids.P_3_2.text = ""
        m_pop.ids.P_3_3.text = ""
        #
        m_texto = ''
        m_pop.ids.P_2_3.text = m_texto
        m_pop.ids.P_2_3.color = color_error
        #
        m_pop.ids.P_Desc.hint_text = u'Introduzca Descripción del Parte'
        m_pop.ids.P_Desc.disabled = False
        #
        m_pop.ids.P_Obs.hint_text = u'Introduzca las Observaciones oportunas'
        #
        m_pop.ids.P_B_Espera.num = 0
        m_pop.ids.P_B_Espera.nuevo_estado = "E"
        m_pop.ids.P_MotEsp.hint_text = u'Si está en espera, introduzca motivo'
        #
        m_pop.ids.P_Boton.num = 0
        m_pop.ids.P_Boton.estado = ""

        m_pop.ids.P_Boton.text = "Alta Parte"
        m_pop.ids.P_Boton.background_normal = ''
        m_pop.ids.P_Boton.background_color = color_bloqueada
        m_pop.ids.P_Boton.nuevo_estado = "A"

        bl_content.add_widget(m_pop)

        self.popup_Hab.title = u'Nuevo Parte'
        self.popup_Hab.content = bl_content
        self.popup_Hab.open()

#
    def Parte_accion(self, i, AltaMod, Parte):
        global lista_Habitaciones
        # Validamos si la habitación Existe
        if len(Parte.ids.P_1_3.text):
            if Parte.ids.P_1_3.text not in lista_Habitaciones:
                PU_Error = Popup()
                PU_Error.title = u'ERROR Validación'
                bl_content = BoxLayout()
                bl_content.orientation = 'vertical'
                bl_content.padding = [10,10,10,10]
                #
                lab = Label(text='Habitación NO EXISTE')
                lab.font_size = '24dp'
                lab.color = color_error
                bl_content.add_widget(lab)
                #
                bt = Button(text='Salir')
                bt.size_hint = None, None
                bt.height = "60dp"
                bt.width = "120dp"
                bt.font_size = '22dp'
                bl_content.add_widget(bt)
                bt.bind(on_press=PU_Error.dismiss)
                #
                PU_Error.content = bl_content
                PU_Error.open()
                return

        # Solicitar conformidad y Usuario que cierra
        #conf_pop = PU_confirmar()
        self.PU_ConfCierre.content = ConfCierre_PopUp()
        if AltaMod == "M":
            self.PU_ConfCierre.content.ids.lab_quien.text = "¿Quién Cierra el Parte?"
        else:
            self.PU_ConfCierre.content.ids.lab_quien.text = "¿Quién Abre el Parte?"
        self.Info_Parte = Parte
        self.Info_Parte.NuevoEstado = i.nuevo_estado
        self.PU_ConfCierre.title = u'Confirmar Cierre'
        self.PU_ConfCierre.open()
        return

    def Parte_Conf_Cierre(self, Quien):
        self.PU_ConfCierre.dismiss()
        unicMotEsp = urllib.quote(self.Info_Parte.ids.P_MotEsp.text.encode('utf-8'))
        #usuario = gl_perfil[0:5] + '-' + gl_subgober
        usuario = str(gl_clave) + "-" + urllib.quote(Quien.encode('utf-8'))

        AltaMod = self.Info_Parte.AltaMod
        NuevoEstado = self.Info_Parte.NuevoEstado
        i = self.Info_Parte.ids.P_Boton

        DiasEspera = self.Info_Parte.ids.P_DiasEspera.text

        if AltaMod == "A":
            unicDesc = urllib.quote(self.Info_Parte.ids.P_Desc.text.encode('utf-8'))
            unicObs = urllib.quote(self.Info_Parte.ids.P_Obs.text.encode('utf-8'))
            unicTipo = urllib.quote(self.Info_Parte.ids.P_2_2.text.encode('utf-8'))
            unicZona = urllib.quote(self.Info_Parte.ids.P_1_2.text.encode('utf-8'))
            unicHab = urllib.quote(self.Info_Parte.ids.P_1_3.text.encode('utf-8'))
            if gl_perfil == "Gobernanta":
                ori_part = "G"
            else:
                ori_part = "S"
            if self.Info_Parte.ids.partes_avisar_al_cerrar.active == True:
                es_avisar = 1
            else:
                es_avisar = 0

            url = url_ghot + 'vars=clave:' + str(gl_clave) + '@acc:parte_alta@estado:A@hab:' + unicHab + \
                '@zona:' + unicZona +'@usuario:' + usuario + '@motesp:' + unicMotEsp  + '@obs:' + unicObs + \
                '@tipo:' + unicTipo + '@desc:' + unicDesc + '@edf:' + str(idEDF) + '@es_avisar:' + str(es_avisar) + \
                '@ori_part:' + ori_part + '@dias_esp:' + DiasEspera
            self.poner_en_cola_Sent(url)
            self.popup_Hab.dismiss()
        else:
            if NuevoEstado == "A":
                url = url_ghot + 'vars=clave:' + str(gl_clave) + '@acc:partes_estado_mod@estado:A@id:' + str(
                    i.num) + '@usuario:' + usuario + '@motesp:' + unicMotEsp + '@dias_esp:' + DiasEspera
            elif NuevoEstado == "E":
                url = url_ghot + 'vars=clave:' + str(gl_clave) + '@acc:partes_estado_mod@estado:E@id:' + str(
                    i.num) + '@usuario:' + usuario + '@motesp:' + unicMotEsp + '@dias_esp:' + DiasEspera
            else:
                url = url_ghot + 'vars=clave:' + str(gl_clave) + '@acc:partes_estado_mod@estado:C@id:' + str(
                    i.num) + '@usuario:' + usuario + '@motesp:' + unicMotEsp + '@dias_esp:' + DiasEspera
            #
            # Marco el JSON
            store = JsonStore('partes.json')
            m = store.get(i.num)
            store.put(i.num, ID=m['ID'], FCH_APE=m['FCH_APE'],DESC=m['DESC'], HOR_APE=m['HOR_APE'],
                      USU_APE=m['USU_APE'], TIP_PART=m['TIP_PART'], TIP_PART_NAME=m['TIP_PART_NAME'],
                      URG=m['URG'], CRI=m['CRI'], HAB=m['HAB'], ZON_COM=m['ZON_COM'], OBS=m['OBS'],
                      ESTADO=NuevoEstado, MOT_ESP=self.Info_Parte.ids.P_MotEsp.text, DIAS_ESP=DiasEspera,
                      ASIGNADO_A=m['ASIGNADO_A'],ES_ITEM=m['ES_ITEM'])
            #
            global data
            partes = list((x[1] for x in sorted(store.find(ES_ITEM='S'))))
            self.muestra_partes(partes)
            self.poner_en_cola_Sent(url)
            self.popup_Hab.dismiss()
#
    def Parte_asignarme(self, i):
        usuario = str(gl_clave)
        url = url_ghot + 'vars=clave:'+str(gl_clave)+'@acc:partes_asignar@id:'+str(i.num)+'@asignado_a:'+usuario
        # Marco el JSON
        store = JsonStore('partes.json')
        m = store.get(i.num)
        store.put(i.num, ID=m['ID'], FCH_APE=m['FCH_APE'], DESC=m['DESC'], HOR_APE=m['HOR_APE'],
                  USU_APE=m['USU_APE'], TIP_PART=m['TIP_PART'], TIP_PART_NAME=m['TIP_PART_NAME'], ESTADO=m['ESTADO'],
                  URG=m['URG'], CRI=m['CRI'], HAB=m['HAB'], ZON_COM=m['ZON_COM'], OBS=m['OBS'],
                  MOT_ESP=m['MOT_ESP'], DIAS_ESP=m['DIAS_ESP'],
                  ASIGNADO_A=usuario, ES_ITEM=m['ES_ITEM'])
        #
        global data
        partes = list((x[1] for x in sorted(store.find(ES_ITEM='S'))))
        self.muestra_partes(partes)
        self.poner_en_cola_Sent(url)
        self.popup_Hab.dismiss()

#------------------------------------------------------------------------------------
#-- Funciones llamadas desde KV
#------------------------------------------------------------------------------------
#
    def carga_lista_habitaciones(self, nap):
        # Sólo cargar Lista de Habitaciones si no tengo el json
        if os.path.exists('lista_habitaciones.json'):
            pass
        else:
            global lista_Habitaciones
            if idEDF == 0:
                return False
            url = url_ghot + 'vars=clave:' + str(gl_clave) + '@acc:hab_list_get@edf:' + str(idEDF) + \
                  '@perfil:'+gl_perfil
            req = Request(url)
            try:
                response = urlopen(req, timeout=4)
            except HTTPError as e:
                self.ids.txt_error.text = '** Error HTTPError'
            except URLError as e:
                self.ids.txt_error.text = '** Error URLError'
            except socket.timeout, e:
                # For Python 2.7
                self.ids.txt_error.text = '** Timeout Error'
            except ValueError as e:
                self.ids.txt_error.text = '** No existe en la configuración'
            else:
                # Conexión correcta. guardo en json local
                data = json.loads(response.read().decode("utf-8-sig"))
                fh = open('lista_habitaciones.json', 'w')
                json.dump(data, fh)
                fh.close()
        store_ListaHabs = JsonStore('lista_habitaciones.json')
        lista_Habitaciones = store_ListaHabs.get("HABITACIONES")

    #
    def recargar_datos_gober_buton(self):
        Clock.schedule_once(self.recargar_datos_hab, 0.3)
        Clock.schedule_once(self.recargar_datos_partes, 0.6)

    def recargar_datos_partes_buton(self):
        Clock.schedule_once(self.recargar_datos_partes, 0.3)

    def recargar_datos_hab(self, nap):
        self.ids.txt_error.text = ''
        self.recargar_habitaciones()

    def recargar_datos_partes(self, nap):
        self.ids.txt_error.text = ''
        self.recargar_partes()

# ----------------------------- Recargar habitaciones desde GHOT
#
    def recargar_habitaciones(self):
        global data
        try:
            retorno = self.search_habs()
            if retorno:
                self.ids.txt_recarga.text = "** Habitaciones ACTUALIZADAS **"
                self.ids.txt_recarga_lin2.text = " "
            else:
                if idEDF == 0:
                    return
                else:
                    self.ids.txt_recarga.text = "** ERROR Conexión **"
                    self.ids.txt_recarga_lin2.text = "Se usará la información de fecha:"
            #
            # Cargamos del JSON guardado (puede ser actual o el anterior)
            store = JsonStore('habitaciones.json')
            data = list((x[1] for x in sorted(store.find(ES_HAB='S'))))
            self.rebuscar()
        except ValueError as e:
            self.ids.txt_error.text = '** No existe en la configuración'


    def search_habs(self):
        if idEDF == 0:
            self.ids.txt_fecha.text = '** Falta Configuración **'
            return False
        retorno = False
        url = url_ghot + 'vars=clave:'+str(gl_clave)+'@acc:hab_get@edf:' + str(idEDF) + \
              '@subgober:' + str(gl_subgober)
        req = Request(url)
        try:
            response = urlopen(req, timeout=4)
        except HTTPError as e:
            self.ids.txt_error.text = '** Error HTTPError'
        except URLError as e:
            self.ids.txt_error.text = '** Error URLError'
        except socket.timeout, e:
            # For Python 2.7
            self.ids.txt_error.text = '** Timeout Error'
        else:
            # Conexión correcta. guardo en json local
            data = json.loads(response.read().decode("utf-8-sig"))
            fh = open('habitaciones.json', 'w')
            json.dump(data, fh)
            fh.close()
            retorno = True
        return retorno
# ---------------------------FIN  Recargar habitaciones desde GHOT
#
# ----------------------------- Borra todos los json
    def borrar_json(self, password):
        if password == 'globales':
            if path.exists("./partes.json"):
                remove('./partes.json')
            else:
                pass
            if path.exists("./lista_habitaciones.json"):
                remove('./lista_habitaciones.json')
            else:
                pass
            if path.exists("./habitaciones.json"):
                remove('./habitaciones.json')
                quit()
            else:
                pass
        else:
            PU_Error = Popup()
            PU_Error.title = u'Error'
            bl_content = BoxLayout()
            bl_content.orientation = 'vertical'
            bl_content.padding = [10,10,10,10]
            #
            lab = Label(text='Error Contraseña')
            lab.font_size = '40dp'
            lab.color = color_error
            bl_content.add_widget(lab)
            #
            bt = Button(text='Salir')
            bt.size_hint = None, None
            bt.height = "60dp"
            bt.width = "120dp"
            bt.font_size = '22dp'
            bl_content.add_widget(bt)
            bt.bind(on_press=PU_Error.dismiss)
            #
            PU_Error.content = bl_content
            PU_Error.open()

    def modo(self):
        global modo

        store = JsonStore('conf.json')
        modo = store.get('modo')
        nomEDF = store.get('nomEDF')

        if modo == 1:
            self.ids.txt_recarga.text = 'APP modo Oscuro'
            self.ids.txt_recarga_partes.text = ''
            self.ids.txt_fecha.text = ' '
            self.ids.txt_recarga_lin2.text = "Re-iniciar aplicación"
            data = '{"nomEDF":"' + nomEDF + '","perfil":"' + gl_perfil + '","subgober":"' + gl_subgober + '","idEDF":"' + idEDF + '","clave":"' + gl_clave + '","password":"' + gl_password + '","modotest": 0, "modo": 0}'

            fh = open('conf.json', 'w')
            fh.write(data)
            fh.close()
        else:
            self.ids.txt_recarga.text = 'APP modo Claro'
            self.ids.txt_recarga_partes.text = ''
            self.ids.txt_fecha.text = ' '
            self.ids.txt_recarga_lin2.text = "Re-iniciar aplicación"
            data = '{"nomEDF":"' + nomEDF + '","perfil":"' + gl_perfil + '","subgober":"' + gl_subgober + '","idEDF":"' + idEDF + '","clave":"' + gl_clave + '","password":"' + gl_password + '","modotest": 0, "modo": 1}'

            fh = open('conf.json', 'w')
            fh.write(data)
            fh.close()


# ----------------------------- Recargar Partes desde GHOT
#
    def recargar_partes(self):
        global partes
        try:
            retorno = self.search_partes()
            if retorno:
                self.ids.txt_recarga_partes.text = "** Partes ACTUALIZADOS **"
                self.ids.txt_recarga_lin2.text = " "
            else:
                if idEDF == 0:
                    return
                else:
                    self.ids.txt_recarga_partes.text = " "
            #
            # Cargamos del JSON guardado (puede ser actual o el anterior)
            storePartes = JsonStore('partes.json')
            partes = list((x[1] for x in sorted(storePartes.find(ES_ITEM='S'))))
            self.muestra_partes(partes)
            #
            # Muestro la fecha hora de la actualiacion
            ignorar = storePartes.get('IGNORAR')
            self.ids.txt_fecha.text = 'Fecha: ' + ignorar['fecha'] + "    Hora: " + ignorar['hora']
            global sFechaHoraHab
            sFechaHoraHab = ignorar['fecha'] + " - " + ignorar['hora']
            global gl_tip_partes
            gl_tip_partes = ignorar['spin_tip_part']
        except ValueError as e:
            self.ids.txt_error.text = '** No existe en la configuración'


    def search_partes(self):
        # En esta petición enviamos la versión de la app para registrarla en GHOT
        global version
        if idEDF == 0:
            self.ids.txt_fecha.text = '** Falta Configuración **'
            return False
        retorno = False
        # Filtro Destino Partes
        dst_part = 'G'
        if gl_perfil == 'SSTT':
            dst_part = 'S'
        url = url_ghot + 'vars=clave:' + str(gl_clave) + '@acc:partes_get@edf:' + str(idEDF) + \
              '@dst_part:' + dst_part + '@version:' + version
        #print "Debug: ", url
        req = Request(url)
        try:
            response = urlopen(req, timeout=4)
        except HTTPError as e:
            self.ids.txt_error.text = '** Error HTTPError'
        except URLError as e:
            self.ids.txt_error.text = '** Error URLError'
        except socket.timeout, e:
            # For Python 2.7
            self.ids.txt_error.text = '** Timeout Error'
        else:
            # Conexión correcta. guardo en json local
            """
            	Intento reparar problema caracteres raros
            mmm = response.read()
            mmm1 = ''.join(e for e in mmm if (ord(e) in range(3,166)))

            data = json.loads(mmm1)
            """
            data = json.loads(response.read())

            fh = open('partes.json', 'w')
            json.dump(data, fh)
            fh.close()
            retorno = True
        return retorno
# ---------------------------FIN  Recargar habitaciones desde GHOT
#
    def actu_app(self):
        if socket.gethostname() == 'mamestredeb':
            print '** AVISO: No actualizo apps para no machacar las aplicaciones en desarrollo'
            self.ids.bt_Actualizar_Datos_Gober.disabled = True
            self.ids.bt_Actualizar_Datos_Partes.disabled = True
            pass  # ** No actualizo para no machacar las aplicaciones en desarrollo

        else:
            try:
                #url = url_app + '/GlobalesApp/android.txt'
                #urllib.urlretrieve(url, "android.txt")
                url = url_app + '/GlobalesApp/main.py'
                urllib.urlretrieve(url, "main.py")
                url = url_app + '/GlobalesApp/pantalla.kv'
                urllib.urlretrieve(url, "pantalla.kv")
                self.ids.txt_recarga.text = 'APP actualizada'
                self.ids.txt_recarga_partes.text = ''
                self.ids.txt_fecha.text = ' '
                self.ids.txt_recarga_lin2.text = "Re-iniciar aplicación"
                os.remove("main.pyo")
                self.ids.bt_Actualizar_Datos_Gober.disabled = True
                self.ids.bt_Actualizar_Datos_Partes.disabled = True
                self.ids.bt_Actualizar_App.disabled = True
                self.ids.bt_Reset_Rangos.disabled = True
                self.ids.atb_Gober.disabled = True
                self.ids.atb_Partes.disabled = True
            except:
                self.ids.txt_config.text = '** Error Descargando APP'

class PantallaApp(App):

	def build(self):
		Window.bind(on_keyboard=self.key_input)

	def key_input(self, window, key, scancode, codepoint, modifier):
		if key == 27:
			return True  # no cierra la app con tecla retroceso
		else:           # the key now does nothing
			return False
	def on_pause(self):
		# Here you can save data if needed
		return True
	def on_resume(self):
		# Here you can check if any data needs replacing (usually nothing)
		pass
	def cargaConf(self):
		global idEDF
		global modo
		global nomEDF
		global gl_clave
		global gl_password
		global gl_perfil
		global gl_subgober
		global url_ghot
		global devuelve
		if os.path.exists('conf.json'):
			try:
				store = JsonStore('conf.json')
				idEDF = store.get('idEDF')
				gl_password = store.get('password')
				gl_clave = store.get('clave')
				gl_perfil = store.get('perfil') # Valores posibles: Gobernanta y SSTT
				gl_subgober = store.get('subgober')
				gl_modotest = store.get('modotest')
				modo = store.get('modo')

				if modo == 1:
					devuelve = '0'
				else:
					devuelve = '1'
				if gl_modotest == 1:
					url_ghot = 'http://pms.hotelesglobales.com/ghot/api/api.php?modo=test&'
				else:
					url_ghot = 'http://pms.hotelesglobales.com/ghot/api/api.php?modo=real&'
				nomEDF = store.get('nomEDF') + "(" + gl_subgober + ")"
				if os.path.exists('imagenes'):
					pass
				else:
					os.mkdir('imagenes')
					url = url_app + '/GlobalesApp/imagenes/apagar.png'
					urllib.urlretrieve(url, "imagenes/apagar.png")
					url = url_app + '/GlobalesApp/imagenes/atras.png'
					urllib.urlretrieve(url, "imagenes/atras.png")
					url = url_app + '/GlobalesApp/imagenes/confb.png'
					urllib.urlretrieve(url, "imagenes/confb.png")
					url = url_app + '/GlobalesApp/imagenes/confv.png'
					urllib.urlretrieve(url, "imagenes/confv.png")
					url = url_app + '/GlobalesApp/imagenes/icono.png'
					urllib.urlretrieve(url, "imagenes/icono.png")
					url = url_app + '/GlobalesApp/imagenes/logo.png'
					urllib.urlretrieve(url, "imagenes/logo.png")
					url = url_app + '/GlobalesApp/imagenes/nbparte.png'
					urllib.urlretrieve(url, "imagenes/nbparte.png")
				return devuelve
			except:
				nomEDF = store.get('nomEDF')
				data = '{"nomEDF":"' + nomEDF + '","perfil":"' + gl_perfil + '","subgober":"' + gl_subgober + '","idEDF":"' + idEDF + '","clave":"' + gl_clave + '","password":"' + gl_password + '","modotest": 0, "modo": 1}'
				fh = open('conf.json', 'w')
				fh.write(data)
				fh.close()
				if os.path.exists('imagenes'):
					pass
				else:
					os.mkdir('imagenes')
					url = url_app + '/GlobalesApp/imagenes/apagar.png'
					urllib.urlretrieve(url, "imagenes/apagar.png")
					url = url_app + '/GlobalesApp/imagenes/atras.png'
					urllib.urlretrieve(url, "imagenes/atras.png")
					url = url_app + '/GlobalesApp/imagenes/confb.png'
					urllib.urlretrieve(url, "imagenes/confb.png")
					url = url_app + '/GlobalesApp/imagenes/confv.png'
					urllib.urlretrieve(url, "imagenes/confv.png")
					url = url_app + '/GlobalesApp/imagenes/icono.png'
					urllib.urlretrieve(url, "imagenes/icono.png")
					url = url_app + '/GlobalesApp/imagenes/logo.png'
					urllib.urlretrieve(url, "imagenes/logo.png")
					url = url_app + '/GlobalesApp/imagenes/nbparte.png'
					urllib.urlretrieve(url, "imagenes/nbparte.png")
				if modo == 1:
					devuelve = '0'
				else:
					devuelve = '1'
				if gl_modotest == 1:
					url_ghot = 'http://pms.hotelesglobales.com/ghot/api/api.php?modo=test&'
				else:
					url_ghot = 'http://pms.hotelesglobales.com/ghot/api/api.php?modo=real&'
				nomEDF = store.get('nomEDF') + "(" + gl_subgober + ")"
				# Deshabilitar Botón Gober si es SSTT
				print "** Error en la configuración **"
				return devuelve
    # Deshabilitar Botón Gober si es SSTT
	def es_SSTT(self):
		global gl_perfil
		global ocultar
		if os.path.exists('conf.json'):
			try:
				store = JsonStore('conf.json')
				gl_perfil = store.get('perfil')
				if gl_perfil == "SSTT":
					ocultar = '1'
					return ocultar
				else:
					ocultar = '0'
					return ocultar
			except:
				print "** Error en la configuración **"
	def actualiza_contador_cola_Hab(self):
		if os.path.exists('Sent'):
			contadorcola = str(len(os.listdir('Sent')))
		else:
			contadorcola = "0"
		self.root.ids.contadorcola_box.text = "Envíos: " + str(contadorcola)

	def envio_cola(self):
		if os.path.exists('Sent'):
			for f in os.listdir('Sent'):
				path = 'Sent/' + str(f)
				f = open(path)
				url = f.read()
				f.close()
				req = UrlRequest(url, on_success=partial(self.ok_envio, path), on_error=self.error_envio)

	def ok_envio(self, path, *args):
		os.remove(path)

	def error_envio(self, *args):
		pass

	def update_Cola(self, nap):
		self.envio_cola()
		self.actualiza_contador_cola_Hab()
		self.root.ids.nomEDF_box.text = nomEDF + " - " + sFechaHoraHab if len(sFechaHoraHab) \
			else nomEDF + " - " + "**ACTUALIZAR**"

	def on_start(self):
		#Config.set('graphics', 'fullscreen', '1')
		#Config.set('graphics', 'borderless', 0)
		self.cargaConf()
		self.root.ids.nomEDF_box.text = nomEDF + " - " + sFechaHoraHab if len(sFechaHoraHab) \
			else nomEDF + " - " + "**ACTUALIZAR**"
		Clock.schedule_interval(self.update_Cola, 5)
		if gl_perfil == "Gobernanta":
			Clock.schedule_once(self.root.recargar_datos_hab, 0.5)
		Clock.schedule_once(self.root.recargar_datos_partes, 0.8)
		Clock.schedule_once(self.root.carga_lista_habitaciones, 5)
		if gl_perfil == "Gobernanta":
			Clock.schedule_interval(self.root.recargar_datos_hab, 900)
		Clock.schedule_interval(self.root.recargar_datos_partes, 300)


if __name__ == '__main__':
	PantallaApp().run()
