# src/models/credit.py
from sqlalchemy import Column, Integer, String, DateTime, Text, Enum, Date
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from src.models.db import db
import enum

class CreditType(enum.Enum):
    """크레딧 타입"""
    EVENT = "event"  # 이벤트 크레딧
    FREE = "free"  # 무료 크레딧
    DAILY_RENEWAL = "daily_renewal"  # 매일 갱신 크레딧
    EXPIRE = "expire"  # 만료 처리 크레딧
    SUBSCRIPTION_BASIC = "subscription_basic"  # Basic 구독 크레딧
    SUBSCRIPTION_PLUS = "subscription_plus"  # Plus 구독 크레딧
    SUBSCRIPTION_PRO = "subscription_pro"  # Pro 구독 크레딧
    ADD_ON = "add_on"  # 추가 크레딧 구입
    USAGE = "usage"  # 크레딧 사용

class CreditTransaction(db.Model):
    """크레딧 거래 내역 테이블"""
    __tablename__ = 'credit_transactions'
    
    id = Column(Integer, primary_key=True)
    user_id = Column(String(20), nullable=False)

    # 크레딧 정보
    credit_type = Column(Enum(CreditType), nullable=False)
    amount = Column(Integer, nullable=False)  # 양수면 추가, 음수면 사용
    balance_after = Column(Integer, nullable=False)  # 거래 후 잔액
    
    # 거래 상세 정보
    description = Column(Text)  # 거래 설명 (예: "회원가입 보너스", "AI 챗봇 사용" 등)
    reference_id = Column(String(100))  # 참조 ID (구독 ID, 결제 ID 등)
    reference_type = Column(String(50))  # 참조 타입 (subscription, payment, usage 등)
    
    # 메타데이터
    meta_data = Column(Text)  # JSON 형태로 추가 정보 저장
    created_at = Column(DateTime, default=func.now())
    
    # 이벤트 만료 관련 (이벤트 크레딧용)
    event_expiry_date = Column(DateTime)  # 이벤트 크레딧 만료일
    
    # 관계
    user = relationship(
        'User', back_populates='credit_transactions',
        primaryjoin='CreditTransaction.user_id==User.user_id',
        foreign_keys='CreditTransaction.user_id',
    )
    
    def to_dict(self):
        return {
            'id': self.id,
            'user_id': self.user_id,
            'credit_type': self.credit_type.value if self.credit_type else None,
            'amount': self.amount,
            'balance_after': self.balance_after,
            'description': self.description,
            'reference_id': self.reference_id,
            'reference_type': self.reference_type,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'meta_data': self.meta_data,
            'event_expiry_date': self.event_expiry_date.isoformat() if self.event_expiry_date else None
        }

class CreditBalance(db.Model):
    """사용자별 크레딧 잔액 테이블"""
    __tablename__ = 'credit_balances'
    
    id = Column(Integer, primary_key=True)
    user_id = Column(String(20), nullable=False, unique=True)
    
    # 크레딧 잔액
    total_credit = Column(Integer, default=0)  # 총 크레딧
    free_credit = Column(Integer, default=0)  # 무료 크레딧
    event_credit = Column(Integer, default=0)  # 이벤트 크레딧
    daily_renewal_credit = Column(Integer, default=0)  # 매일 갱신 크레딧
    subscription_credit = Column(Integer, default=0)  # 구독 크레딧
    add_on_credit = Column(Integer, default=0)  # 추가 구입 크레딧
    
    # 마지막 갱신 시간
    last_daily_renewal = Column(DateTime)  # 마지막 일일 갱신 시간
    updated_at = Column(DateTime, default=func.now(), onupdate=func.now())
    
    # 관계
    user = relationship(
        'User', back_populates='credit_balance',
        primaryjoin='CreditBalance.user_id==User.user_id',
        foreign_keys='CreditBalance.user_id',
    )
    
    def to_dict(self):
        return {
            'id': self.id,
            'user_id': self.user_id,
            'total_credit': self.total_credit,
            'free_credit': self.free_credit,
            'event_credit': self.event_credit,
            'daily_renewal_credit': self.daily_renewal_credit,
            'subscription_credit': self.subscription_credit,
            'add_on_credit': self.add_on_credit,
            'last_daily_renewal': self.last_daily_renewal.isoformat() if self.last_daily_renewal else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None
        }

class EventCreditLot(db.Model):
    """이벤트 크레딧 로트 테이블 (만료일 관리)"""
    __tablename__ = 'event_credit_lots'
    
    id = Column(Integer, primary_key=True)
    user_id = Column(String(20), nullable=False)
    event_id = Column(String(100), nullable=False)  # 이벤트 식별자 (예: 'signup_bonus', 'promo_2024' 등)
    amount_remaining = Column(Integer, nullable=False, default=0)  # 남은 크레딧 양
    expires_at = Column(Date, nullable=False)  # 만료일 (KST 기준 날짜)
    created_at = Column(DateTime, default=func.now())
    updated_at = Column(DateTime, default=func.now(), onupdate=func.now())
    
    # 관계
    user = relationship(
        'User', back_populates='event_credit_lots',
        primaryjoin='EventCreditLot.user_id==User.user_id',
        foreign_keys='EventCreditLot.user_id',
    )
    
    def to_dict(self):
        return {
            'id': self.id,
            'user_id': self.user_id,
            'event_id': self.event_id,
            'amount_remaining': self.amount_remaining,
            'expires_at': self.expires_at.isoformat() if self.expires_at else None,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None
        }
