"""PR 与 Code Owner 映射表模型"""

import datetime
from typing import Optional

import sqlalchemy as sa
from sqlalchemy import func
from sqlalchemy.orm import Mapped, mapped_column

from backend.core.database import Base


class PrCodeOwner(Base):
    """PR 与 code owner 组的映射及加分状态"""
    __tablename__ = "pr_code_owners"

    id: Mapped[int] = mapped_column(sa.Integer, primary_key=True, autoincrement=True)

    pr_id: Mapped[int] = mapped_column(
        sa.Integer, sa.ForeignKey("pull_requests.id", ondelete="CASCADE"), nullable=False,
    )
    owner_name: Mapped[str] = mapped_column(sa.String(128), nullable=False)

    # 加分状态
    passed: Mapped[bool] = mapped_column(sa.Boolean, default=False)
    pass_account: Mapped[Optional[str]] = mapped_column(sa.String(128), nullable=True)

    # 时间字段
    created_at: Mapped[datetime.datetime] = mapped_column(sa.DateTime, nullable=False, server_default=func.now())
    updated_at: Mapped[datetime.datetime] = mapped_column(
        sa.DateTime, nullable=False, server_default=func.now(), onupdate=func.now(),
    )

    __table_args__ = (
        sa.UniqueConstraint("pr_id", "owner_name", name="uk_pr_owner"),
        sa.Index("idx_pco_passed", "passed"),
    )

    def __repr__(self) -> str:
        return f"<PrCodeOwner(id={self.id}, pr_id={self.pr_id}, owner={self.owner_name}, passed={self.passed})>"