# src/models/payment.py
from sqlalchemy import Column, Integer, String, DateTime, Float, Text, ForeignKey, Enum
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from src.models.user import db
from src.models.subscription import PaymentStatus, PaymentMethod
import enum

class PaymentHistory(db.Model):
    __tablename__ = 'payment_histories'
    
    id = Column(Integer, primary_key=True)
    user_id = Column(String(20), nullable=False)
    subscription_id = Column(Integer, ForeignKey('subscriptions.id'), nullable=True)
    payment_key = Column(String(100), nullable=False)
    order_id = Column(String(100), nullable=False)
    amount = Column(Integer, nullable=False)
    status = Column(Enum(PaymentStatus), nullable=False, default=PaymentStatus.PENDING)
    payment_method = Column(Enum(PaymentMethod), nullable=False)
    description = Column(Text)
    failure_reason = Column(Text)

    # 상품 정보
    product_id = Column(Integer, ForeignKey('products.id'), nullable=True)
    product_name = Column(String(200))
    product_price = Column(Integer)

    # 구독 기간 필드
    billing_cycle = Column(String(20))
    subscription_days = Column(Integer)
    subscription_start_date = Column(DateTime)
    subscription_end_date = Column(DateTime)

    # 🔵 NEW: 플랜 변경 시 이월되는 가치(금액/일수) - 기본값 0
    carryover_credit_amount = Column(Integer, default=0)  # 현재 구간 남은 가치(원)
    carryover_credit_days = Column(Integer, default=0)    # 새 플랜에 더할 일수

    created_at = Column(DateTime, default=func.now())
    updated_at = Column(DateTime, default=func.now(), onupdate=func.now())

    user = relationship(
        'User', back_populates='payment_histories',
        primaryjoin='PaymentHistory.user_id==User.user_id',
        foreign_keys='PaymentHistory.user_id',
    )
    subscription = relationship('Subscription', back_populates='payment_histories')

    def to_dict(self):
        return {
            'id': self.id,
            'user_id': self.user_id,
            'subscription_id': self.subscription_id,
            'payment_key': self.payment_key,
            'order_id': self.order_id,
            'amount': self.amount,
            'status': self.status.value if self.status else None,
            'payment_method': self.payment_method.value if self.payment_method else None,
            'description': self.description,
            'failure_reason': self.failure_reason,
            'product_id': self.product_id,
            'product_name': self.product_name,
            'product_price': self.product_price,
            'billing_cycle': self.billing_cycle,
            'subscription_days': self.subscription_days,
            'subscription_start_date': self.subscription_start_date.replace(tzinfo=None).isoformat() + 'Z' if self.subscription_start_date else None,
            'subscription_end_date': self.subscription_end_date.replace(tzinfo=None).isoformat() + 'Z' if self.subscription_end_date else None,
            'carryover_credit_amount': self.carryover_credit_amount,   # 🔵 NEW
            'carryover_credit_days': self.carryover_credit_days,       # 🔵 NEW
            'created_at': self.created_at.replace(tzinfo=None).isoformat() + 'Z' if self.created_at else None,
            'updated_at': self.updated_at.replace(tzinfo=None).isoformat() + 'Z' if self.updated_at else None
        }
