#!/usr/bin/env python3
# turismo.py

"""
Tratamiento de datos de turismo para django.
db = db.sqlite3
tablas: Turismo, TurismoCategoria
- Saca listas de categorias de la bd
- Saca listas de valores de la bd

"""

import logging
import sys
import pathlib
import time
from datetime import datetime
from dateutil.relativedelta import relativedelta
#from urllib import request
import pandas as pd
import numpy as np
import sqlite3


# Variables globales
BASEDATOS = '/home/ja/Documentos/test/lartica/db.sqlite3'


logging.basicConfig(
    format="%(asctime)s %(levelname)s:%(name)s: %(message)s",
    level=logging.DEBUG,
    datefmt="%H:%M:%S",
    stream=sys.stderr,
)
logger = logging.getLogger(__name__)


def bd_turismocategoria (bd = BASEDATOS, lg = False): # Categorias BD a listas cod, categoria
    
    logger = logging.getLogger('__' + sys._getframe().f_code.co_name)
    logger.disabled = lg
    
    try: 
        logger.info('Initium ->')
        
        ''' BD '''
        con = sqlite3.connect(bd) # Conexión
        cur = con.cursor() # Cursor
        consulta = 'SELECT DISTINCT COD, CATEGORIA FROM TurismoCategoria;'
        df = pd.read_sql_query(consulta, con)
        con.close() # Cierre de conexion
        ''' BD '''
      
        cod_cat = dict(df.values)
        cod = df['COD'].tolist()  # Valores de COD
        categoria = df['CATEGORIA'].tolist()  # Valores de CATEGORIA
        
        salida = [cod_cat, cod, categoria]
        logger.info('<- Finita est')
        return salida
        
    except:  # catch *all* exceptions
        logger.exception('Error: [{}]'.format(sys.exc_info()))
    
def bd_turismo (bd = BASEDATOS, codigo= 'EOT9', n_ultimos = 25, lg = False): # Datos BD a lista x , y
    
    logger = logging.getLogger('__' + sys._getframe().f_code.co_name)
    logger.disabled = lg
    
    try: 
        logger.info('Initium ->')
        
        ''' BD '''
        con = sqlite3.connect(bd) # Conexión
        #cur = con.cursor() # Cursor
        #for row in cur.execute('SELECT * FROM TURISMO_00;'): print(row)
        consulta_datos = 'SELECT {} FROM Turismo WHERE COD = "{}" ORDER BY "FECHA" DESC LIMIT {};'.format ('*', codigo, n_ultimos)
        df = pd.read_sql_query(consulta_datos, con)
        con.close() # Cierre de conexion
        ''' BD '''
        
        
       
        #print(df.dtypes)
        #print(df.describe())
        
        df = df.sort_values(by = ['PERIODO'], ascending = [True])
        df.replace([np.inf, -np.inf,'',np.nan], 0, inplace = True)
        #print(df)
        xy = dict(df[['PERIODO', 'VALOR']].values)
        x = df['PERIODO'].tolist()  # Valores de x
        y = df['VALOR'].tolist()  # Valores de y
        y_12 = df['VALOR_12'].tolist()  # Valores de y retardado 12 meses
        y_var12 = df['VALOR_VAR12'].tolist()  # Valores de variacion respecto año anterior
        xy = dict(df[['PERIODO', 'VALOR']].values)
        
        salida = [xy, x, y, y_12, y_var12] # diccionario y listas de valores
        logger.info('<- Finita est')
        return salida
        
    except:  # catch *all* exceptions
        logger.exception('Error: [{}]'.format(sys.exc_info()))
        
        

    
def bd_turismopredict (bd = BASEDATOS, codigo= 'EOT9', lg = False): # Datos BD tabla PREDICT
    '''
    Extracción de todos los datos de la base de datos de valores,predicción, tendencia, recesiones y R2
    
    '''
    
    logger = logging.getLogger('__' + sys._getframe().f_code.co_name)
    logger.disabled = lg
    
    try: 
        logger.info('Initium ->')
        
        ''' BD '''
        con = sqlite3.connect(bd) # Conexión
        #cur = con.cursor() # Cursor
        #for row in cur.execute('SELECT * FROM TURISMO_00;'): print(row)
        consulta_datos = 'SELECT {} FROM TurismoPredict WHERE COD = "{}" ORDER BY "FECHA" DESC;'.format ('*', codigo)
        df = pd.read_sql_query(consulta_datos, con)
        con.close() # Cierre de conexion
        ''' BD '''
        
        #print(df.dtypes)
        #print(df.describe())
        
        df = df.sort_values(by = ['PERIODO'], ascending = [True])
        df.replace([np.inf, -np.inf,'',np.nan], 0, inplace = True)
        #print(df)
        xy = dict(df[['PERIODO', 'VALOR']].values)
        x = df['PERIODO'].tolist()  # Valores de x
        y = df['VALOR'].tolist()  # Valores de y
        y_12 = df['VALOR_12'].tolist()  # Valores de y retardado 12 meses
        y_var12 = df['VALOR_VAR12'].tolist()  # Valores de variacion respecto año anterior
        y_predict = df['PREDICT'].tolist()  # Valores de variacion respecto año anterior
        y_tendencia = df['TENDENCIA'].tolist()  # Valores de variacion respecto año anterior
        y_recesion = df['RECESION'].tolist()  # Valores de variacion respecto año anterior
        r2 = df['R2'][0]  # Valores de variacion respecto año anterior
        
        salida = [xy, x, y, y_12, y_var12, y_predict, y_tendencia, y_recesion, r2] # diccionario y listas de valores
        logger.info('<- Finita est')
        return salida
        
    except:  # catch *all* exceptions
        logger.exception('Error: [{}]'.format(sys.exc_info()))


    
def bd_turismoforecast (bd = BASEDATOS, codigo= 'EOT9', lg = False): # Datos BD tabla FORECAST
    '''
    Extracción de todos los datos de la base de datos de valores,predicción, tendencia, recesiones y R2
    
    '''
    
    logger = logging.getLogger('__' + sys._getframe().f_code.co_name)
    logger.disabled = lg
    
    try: 
        logger.info('Initium ->')
        
        ''' BD '''
        con = sqlite3.connect(bd) # Conexión
        #cur = con.cursor() # Cursor
        #for row in cur.execute('SELECT * FROM TURISMO_00;'): print(row)
        consulta_datos = 'SELECT {} FROM TurismoForecast WHERE COD = "{}" ORDER BY "FECHA" DESC;'.format ('*', codigo)
        df = pd.read_sql_query(consulta_datos, con)
        con.close() # Cierre de conexion
        ''' BD '''
        
        #print(df.dtypes)
        #print(df.describe())
        
        df = df.sort_values(by = ['PERIODO'], ascending = [True])
        df.replace([np.inf, -np.inf,'',np.nan], 0, inplace = True)
        #print(df)
        xy = dict(df[['PERIODO', 'FCMEAN']].values)
        x = df['PERIODO'].tolist()  # Valores de x
        yt = df['FCMEAN'].tolist()  # Valores de forecast mean
        yt_12 = df['VT_12'].tolist()  # Valores de y retardado 12 meses
        yt_var12 = df['V_VAR12'].tolist()  # Valores de variacion respecto año anterior
        yti = df['FCMEAN_CI_LOWER'].tolist()  # Valores de forecast tolerancia inferior
        yts = df['FCMEAN_CI_UPPER'].tolist()  # Valores de forecast tolerancia superior
        
        # diccionario y listas de valores
        salida = [xy, x, yt, yt_12, yt_var12, yti, yts]
        logger.info('<- Finita est')
        return salida
        
    except:  # catch *all* exceptions
        logger.exception('Error: [{}]'.format(sys.exc_info()))

def main (local_log = False): # Fun: Main 
     
    '''
    Parameters
    ----------
    local_log : TYPE: Boolean, False - activa el logging

    Returns
    -------
    None.

    '''
    logger = logging.getLogger('__' + sys._getframe().f_code.co_name)
    logger.disabled = local_log
    
    try:
        logger.info('Initium ->')
        
        logger.info('<- Finita est')
        return None

    except:  # catch *all* exceptions
        logging.exception('Error: [{}]'.format(sys.exc_info()))    

if __name__ == "__main__": # Main
    start = time.perf_counter()
    assert sys.version_info >= (3, 7),"Script requires Python 3.7+."
    here = pathlib.Path(__file__).parent
    logger.disabled = False
    logger.info(here)
    logger.info('Initium novum')
    # ********** INICIO **********
    
    local_log_disabled = False # False activa el logging
    #categorias = turismo_bd_categoria()
    #print(categorias)
    
    codigo = 'EOT1619'
    
    #data = bd_turismo (bd = BASEDATOS, codigo = codigo, n_ultimos = 25, lg = local_log_disabled)
    #predict = bd_turismopredict (bd = BASEDATOS, codigo= codigo, lg = False)
    forecast = bd_turismoforecast (bd = BASEDATOS, codigo= 'EOT9', lg = False)
    
   
    
    # ********** FIN **********
    logger.info('Ave verum')
    elapsed = time.perf_counter() - start
    logger.info(f"Program completed in {elapsed:0.5f} seconds.")

