from typing import Annotated

from fastapi import APIRouter, Query
from loguru import logger

from app.web.request.report_request import AddUrlsRequest, CollectEvidenceRequest, ReportRequest, GetUrlListRequest
from app.web.service.domain_service import DomainService
from app.web.service.report_service import ReportURLService

router = APIRouter(prefix="/api/urls", tags=["URL管理"])


@router.get("/v1/list")
def get_all_urls(request: Annotated[GetUrlListRequest, Query()]):
    """获取所有的URL，支持根据域名、状态进行过滤，不传则返回全部数据，支持分页"""

    logger.debug(f"{request=}")

    return ReportURLService.get_list(
        request.domain,
        request.surl,
        request.is_report_by_one,
        request.is_report_by_site,
        request.is_report_by_wap,
        request.has_evidence,
        request.page,
        request.size
    )


@router.post("/v1/add")
def add_urls(request: AddUrlsRequest):
    """
    手动添加 URL 到域名中，支持批量添加
    格式 [
        {"domain": "", "surl": ""}, {"domain": "", "surl": ""} ...
    ]
    添加之前先检查 domain 有没有，没有的话就去创建一个 domain
    """
    # 把所有的域名列表解出来，看看有没有不存在的，如果有就新建一个域名
    # 这里还需要获取域名的 id
    input_domains = [item.domain for item in request.urls]
    result = DomainService.get_by_domains(input_domains)
    if not result.success:
        return result

    # 创建新域名
    new_domains = [x for x in input_domains if x not in result.data]
    if new_domains:
        result = DomainService.add_domains(1440, True, new_domains)
        if not result.success:
            return result

    # 再获取一遍域名模型
    result = DomainService.get_by_domains(input_domains)
    if not result.success:
        return result

    # 创建 URL
    domain_map: dict[str, int] = {x.domain: x.id for x in result.data}
    return ReportURLService.add_urls(domain_map, request.urls)


@router.post("/v1/evidence")
def collect_evidence(request: CollectEvidenceRequest):
    """
    强制手动触发证据收集任务，支持批量传入，已经收集过的 URL 也要强制收集
    TODO:本来应该需要使用任务队列的，为了简单先把数据库的相关标记改为 0 ，也能达到一样的效果
    又不是不能用 XD
    """
    return ReportURLService.batch_update_evidence_flag(request.ids)


@router.post("/v1/report")
def report(request: ReportRequest):
    """举报指定的URL，支持批量传入 id 批量举报
    先通过改数据库，然后等引擎自己调度实现
    """
    logger.debug(f"{request=}")
    return ReportURLService.batch_update_report_flag(
        request.ids,
        request.report_by_one,
        request.report_by_site,
        request.report_by_wap
    )
