from fastapi import Depends, APIRouter, Query, Path,Request
from internal.models import *
from internal.database import (
    fetch_one,
    fetch_all,
    execute_query,
    response_success,
    raise_if_exists,
    raise_if_not_found,
)
from dependencies import get_current_active_user
from limiter_config import limiter
import json
router = APIRouter(prefix="/diarys", tags=["日记管理"])

# 获取列表


@router.get("/list")
@limiter.limit("10/minute")
async def diary_list(request: Request,page: int = Query(None), page_size: int = Query(None)):
    limit_clause = ""
    if page is not None and page_size is not None:
        offset = (page - 1) * page_size
        limit_clause = f"LIMIT {page_size} OFFSET {offset}"
    # 列表参数:日记名称、日记内容、创建时间、日记图片、日记查看时间、日记阅读次数、日记字数、类型名称、标签名列表
    select_query = f"""
        SELECT diarys.id,diarys.diarytitle, diarys.diarycontent,diarys.readnum, diarys.create_at, diarys.imglink,
        diarys.wordcount, diarytypes.typename FROM diarys
        LEFT JOIN `diarytypes` ON diarys.typeid = diarytypes.id
        ORDER BY create_at DESC
        {limit_clause};
    """
    diary_list = fetch_all(select_query)
    count_query = "SELECT COUNT(*) AS total FROM diarys;"
    total_records = fetch_one(count_query)["total"]
    return response_success({
        "diarys": diary_list,
        "total": total_records,
    }, "diary get list success")


@router.get("/list/{id}")
@limiter.limit("10/minute")
async def diary_one(request: Request,id: int):
    # 列表参数:日记名称、日记内容、创建时间、日记图片、日记查看时间、日记阅读次数、日记字数、类型名称、标签名列表
    select_query = """
        SELECT id, diarytitle, diarycontent FROM diarys
        WHERE id = %s
        ORDER BY create_at DESC;
    """
    diary_one = fetch_one(select_query, (id,))
    return response_success(diary_one, "diary get diary_one success")


# 日记新增
@router.post("/add")
@limiter.limit("10/minute")
async def diary_add(request: Request,diary: Diary,  _: User = Depends(get_current_active_user)):
    select_query = "SELECT * FROM diarys WHERE diarytitle = %s"
    existing_diary = fetch_one(select_query, (diary.diarytitle,))
    raise_if_exists(existing_diary, "diary already exists")
    insert_query = (
        "INSERT INTO diarys (diarytitle, diarycontent,imglink, typeid, descr) VALUES (%s, %s, %s, %s,%s)"
    )
    insert_value=(diary.diarytitle,diary.diarycontent,diary.imglink,diary.typeid,diary.descr)
    execute_query(insert_query,insert_value)

    return {"message": "diary created successfully"}


# 日记删除
@router.delete("/delete/{id}")
@limiter.limit("10/minute")
async def diary_delete(request: Request,id: str = Path(description="日记id"),_: User = Depends(get_current_active_user)):
    select_query = "SELECT * FROM diarys WHERE id = %s"
    existing_diary = fetch_one(select_query, (id,))
    raise_if_not_found(existing_diary, "diary not found")
    delete_query = "DELETE FROM diarys WHERE id = %s"
    execute_query(delete_query, (id,))
    return response_success(message="diary delete success")


@router.put("/update/{id}")
async def diary_update(request: Request,id: int, diary: Diary, _: User = Depends(get_current_active_user)):
    # 检查要编辑的日记是否存在
    select_query = "SELECT * FROM diarys WHERE id = %s"
    existing_diary = fetch_one(select_query, (id,))
    raise_if_not_found(existing_diary, "diary not found")

    # 更新日记信息
    update_query = (
        "UPDATE diarys SET diarytitle = %s, diarycontent = %s, imglink = %s, typeid = %s, descr = %s WHERE id = %s"
    )
    update_data = (diary.diarytitle, diary.diarycontent,
                   diary.imglink, diary.typeid, diary.descr, id)
    execute_query(update_query, update_data)
    return response_success("diary update sucess")

@router.put("/update/{id}/readnum")
@limiter.limit("10/minute")
async def diary_update_num(request: Request, id: int):
    update_query ="UPDATE diarys SET readnum = readnum + 1 WHERE id = %s"
    execute_query(update_query,(id,))
    return response_success("diary update sucess")


# 日记模糊查询
@router.get("/search")
@limiter.limit("10/minute")
async def diary_list_search(
    request: Request,
    diarytitle: str = Query(None, description="日记标题"),
    typename: str = Query(None, description="日记类型"),
    start_date: str = Query(None, description="开始时间"),
    end_date: str = Query(None, description="结束时间"),
):
    select_query = """
        SELECT diarys.id, diarytitle, diarycontent,wordcount, typename, create_at, update_at, diarys.descr  
        FROM diarys 
        LEFT JOIN `diarytypes` ON diarys.typeid = diarytypes.id 
        WHERE 1=1
        """
    params = []
    if diarytitle:
        select_query += " AND diarytitle LIKE %s"
        params.append(f"%{diarytitle}%")
    if typename:
        select_query += " AND typename LIKE %s"
        params.append(f"%{typename}%")
    if start_date:
        select_query += " AND create_at >= %s"
        params.append(start_date)
    if end_date:
        select_query += " AND create_at <= %s"
        params.append(end_date)
    select_query += "ORDER BY create_at DESC"
    diary_list = fetch_all(select_query, params=params, fetchall=True)
    return response_success(data=diary_list, message="diary serach succuessfully!")


# 根据id查询日记
@router.get("/search/{id}")
@limiter.limit("10/minute")
async def get_id_diary(request: Request,id: str = Path(description="日记id")):
    select_query = """SELECT diarys.id, diarytitle, diarycontent,wordcount, diarys.typeid, diarys.descr,imglink FROM diarys 
                LEFT JOIN `diarytypes` ON diarys.typeid = diarytypes.id 
                WHERE diarys.id = %s

"""
    diary_list = execute_query(select_query, (id,))
    return response_success(data=diary_list, message="diary search success")