"""会计科目管理 — 新30号准则适配"""
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session
from sqlalchemy import func
from typing import Optional, List
from app.database import get_db
from app.auth_middleware import require_role
from app.models import Subject
import logging

logger = logging.getLogger("cma.subjects")

router = APIRouter(prefix="/api/cma/subjects", tags=["会计科目"],
    dependencies=[Depends(require_role("ceo", "finance", "business"))],
)


@router.get("")
def list_subjects(
    category: Optional[str] = Query(None, description="新30号准则分类过滤"),
    keyword: Optional[str] = Query(None, description="科目名称/编码搜索"),
    db: Session = Depends(get_db),
):
    """科目列表 — 支持新30号准则分类筛选"""
    query = db.query(Subject).filter(Subject.is_active == 1)

    if category:
        query = query.filter(Subject.new_standard_category == category)

    if keyword:
        like = f"%{keyword}%"
        query = query.filter(
            Subject.subject_name.like(like) | Subject.subject_code.like(like)
        )

    subjects = query.order_by(Subject.subject_code).all()

    return {
        "total": len(subjects),
        "data": [
            {
                "id": s.id,
                "subject_code": s.subject_code,
                "subject_name": s.subject_name,
                "parent_code": s.parent_code,
                "level": s.level,
                "category": s.category,
                "new_standard_category": s.new_standard_category,
                "is_active": s.is_active,
                "remark": s.remark,
                "updated_at": s.updated_at.isoformat() if s.updated_at else None,
            }
            for s in subjects
        ],
    }


@router.put("/{subject_id}")
def update_subject_category(
    subject_id: int,
    new_standard_category: str = Query(..., description="operating/investing/financing/tax/discontinued"),
    db: Session = Depends(get_db),
):
    """更新单个科目的新30号准则分类"""
    subject = db.query(Subject).filter(Subject.id == subject_id).first()
    if not subject:
        raise HTTPException(status_code=404, detail="科目不存在")

    valid = {"operating", "operating_rd", "operating_fx", "investing",
             "financing", "financing_fx", "tax", "discontinued"}
    if new_standard_category not in valid:
        raise HTTPException(status_code=400, detail=f"无效的分类: {new_standard_category}")

    subject.new_standard_category = new_standard_category
    db.commit()
    return {"message": "更新成功", "subject_id": subject_id, "new_standard_category": new_standard_category}


@router.put("/batch/category")
def batch_update_category(
    ids: List[int] = Query(..., description="科目ID列表"),
    new_standard_category: str = Query(..., description="operating/investing/financing/tax/discontinued"),
    db: Session = Depends(get_db),
):
    """批量更新科目新30号准则分类"""
    valid = {"operating", "operating_rd", "operating_fx", "investing",
             "financing", "financing_fx", "tax", "discontinued"}
    if new_standard_category not in valid:
        raise HTTPException(status_code=400, detail=f"无效的分类: {new_standard_category}")

    updated = db.query(Subject).filter(
        Subject.id.in_(ids), Subject.is_active == 1
    ).update({"new_standard_category": new_standard_category}, synchronize_session=False)
    db.commit()
    return {"message": f"批量更新成功", "updated_count": updated}
