from flask import Flask, render_template, url_for, jsonify, send_file, send_from_directory, session
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, InputRequired

import json
import os
from help_files.db_cls import DBSQLite

db_path = os.path.join(os.getcwd(), "help_files/sict_csic.db")

DB = DBSQLite(db_path)

app = Flask(__name__)
app.config['SECRET_KEY'] = 'SiCt2021CsIcDIX'

class LoginForm(FlaskForm):
    username = StringField('username', validators=[InputRequired('EL código GID es requerido'), DataRequired()])
    password = PasswordField('password', validators=[InputRequired('La contraseña es requerida'), DataRequired('campo requerido')])

@app.route('/', methods=['GET', 'POST'])
def home():
    form = LoginForm()
    mensaje = ""

    if form.validate_on_submit():
        user = form.username.data
        pswd = form.password.data

        q_sitios = 'SELECT * FROM sitios;'
        sitios = DB.get_data(q_sitios)[0][1]
        sitios = json.loads(sitios)
        
        q_dirSubdirsEdos = 'SELECT * FROM dir_csict;'
        dirSubdirsEdos = DB.get_data(q_dirSubdirsEdos)[0][1]
        dirSubdirsEdos = json.loads(dirSubdirsEdos)

        for sitio in sitios:

            gid = sitio['CodigoGid']
            password = sitio['PasswordGid']

            if pswd == password and user == gid:
                centroSICT = next(
                    (x for x in dirSubdirsEdos if int(x['idEdo']) == int(sitio['idEdo'])), None)

                if centroSICT is not None:
                    objeto = {
                        'codigoGid': gid,
                        'sitio': sitio['nombreTipologia'].title(),
                        'ai': sitio['NombreUnidad'].title(),
                        'edo': sitio['Estado'].title(),
                        'mun': sitio['Municipio'].title(),
                        'loc': sitio['Localidad'].title(),
                        'nIndicadores': len(sitio['indicadores']),
                        'responsableSitio': sitio['ResponsableSitio'].title(),
                        'PuestoResponsable': sitio['PuestoResponsable'].title(),
                        'indicadores': sitio['indicadores'],
                        'lat': sitio['ubicacion']['latitud'],
                        'lon': sitio['ubicacion']['longitud'],
                        'centroSICT': centroSICT
                    }

                    return render_template('layout_reportes.html', objeto=objeto, mensaje=mensaje)

        # Si el bucle for se completa sin encontrar coincidencias, muestra el mensaje de error
        mensaje = 'El código gid y/o contraseña son incorrectas, verifique sus credenciales.'
        return render_template('index.html', form=form, mensaje=mensaje)

    return render_template('index.html', form=form)


@app.route('/mapa')
def mapa():
    return render_template('mapa.html')


@app.route("/mapa/sitios_info")
def sample():
    q_dataRequest = 'SELECT * FROM sitios;'
    dataRequest = DB.get_data(q_dataRequest)[0][1]
    dataRequest = json.loads(dataRequest)
    
    lstSitios = []

    for s in dataRequest:
        if 'ubicacion' in s.keys():
            tempObj = {
                'CodigoGid': s['CodigoGid'],
                'NombreUnidad': s['NombreUnidad'].title(),
                'Denominacion': s['Denominacion'].title(),
                'Estado': s['Estado'].title(),
                'Municipio': s['Municipio'].title(),
                'Localidad': s['Localidad'].title(),
                'ubicacion': s['ubicacion'],
                'lenguasIndigenas': s['lenguasIndigenas'].title(),
                'fechaInstalacion': s['fechaInstalacion'],
                'infografiaSitio': s['infografiaSitio']
            }
            lstSitios.append(tempObj)

    return jsonify(lstSitios)


@app.route('/mapa/coordenadas')
def coordenadas():
    c = DB.get_coordenadas()[0][1]
    c = json.loads(c)
    return jsonify(c)


@app.route('/mapa/img_ai')
def img_ai():
    return send_file('./static/imgs/icon_ai2.png')


@app.errorhandler(404)
def error_page(e):
    return render_template('error_page.html')

if __name__ == '__main__':
    app.run(port=8090, debug=True, host="0.0.0.0")
