import math

from flask import Blueprint, g
from lin import DocResponse, Log, db, group_required, permission_meta
from sqlalchemy import text

from app.api import AuthorizationBearerSecurity, api
from app.api.cms.schema.log import LogPageSchema, LogQuerySearchSchema, UsernameListSchema

log_api = Blueprint("log", __name__)


@log_api.route("")
@permission_meta(name="查询日志", module="日志")
@group_required
@api.validate(
    resp=DocResponse(r=LogPageSchema),
    before=LogQuerySearchSchema.offset_handler,
    security=[AuthorizationBearerSecurity],
    tags=["日志"],
)
def get_logs(query: LogQuerySearchSchema):
    """
    日志浏览查询(人员,时间, 关键字),分页展示
    """
    logs = Log.query.filter()
    total = logs.count()
    items = logs.order_by(text("create_time desc")).offset(g.offset).limit(g.count).all()
    total_page = math.ceil(total / g.count)

    return LogPageSchema(
        page=g.page,
        count=g.count,
        total=total,
        items=items,
        total_page=total_page,
    )


@log_api.route("/search")
@permission_meta(name="搜索日志", module="日志")
@group_required
@api.validate(
    resp=DocResponse(r=LogPageSchema),
    security=[AuthorizationBearerSecurity],
    before=LogQuerySearchSchema.offset_handler,
    tags=["日志"],
)
def search_logs(query: LogQuerySearchSchema):
    """
    日志搜索(人员,时间, 关键字),分页展示
    """
    if g.keyword:
        logs = Log.query.filter(Log.message.like(f"%{g.keyword}%"))
    else:
        logs = Log.query.filter()
    if g.name:
        logs = logs.filter(Log.username == g.name)
    if g.start and g.end:
        logs = logs.filter(Log.create_time.between(g.start, g.end))

    total = logs.count()
    items = logs.order_by(text("create_time desc")).offset(g.offset).limit(g.count).all()
    total_page = math.ceil(total / g.count)

    return LogPageSchema(
        page=g.page,
        count=g.count,
        total=total,
        items=items,
        total_page=total_page,
    )


@log_api.route("/users")
@permission_meta(name="查询日志记录的用户", module="日志")
@group_required
@api.validate(
    resp=DocResponse(r=UsernameListSchema),
    security=[AuthorizationBearerSecurity],
    tags=["日志"],
)
def get_users_for_log():
    """
    获取所有记录行为日志的用户名
    """
    usernames = (
        db.session.query(Log.username)
        .filter_by(soft=False)
        .group_by(text("username"))
        .having(text("count(username) > 0"))
        .all()
    )
    return UsernameListSchema(items=[u.username for u in usernames])