#!/usr/bin/env python3
# transporteaereo.py

"""
Tratamiento de datos de la Seguridad Social para django.
db = db.sqlite3
tablas: SS_categorias, SS_predict, SS_forecast
- 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
import pandas as pd
import numpy as np
import sqlite3


#++++++ RASTREO - LOGGING - DEGUG - DEPURACION +++++++++++++

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__)


#++++++++++++++ CONSULTAS - QUERYS BD ++++++++++++++++

    
def bd_sspredict (bd, tabla, codigo, n_ultimos, 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)
        
        if isinstance(n_ultimos, int): # Si es entero
            consulta_datos = 'SELECT {} FROM {} WHERE COD = "{}" ORDER BY "FECHA" DESC LIMIT {};'.format ('*', tabla, codigo, n_ultimos)
        else:
            consulta_datos = 'SELECT {} FROM {} WHERE COD = "{}" ORDER BY "FECHA" DESC;'.format ('*', tabla, 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_4 = df['VT_4'].tolist()  # Valores de y retardado 4 periodos
        y_var4 = df['V_VAR4'].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_4, y_var4, 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_ssforecast (bd, tabla, codigo, 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 {} WHERE COD = "{}" ORDER BY "FECHA" DESC;'.format ('*',tabla, 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_4 = df['VT_4'].tolist()  # Valores de y retardado 4 periodos
        yt_var4 = df['V_VAR4'].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_4, yt_var4, yti, yts]
        logger.info('<- Finita est')
        return salida
        
    except:  # catch *all* exceptions
        logger.exception('Error: [{}]'.format(sys.exc_info()))




#++++++++++++++ FUNCIÓN TEST - PRUEBAS +++++++++++++++++++++++++++++++++++++
    
def test (lg = False): # Testing - prueba 
     
    '''
    Función de prueba
    
    Parameters
    ----------
    lg : TYPE: Boolean, False - activa el logging

    Returns
    -------
    None
    
    '''
    logger = logging.getLogger('__' + sys._getframe().f_code.co_name)
    logger.disabled = lg # False activa el logging - rastreo
    export = True # True exporta ficheros excel
    BASEDATOS = '/home/ja/Documentos/test/lartica/db.sqlite3' # Path base de datos entorno pruebas
    
    try:
        logger.info('Initium ->')
        
        codigo = 1 # Para pruebas
        
        data = bd_sspredict (BASEDATOS, 'SSPredict', codigo, n_ultimos = 25, lg = lg)
        predict = bd_sspredict (BASEDATOS, 'SSPredict', codigo, n_ultimos = '*', lg = lg)
        forecast = bd_ssforecast (BASEDATOS, 'SSForecast', codigo, lg = lg)
        
        print(data[1])
        print (predict[1])
        print (forecast[1])
        
 
        
        
        salida = '*** TEST, missa est ***'
        logger.info('<- Finita est')
        return salida
        
    except:  # catch *all* exceptions
        logging.exception('Error: [{}]'.format(sys.exc_info()))    



#++++++++++++++ FUNCIÓN PRINCIPAL +++++++++++++++++++++++++++++++++++++

def main (lg = False): # Main 
     
    '''
    Función principal
    
    Parameters
    ----------
    lg : TYPE: Boolean, False - activa el logging

    Returns
    -------
    None.

    '''
    logger = logging.getLogger('__' + sys._getframe().f_code.co_name)
    logger.disabled = lg # False activa el logging - rastreo
    export = True # True exporta ficheros excel
    #bd = '/var/www/html/lartica/db.sqlite3' # Path base de datos entorno producción
    bd = '/home/ja/Documentos/test/lartica/db.sqlite3' # Path base de datos entorno pruebas
       
    try:
        logger.info('Initium ->')
        
        
            
        salida = '*** MAIN, missa est ***'
        logger.info('<- Finita est')
        return salida

    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
    lgd = False # False activa el logging - rastreo
    salida = test(lgd) # Testing
    #salida = main(lgd) # Producción
    logger.info(salida)
    
    
    # ********** FIN **********
    logger.info('Ave verum')
    elapsed = time.perf_counter() - start
    logger.info(f"Program completed in {elapsed:0.5f} seconds = {elapsed/60:0.2f} min.")



