from __future__ import annotations

from datetime import datetime, timezone

from sqlalchemy.orm import Session

from packages.adapters.sqlalchemy_impl.models import BillingRecordModel


class SQLAlchemyBillingRepository:
    def __init__(self, session: Session):
        self.session = session

    def create(self, record: dict) -> BillingRecordModel:
        model = BillingRecordModel(**record)
        self.session.add(model)
        self.session.commit()
        return model

    def find_by_user(self, user_id: str, limit: int = 50) -> list[BillingRecordModel]:
        return (
            self.session.query(BillingRecordModel)
            .filter(BillingRecordModel.user_id == user_id)
            .order_by(BillingRecordModel.created_at.desc())
            .limit(limit)
            .all()
        )

    def find_by_id(self, record_id: str) -> BillingRecordModel | None:
        return self.session.get(BillingRecordModel, record_id)

    def mark_paid(self, record_id: str, payment_method: str, payment_id: str) -> bool:
        model = self.session.get(BillingRecordModel, record_id)
        if model is None or model.status == "paid":
            return False
        model.status = "paid"
        model.payment_method = payment_method
        model.payment_id = payment_id
        model.paid_at = datetime.now(timezone.utc)
        self.session.commit()
        return True

    def update_subscription_on_payment(self, user_id: str, plan: str, expires_at: datetime) -> None:
        """在支付成功后更新用户订阅状态（事务内调用）"""
        from packages.adapters.sqlalchemy_impl.models import UserModel

        model = self.session.get(UserModel, user_id)
        if model:
            model.subscription_plan = plan
            model.subscription_status = "active"
            model.subscription_expires_at = expires_at
            self.session.commit()
