# coding: utf-8
from flask import send_file, render_template, flash, redirect, url_for, request, Blueprint, current_app, abort, g
from flask_login import login_required, current_user
from webinterface import db
from webinterface.models.documentos import Documento
from webinterface.models.gestion import Evidencia, AnexosActa
from .utils import ingest_file
from werkzeug.utils import secure_filename
import os


docs = Blueprint('docs', __name__)

@docs.before_request
@login_required
def verifica_permisos():
    pass

def touchContainer(filehash, oldhash):
	try:

		if 'actividadid' in request.form and int(request.form['actividadid']) > 0:
			actividadid = request.form['actividadid']
			current_app.logger.debug(u'Actividad {} detectada' .format(actividadid))

			inode = Evidencia.query.filter(Evidencia.actividadid==actividadid, Evidencia.documentohash==oldhash).one_or_none()
			if inode is not None:
				db.session.delete(inode)

			inode = Evidencia.query.filter(Evidencia.actividadid==actividadid, Evidencia.documentohash==filehash).one_or_none()
			if inode is None:
				inode = Evidencia(actividadid=actividadid, documentohash=filehash)
				db.session.add(inode)
			db.session.commit()
			return inode

		elif 'actaid' in request.form and int(request.form['actaid']) > 0:
			actaid = request.form['actaid']
			current_app.logger.debug(u'AnexosActa {} detectado' .format(actaid))

			inode = AnexosActa.query.filter(AnexosActa.actaid==actaid, AnexosActa.documentohash==oldhash).one_or_none()
			if inode is not None:
				db.session.delete(inode)

			inode = AnexosActa.query.filter(AnexosActa.actaid==actaid, AnexosActa.documentohash==filehash).one_or_none()
			if inode is None:
				inode = AnexosActa(actaid=actaid, documentohash=filehash)
				db.session.add(inode)
			db.session.commit()
			return inode
		else:
			return None
	except:
		db.session.rollback()
		return None


@docs.route("/docs/upload", methods=['POST'])
def upload():
	(item, previtem) = ingest_file()

	if item is None  or (previtem is not None and touchContainer(item.hash, previtem.hash) is None) or (previtem is None and touchContainer(item.hash, "00000000000000000000000000000000") is None):
		current_app.logger.debug(u'Item is {}, previtem is {}'.format(item, previtem))
		flash(u"Ocurrió un error al subir el documento", "danger")
	else:
		flash(u"El documento fue almacenado con éxito", "success")
		nombre, extension =  os.path.splitext(item.nombre.lower())
		if extension not in ['.pdf', '.jpg', '.jpeg', '.png']:
			flash(u"El formato '{}' no es compatible con los reportes automáticos. Si desea que se incluya como evidencia en los reportes súbalo como PDF (tamaño carta) o imágen compatible.".format(extension), "warning")

	return redirect(request.form['redirect'])


@docs.route("/docs/<string:filehash>")
def get(filehash=0):
    doc = Documento.query.get(filehash)

    if doc.tamano == 0:
        return redirect(doc.nombre)
    else:
        try:
            return send_file(os.path.abspath(doc.get_file()), as_attachment=True, download_name=doc.nombre, last_modified=doc.creado)
        except FileNotFoundError:
            abort(404)


@docs.route("/docs/evidencia", methods=['POST'])
def evidencias():
	return upload()
