import hashlib
import json, os

from sqlalchemy import func

from webgds import app, db
from webgds.models import Category, Project, Service, Contact, About, Team, ProjectImage, User, UserRole, Subscriber


def read_json(path):
    with open(path, "r") as f:
        return  json.load(f)

def load_menu():
    return read_json(os.path.join(app.root_path, 'data/menu.json'))

def load_service():
    return Service.query.all()


def load_categories():
    return Category.query.all()


def load_project(category_id=None, kw=None, page=None):
    query = Project.query.filter(Project.active.__eq__(True))

    if category_id:
        query = query.filter(Project.category_id.__eq__(category_id))

    if kw:
        query = query.filter(Project.name.contains(kw))

    if page:
        page_size = app.config['PAGE_SIZE']
        start = (int(page) - 1) * page_size
        query = query.slice(start, start + page_size)

    return query.all()

def random_project(category_id=None, kw=None):
    query = Project.query.filter(Project.active == True)

    if category_id:
        query = query.filter(Project.category_id == category_id)

    if kw:
        query = query.filter(Project.name.contains(kw))

    # Sắp xếp kết quả theo thứ tự ngẫu nhiên và giới hạn số lượng dự án trả về là 6
    query = query.order_by(func.random()).limit(6)

    return query.all()

def count_project():
    return Project.query.filter(Project.active.__eq__(True)).count()


def get_project_by_id(project_id):
    query = Project.query.filter(Project.id.__eq__(project_id)).first()
    return query
    # return Project.query.get(project_id)

def load_project_image(project_id):
    query = ProjectImage.query.filter(ProjectImage.project_id.__eq__(project_id))
    return query.all()

def load_team():
    return Team.query.all()

def load_contact():
    return Contact.query.all()

def add_contact(username, email, phone, message):
    c = Contact(username=username, email=email, phone=phone, message=message)
    db.session.add(c)
    db.session.commit()
    return True

def add_Subscriber(email):
    s = Subscriber(email=email)
    db.session.add(s)
    db.session.commit()
    return True


def load_about():
    return About.query.all()

def auth_user(username, password, role=UserRole.USER):
    password = str(hashlib.md5(password.strip().encode('utf-8')).hexdigest())
    return User.query.filter(User.username.__eq__(username.strip()),
                             User.password.__eq__(password.strip()),
                             User.user_role.__eq__(role)).first()

def get_user_by_id(id):
    return User.query.get(id)




