from sqlalchemy import Column, Integer, Boolean, ForeignKey, Float, String, Text, DateTime
from sqlalchemy.orm import relationship

from models.base import Base, TimestampMixin


class Cart(Base, TimestampMixin):
    __tablename__ = 'cart'
    id = Column(Integer, primary_key=True, autoincrement=True, index=True)
    cart_line_item_id = Column(String(255), nullable=True)
    parent_id = Column(Integer, ForeignKey('parents.id'), nullable=True)
    cart_owner = Column(Integer)
    participant_id = Column(Integer, nullable=True)
    course_id = Column(Integer, ForeignKey('course.id'), nullable=False)
    course_original_amount = Column(Float, default=0)
    discount_amount = Column(Float, default=0)
    final_amount = Column(Float, default=0)
    is_discount_applied = Column(Boolean, default=False)
    transaction_batch_id = Column(String(255), nullable=True)
    is_cart_processed = Column(Boolean, default=False)
    user_type = Column(String(255), nullable=True)
    course = relationship("Course")

    @property
    def course_name(self):
        return self.course.name

    @property
    def course_details(self):
        return {"id": self.course.id, "name": self.course.name, "term": self.course.term.name,
                "academic_year": self.course.academic_year.title,'age':self.course.age_group.label}

class Payment(Base, TimestampMixin):
    __tablename__ = 'payments'
    id = Column(Integer, primary_key=True, autoincrement=True, index=True)
    created_by = Column(Integer, nullable=False)
    user_type = Column(String(255), nullable=False)
    stripe_url = Column(Text, nullable=True)
    total_paid_amount=Column(Float, nullable=False)
    is_wallet_used = Column(Boolean, default=False)
    used_wallet_amount = Column(Float, default=0)
    payment_status = Column(String(255), nullable=False)
    payment_method = Column(String(255), nullable=False)
    intent_created_on = Column(DateTime, nullable=True)
    paid_on = Column(DateTime, nullable=True)
    payment_id = Column(String(255), nullable=True)
    payment_gateway_session_id = Column(String(255), nullable=True)
    is_payment_completed = Column(Boolean, default=False)
    transaction_batch_id = Column(String(255), nullable=True)
    webhook_id = Column(Text, nullable=True)
    webhook_secret = Column(Text, nullable=True)
    charity = Column(Boolean, default=False)
    coupon_discounted_amount = Column(Float, default=0)
    discount_coupon_id = Column(Integer, ForeignKey('discount_coupons.id'), nullable=True)

    payment_details = relationship("PaymentDetails")
    discount_coupon = relationship("DiscountCoupon")

    @property
    def created_user_details(self):
        return {"id": self.created_by_user.id, "full_name": self.created_by_user.full_name}


class PaymentDetails(Base, TimestampMixin):
    __tablename__ = 'payment_details'
    id = Column(Integer, primary_key=True, autoincrement=True, index=True)
    payment_id=Column(Integer, ForeignKey('payments.id'),nullable=False)
    purchased_for_id = Column(Integer,ForeignKey('participants.id') ,nullable=True,)
    course_id = Column(Integer, ForeignKey('course.id'), nullable=False)

    # payment field

    course_original_amount = Column(Float, nullable=False)
    final_amount = Column(Float, nullable=False)


    # refund

    refund_amount = Column(Float, default=0)
    refund_status = Column(String(255), nullable=True)
    refund_created_on = Column(DateTime, nullable=True)
    refund_completed_on = Column(DateTime, nullable=True)
    refund_note = Column(String(255), nullable=True)
    is_refund_completed = Column(Boolean, default=False)
    is_refund_requested = Column(Boolean, default=False)

    # relationship
    course = relationship("Course",back_populates="payment_details")
    payment= relationship(Payment)
    purchased_participant=relationship("Participant")
    




    @property
    def course_details(self):
        return {"id": self.course.id, "name": self.course.name, "term": self.course.term.name,
                "academic_year": self.course.academic_year.title}
