# -*- coding: utf-8 -*-
import os
from flask import Flask, Blueprint, abort, current_app, request, render_template, send_from_directory, jsonify
#from webinterface.models.granconcepcion import Agencia, Servicio, Paradero, Parada, Ruta, Linea
from webinterface import db
from sqlalchemy import func
from datetime import datetime, date
#from webinterface.models.modelodatos import load_paraderos,  load_estaciones, load_recorrido, listado_recorridos
#from webinterface.content.utils import haversine


main = Blueprint('main', __name__)

@main.route('/pub/paradas')
def listado_estaciones():
    return jsonify(load_estaciones())

@main.route('/listado_paraderos')
def listado_paraderos():
    current_app.logger.debug('Funcion listado_paralelos <- inicia')

    paradas = []

    for item in Paradero.query.all():
        data = {}

        data['latitude'] = item.latitud
        data['longitude'] = item.longitud

        data['codigo'] = item.nombre
        data['lineas'] = item.lineas
        if item.codigo is not None:
            data['mensaje'] = f"""<b>Ubicación:</b> {item.nombre}<br>
                                <b>Lineas:</b> {item.lineas}<br>
                                <b>Paradas dia de semana:</b> {item.paradasl}<br>
                                <b>Paradas dia de sabado:</b> {item.paradass}<br>
                                <b>Paradas dia de domingo:</b> {item.paradasd}<br>
                                <b>Codigo paradero:</b> {item.codigo}<br>
                                <br>
                                <b>Tamaño del paradero:</b> {item.tamano}<br>
                                <b>Capacidad:</b> {item.capacidad}<br>
                                Techo:</b> {item.techo}<br>
                                <b>Pared:</b> {item.pared}<br>
                                <b>Piso:</b> {item.piso}<br>
                                <br>
                                <b>RecorridosA:</b> {item.recorridos}<br>
                                <b>RecorridosB:</b> {item.recorridos2}"""
        else:
            data['mensaje'] = f"""<b>Ubicación:</b> {item.nombre}<br>
                                <b>Lineas:</b> {item.lineas}<br>
                                <b>Paradas dia de semana:</b> {item.paradasl}<br>
                                <b>Paradas dia de sabado:</b> {item.paradass}<br>
                                <b>Paradas dia de domingo:</b> {item.paradasd}<br>
                                <br>
                                <b>RecorridosA:</b> {item.recorridos}"""


        paradas.append(data)

    current_app.logger.debug('Funcion listado_paralelos <- finaliza')
    return jsonify(paradas)

@main.route('/ruta_recorrido', methods=['POST'])
def ruta_recorrido():

    retval = {}

    retval['recorrido'] = []
    retval['paradas'] = []

    servicio = Servicio.query.filter(Servicio.rutaid==request.form['rutaid']).first()
    if servicio is not None:

        lng = 0
        lat = 0
        points = 0

        distancia = 0

        prevpoint = (0,0)

        for item in Ruta.query.filter(Ruta.rutaid==request.form['rutaid']).order_by(Ruta.secuencia.asc()).all():
            points += 1
            lng += item.longitud
            lat += item.latitud
            retval['recorrido'].append({ 'lat': item.latitud, 'lng': item.longitud })

            if prevpoint != (0,0):
                distancia += haversine(item.longitud, item.latitud, prevpoint[0], prevpoint[1])

            prevpoint = (item.longitud, item.latitud)

        distancia = round(distancia, 2)

        retval['latitude'] = lat / points
        retval['longitude'] = lng / points
        retval['color'] = f"#{servicio.linea.color}"

        salida = -1
        llegada = 0

        for item in Parada.query.filter(Parada.servicioid==servicio.id).order_by(Parada.secuencia.asc()).all():
            data = {}

            if salida == -1:
                salida = item.salida
                llegada = item.llegada
            elif llegada < item.llegada:
                llegada = item.llegada

            data['latitude'] = item.paradero.latitud
            data['longitude'] = item.paradero.longitud

            data['codigo'] = item.paradero.nombre
            data['lineas'] = item.paradero.lineas
            if item.paradero.codigo is not None:
                data['mensaje'] = f"""<b>Ubicación:</b> {item.paradero.nombre}<br>
                                    <b>Lineas:</b> {item.paradero.lineas}<br>
                                    <b>Paradas dia de semana:</b> {item.paradero.paradasl}<br>
                                    <b>Paradas dia de sabado:</b> {item.paradero.paradass}<br>
                                    <b>Paradas dia de domingo:</b> {item.paradero.paradasd}<br>
                                    <b>Codigo paradero:</b> {item.paradero.codigo}<br>
                                    <br>
                                    <b>Tamaño del paradero:</b> {item.paradero.tamano}<br>
                                    <b>Capacidad:</b> {item.paradero.capacidad}<br>
                                    Techo:</b> {item.paradero.techo}<br>
                                    <b>Pared:</b> {item.paradero.pared}<br>
                                    <b>Piso:</b> {item.paradero.piso}<br>
                                    <br>
                                    <b>RecorridosA:</b> {item.paradero.recorridos}<br>
                                    <b>RecorridosB:</b> {item.paradero.recorridos2}"""
            else:
                data['mensaje'] = f"""<b>Ubicación:</b> {item.paradero.nombre}<br>
                                    <b>Lineas:</b> {item.paradero.lineas}<br>
                                    <b>Paradas dia de semana:</b> {item.paradero.paradasl}<br>
                                    <b>Paradas dia de sabado:</b> {item.paradero.paradass}<br>
                                    <b>Paradas dia de domingo:</b> {item.paradero.paradasd}<br>
                                    <br>
                                    <b>RecorridosA:</b> {item.paradero.recorridos}"""
            retval['paradas'].append(data)
        delta =  datetime.combine(date.today(), llegada) - datetime.combine(date.today(), salida)

        deltah = delta.seconds /3600
        vprom = round(distancia / deltah, 2)
        deltah = round(deltah, 3)


        paradas = len(retval['paradas'])

        normal = Servicio.query.filter(Servicio.rutaid==request.form['rutaid'], Servicio.dotw=='L').count()
        nomalsq = db.session.query(Servicio.id).filter(Servicio.rutaid==request.form['rutaid'], Servicio.dotw=='L')
        nhoras = db.session.query(func.max(Parada.llegada), func.min(Parada.llegada)).filter(Parada.secuencia==1, Parada.servicioid.in_(nomalsq)).all()

        sabado = Servicio.query.filter(Servicio.rutaid==request.form['rutaid'], Servicio.dotw=='S').count()
        nomalsq = db.session.query(Servicio.id).filter(Servicio.rutaid==request.form['rutaid'], Servicio.dotw=='S')
        shoras = db.session.query(func.max(Parada.llegada), func.min(Parada.llegada)).filter(Parada.secuencia==1, Parada.servicioid.in_(nomalsq)).all()

        domingo = Servicio.query.filter(Servicio.rutaid==request.form['rutaid'], Servicio.dotw=='D').count()
        nomalsq = db.session.query(Servicio.id).filter(Servicio.rutaid==request.form['rutaid'], Servicio.dotw=='D')
        dhoras = db.session.query(func.max(Parada.llegada), func.min(Parada.llegada)).filter(Parada.secuencia==1, Parada.servicioid.in_(nomalsq)).all()

        retval['mensaje'] = f"""La línea tiene una extensión de {distancia} Km, recorridos en {deltah} Horas (Promedio velocidad: {vprom} Km/h)<br>
                                La línea tiene {paradas} paradas durante su extensión<br>
                                La línea tiene {normal} servicios en día de semana(de {nhoras[0][1]} a {nhoras[0][0]}), {sabado} los sabados(de {shoras[0][1]} a {shoras[0][0]}) y {domingo} los domingos(de {dhoras[0][1]} a {dhoras[0][0]})."""

        return jsonify(retval)
    else:
        return abort(404)


@main.route('/about')
def about():
    return render_template('about.html')

@main.route('/')
def home():
    paraderos   = db.session.query(func.count(Paradero.id)).scalar()
    lineas      = db.session.query(func.count(Linea.id)).scalar()
    servicios   = db.session.query(func.count(Servicio.id)).scalar()
    detenciones = db.session.query(func.count(Parada.id)).scalar()

    return render_template('home.html', paraderos=paraderos, lineas=lineas, servicios=servicios, detenciones=detenciones)

@main.route('/paraderos')
def paraderos():
    return render_template('paraderosdb.html')

@main.route('/estaciones')
def estaciones():
    return render_template('estaciones.html')

@main.route('/recorridos')
def recorridos():
    lineas = []
    recorridos = {}
    for item in Servicio.query.all():

        linea = (item.lineaid, item.direccionid)

        if linea in lineas:
            continue

        lineas.append(linea)

        if item.direccionid == 0:
            recorridos[item.rutaid] = f"{item.linea.codigo} ida: {item.destino}"
        else:
            recorridos[item.rutaid] = f"{item.linea.codigo} regreso: {item.destino}"

    return render_template('lineas.html', recorridos=dict(sorted(recorridos.items(), key=lambda item: item[1])))

@main.route('/favicon.ico')
def favicon():
    return send_from_directory(os.path.join(current_app.root_path, 'static'), 'public.ico', mimetype='image/vnd.microsoft.icon')
