import os
from flask_login import current_user
from flask import flash
from sqlalchemy.exc import (
    DataError,
    DatabaseError,
    InterfaceError,
    InvalidRequestError,
)

from usermodel import User
from distribusimodel import Distribusis
from distribusisinfo import DistribusisInfo
from app import db


class UserHelper:
    def is_zip_uploaded(distribusiname):
        userfolder = os.path.join("stash", distribusiname)
        if os.path.exists(userfolder):
            zipfilename = "{}.zip".format(distribusiname)
            if os.path.exists(os.path.join(userfolder, zipfilename)):
                print("folder with zipfile found, file uploaded")
                return True
        print("distribusi folder has no zipfile")
        return False

    def is_distribusi_live(distribusiname):
        userfolder = os.path.join("stash", distribusiname)
        if os.path.exists(userfolder):
            zipfilename = "{}.zip".format(distribusiname)
            if os.path.exists(os.path.join(userfolder, zipfilename)):
                print("folder with zipfile found, file uploaded")
                return False
            if len(os.listdir(userfolder)) > 0:
                return True
        print("distribusi folder is empty")
        return False

    def is_css_selected(distribusiname):
        userfolder = os.path.join("themes/userthemes", distribusiname)
        if os.path.exists(userfolder):
            for file in os.listdir(userfolder):
                if file.endswith(".css"):
                    return True
        print("distribusi folder has no css file")
        return False

    def has_distribusi():
        user = User.query.filter_by(email=current_user.email).first()
        distribusi = Distribusis.query.filter_by(userid=user.id).first()
        if distribusi is None:
            print("no distribusi found")
            return False
        return True

    def current_distribusi():
        user = User.query.filter_by(email=current_user.email).first()
        if user.currentdistribusi is None:
            return "None"
        return user.currentdistribusi

    def reset_user_state():
        """reset user state upon visiting index, so that distribusi workflow can
        be done correctly"""
        if not current_user.is_authenticated:
            return
        try:
            user = User.query.filter_by(email=current_user.email).first()
            user.currentdistribusi = None
            db.session.commit()
        except (InvalidRequestError, DataError, InterfaceError, DatabaseError):
            db.session.rollback()
            flash("An error occured !", "danger")

    def distribusi_limit_reached():
        user = User.query.filter_by(email=current_user.email).first()
        distribusiamount = len(DistribusisInfo.getuserdistribusis(user.email))
        if user.tutor and distribusiamount > 14:
            print("tutor already has 15 distribusis")
            return True
        if not user.tutor and distribusiamount > 4:
            print("user already has 5 distribusis")
            return True
        return False