#!/usr/bin/env python3
# functions.py

""" Funciones comunes a LARTICA django"""

import logging
import sys
import pathlib
import time
from datetime import datetime



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 calendario (fecha = datetime.now(), local_log = False):
       
    '''
    Return Salida[](string):
    
    0 - Fecha de entrada
    1 - YYYY-MM-DD HH:MM
    2 - Fecha DD-MM-YYYY
    3 - Fecha YYYY-MM-DD
    4 - Año
    5 - Mes
    6 - Mes - nombre
    7 - AÑO-MES
    8 - Día
    8 - Día de la semana  - número 1..7
    10 - Día - nombre
    11 - Día del año
    12 - Días del año
    13 - Hora
    14 - Minuto
    15 - Trimestre
    16 - AÑO-TRIMESTRE
    17 - Semana
    18 - AÑO-SEMANA
           
    '''
    
    logger = logging.getLogger('&calendario')
    logger.disabled = local_log
    
    salida = [0]*20
    
    try:
       
       nombre_mes = ['ENE', 'FEB', 'MAR', 'ABR','MAY','JUN', 'JUL', 'AGO', 'SEP', 'OCT', 'NOV', 'DIC']
       nombre_dia = ['L', 'M', 'X', 'J', 'V', 'S', 'D']
       trimestre = ['01','01','01','02','02','02','03','03','03','04','04','04']
        
       logger.info('Date in: ' + str(fecha))
       
       
       fhm = datetime.strftime(fecha,'%Y-%m-%d %H:%M')
       f = datetime.strftime(fecha,'%d-%m-%Y')
       fr = datetime.strftime(fecha,'%Y-%m-%d')
       y = datetime.strftime(fecha,'%Y')
       m = datetime.strftime(fecha,'%m')
       d = datetime.strftime(fecha,'%d')
       ds= datetime.strftime(fecha,'%u') # Iso 8601(1..7)
       mn = nombre_mes[int(m)-1]
       dn = nombre_dia[int(ds)-1]
       dy= datetime.strftime(fecha,'%j')
       hora = datetime.strftime(fecha,'%H')
       minuto = datetime.strftime(fecha,'%M')
       # Iso 8601 La semana 01 es la que contiene el 4 de enero
       semana = datetime.strftime(fecha,'%V') 
       # Iso 8601 lunes primer dia de la semana
       ym = datetime.strftime(fecha,'%YM%m')
       q = trimestre[int(m)-1]
       yq = datetime.strftime(fecha,'%YQ')+ q
       yw = datetime.strftime(fecha,'%YW%V')
       try:
            febrero29 = datetime.fromisoformat(y +'-02-29')
            bisiesto = datetime.strftime(febrero29, '%b')
            # Si no es bisiesto da error y se va a la excepción
            diasanyo = str(366)
       except:
            diasanyo = str(365)
       

       salida = [fecha, fhm, f, fr,y, m, mn, ym, d, ds, dn, dy, diasanyo, hora, minuto, q, yq, semana, yw]
       
       
       logger.info('Fecha H:M: ' + fhm)
       logger.info('Fecha D-M-Y: ' + f)
       logger.info('Fecha Y-M-D: ' + fr)
       logger.info('Año: ' + y)
       logger.info('Mes: ' + m)
       logger.info('Mes (nombre): ' + mn)
       logger.info('Año-Mes: ' + ym)
       logger.info('Dia: ' + d)
       logger.info('Día Semana: ' + ds)
       logger.info('Día Semana (nombre): ' + dn)
       logger.info('Día del Año: ' + dy)
       logger.info('Días del Año: ' + diasanyo)
       logger.info('Semana: ' + hora)
       logger.info('Minuto: ' + minuto)
       logger.info('Trimestre: ' + q)
       logger.info('Año-Trimestre: ' + yq)
       logger.info('Semana: ' + semana)
       logger.info('Año-Semana: ' + yw)
       
       logger.info('Nº datos: ' + str(len(salida)))
             
       return salida
       
    except:  # catch *all* exceptions
        logging.exception('Error: [{}]'.format(sys.exc_info()))
        return salida




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
    now = datetime.now()
    cal = calendario (now, local_log_disabled)
    print (cal[1:5])
    print (cal)
    
    
    # ********** FIN **********
    logger.info('Ave verum')
    elapsed = time.perf_counter() - start
    logger.info(f"Program completed in {elapsed:0.5f} seconds.")

