# @Time    : 2023/8/14 14:38
# @Author  : Lan
# @File    : views.py
# @Software: PyCharm
import datetime

from fastapi import APIRouter, Depends, HTTPException
from apps.admin.services import FileService, ConfigService, LocalFileService
from apps.admin.dependencies import (
    admin_required,
    get_file_service,
    get_config_service,
    get_local_file_service,
)
from apps.admin.schemas import IDData, ShareItem, DeleteItem, LoginData
from core.response import APIResponse
from apps.base.models import FileCodes, KeyValue
from apps.admin.dependencies import create_token
from core.settings import settings

admin_api = APIRouter(prefix="/admin", tags=["管理"])


@admin_api.post("/login")
async def login(data: LoginData):
    # 验证管理员密码
    if data.password != settings.admin_token:
        raise HTTPException(status_code=401, detail="密码错误")

    # 生成包含管理员身份的token
    token = create_token({"is_admin": True})
    return APIResponse(detail={"token": token, "token_type": "Bearer"})


@admin_api.get("/dashboard")
async def dashboard(admin: bool = Depends(admin_required)):
    all_codes = await FileCodes.all()
    all_size = str(sum([code.size for code in all_codes]))
    sys_start = await KeyValue.filter(key="sys_start").first()
    # 获取当前日期时间
    now = datetime.datetime.now()
    today_start = now.replace(hour=0, minute=0, second=0, microsecond=0)
    yesterday_start = today_start - datetime.timedelta(days=1)
    yesterday_end = today_start - datetime.timedelta(microseconds=1)
    # 统计昨天一整天的记录数（从昨天0点到23:59:59）
    yesterday_codes = FileCodes.filter(
        created_at__gte=yesterday_start, created_at__lte=yesterday_end
    )
    # 统计今天到现在的记录数（从今天0点到现在）
    today_codes = FileCodes.filter(created_at__gte=today_start)
    return APIResponse(
        detail={
            "totalFiles": len(all_codes),
            "storageUsed": all_size,
            "sysUptime": sys_start.value,
            "yesterdayCount": await yesterday_codes.count(),
            "yesterdaySize": str(sum([code.size for code in await yesterday_codes])),
            "todayCount": await today_codes.count(),
            "todaySize": str(sum([code.size for code in await today_codes])),
        }
    )


@admin_api.delete("/file/delete")
async def file_delete(
        data: IDData,
        file_service: FileService = Depends(get_file_service),
        admin: bool = Depends(admin_required),
):
    await file_service.delete_file(data.id)
    return APIResponse()


@admin_api.get("/file/list")
async def file_list(
        page: int = 1,
        size: int = 10,
        keyword: str = "",
        file_service: FileService = Depends(get_file_service),
        admin: bool = Depends(admin_required),
):
    files, total = await file_service.list_files(page, size, keyword)
    return APIResponse(
        detail={
            "page": page,
            "size": size,
            "data": files,
            "total": total,
        }
    )


@admin_api.get("/config/get")
async def get_config(
        config_service: ConfigService = Depends(get_config_service),
        admin: bool = Depends(admin_required),
):
    return APIResponse(detail=config_service.get_config())


@admin_api.patch("/config/update")
async def update_config(
        data: dict,
        config_service: ConfigService = Depends(get_config_service),
        admin: bool = Depends(admin_required),
):
    data.pop("themesChoices")
    await config_service.update_config(data)
    return APIResponse()


@admin_api.get("/file/download")
async def file_download(
        id: int,
        file_service: FileService = Depends(get_file_service),
        admin: bool = Depends(admin_required),
):
    file_content = await file_service.download_file(id)
    return file_content


@admin_api.get("/local/lists")
async def get_local_lists(
        local_file_service: LocalFileService = Depends(get_local_file_service),
        admin: bool = Depends(admin_required),
):
    files = await local_file_service.list_files()
    return APIResponse(detail=files)


@admin_api.delete("/local/delete")
async def delete_local_file(
        item: DeleteItem,
        local_file_service: LocalFileService = Depends(get_local_file_service),
        admin: bool = Depends(admin_required),
):
    result = await local_file_service.delete_file(item.filename)
    return APIResponse(detail=result)


@admin_api.post("/local/share")
async def share_local_file(
        item: ShareItem,
        file_service: FileService = Depends(get_file_service),
        admin: bool = Depends(admin_required),
):
    share_info = await file_service.share_local_file(item)
    return APIResponse(detail=share_info)
