"""
Pydantic模型定义（用于API请求和响应）
"""
from pydantic import BaseModel
from typing import Optional, List
from datetime import datetime

# 学生相关模型
class StudentBase(BaseModel):
    student_id: str
    name: str
    major: Optional[str] = None

class StudentCreate(StudentBase):
    pass

class StudentUpdate(BaseModel):
    name: Optional[str] = None
    major: Optional[str] = None

class Student(StudentBase):
    id: int
    total_score: float
    random_rollcall_count: int
    order_rollcall_count: int
    transfer_right_count: int
    created_at: datetime
    updated_at: datetime
    
    class Config:
        from_attributes = True

# 点名相关模型
class RollCallRequest(BaseModel):
    rollcall_type: str  # "random" or "order"
    student_id: Optional[int] = None  # 顺序点名时需要指定学生ID

class RollCallResult(BaseModel):
    student_id: int
    student_code: str
    name: str
    major: Optional[str]
    total_score: float
    random_rollcall_count: int

class RollCallRecordCreate(BaseModel):
    student_id: int
    rollcall_type: str
    is_present: bool = True
    question_repeat_score: float = 0.0
    answer_score: float = 0.0
    event_type: Optional[str] = None

class RollCallRecordResponse(BaseModel):
    id: int
    student_id: int
    student_code: str
    student_name: str
    rollcall_type: str
    is_present: bool
    total_score_change: float
    created_at: datetime
    
    class Config:
        from_attributes = True

# 积分相关模型
class ScoreUpdate(BaseModel):
    student_id: int
    attendance_score: float = 0.0
    question_repeat_score: float = 0.0
    answer_score: float = 0.0
    event_type: Optional[str] = None

class RankingItem(BaseModel):
    rank: int
    student_id: str
    name: str
    major: Optional[str]
    total_score: float
    random_rollcall_count: int

class RankingResponse(BaseModel):
    rankings: List[RankingItem]
    total: int

# Excel导入导出模型
class ExcelImportResponse(BaseModel):
    success: bool
    message: str
    imported_count: int
    failed_count: int

