import uuid
from datetime import datetime
from sqlalchemy import Column, String, Boolean, DateTime, Text, ForeignKey, Index
from sqlalchemy.orm import relationship
from utils.utils import Base


class User(Base):
    __tablename__ = "users"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    email = Column(String(255), unique=True, nullable=False, index=True)
    password_hash = Column(String(255), nullable=False)
    role = Column(String(50), nullable=False, index=True)
    is_active = Column(Boolean, default=True, nullable=False)
    is_verified = Column(Boolean, default=False, nullable=False)
    last_login_at = Column(DateTime, nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    user_profile = relationship("Userprofile", back_populates="user", uselist=False, cascade="all, delete-orphan", passive_deletes=True)
    seller_profile = relationship("Sellerprofile", back_populates="user", uselist=False, cascade="all, delete-orphan", passive_deletes=True)
    addresses = relationship("Address", back_populates="user", cascade="all, delete-orphan", passive_deletes=True)
    listings = relationship("Listing", back_populates="seller", foreign_keys="[Listing.seller_id]")
    orders_as_buyer = relationship("Order", back_populates="buyer", foreign_keys="[Order.buyer_id]")
    orders_as_seller = relationship("Order", back_populates="seller", foreign_keys="[Order.seller_id]")
    cart = relationship("Cart", back_populates="user", uselist=False)
    reviews_as_seller = relationship("Review", back_populates="seller", foreign_keys="[Review.seller_id]")
    offers = relationship("Offer", back_populates="buyer")
    wishlist = relationship("Wishlist", back_populates="user", uselist=False)
    conversations_as_participant1 = relationship("Conversation", back_populates="participant1", foreign_keys="[Conversation.participant1_id]")
    conversations_as_participant2 = relationship("Conversation", back_populates="participant2", foreign_keys="[Conversation.participant2_id]")
    disputes_as_complainant = relationship("Dispute", back_populates="complainant", foreign_keys="[Dispute.complainant_id]")
    disputes_as_respondent = relationship("Dispute", back_populates="respondent", foreign_keys="[Dispute.respondent_id]")
    transactions = relationship("Transaction", back_populates="user")


class Userprofile(Base):
    __tablename__ = "user_profiles"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    user_id = Column(String(36), ForeignKey("users.id", ondelete="CASCADE"), unique=True, nullable=False, index=True)
    first_name = Column(String(100), nullable=True)
    last_name = Column(String(100), nullable=True)
    display_name = Column(String(100), nullable=True)
    bio = Column(Text, nullable=True)
    avatar_url = Column(String(500), nullable=True)
    phone = Column(String(50), nullable=True)
    location = Column(String(255), nullable=True)
    timezone = Column(String(100), nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    user = relationship("User", back_populates="user_profile")


class Sellerprofile(Base):
    __tablename__ = "seller_profiles"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    user_id = Column(String(36), ForeignKey("users.id", ondelete="CASCADE"), unique=True, nullable=False, index=True)
    store_name = Column(String(255), nullable=False)
    store_description = Column(Text, nullable=True)
    store_logo_url = Column(String(500), nullable=True)
    average_rating = Column(String(10), nullable=True)
    total_sales = Column(String(20), default="0", nullable=False)
    total_reviews = Column(String(20), default="0", nullable=False)
    response_time_hours = Column(String(20), nullable=True)
    is_verified_seller = Column(Boolean, default=False, nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    user = relationship("User", back_populates="seller_profile")


class Address(Base):
    __tablename__ = "addresses"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    user_id = Column(String(36), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)
    address_type = Column(String(50), nullable=False, index=True)
    is_default = Column(Boolean, default=False, nullable=False)
    recipient_name = Column(String(255), nullable=False)
    address_line1 = Column(String(255), nullable=False)
    address_line2 = Column(String(255), nullable=True)
    city = Column(String(100), nullable=False)
    state = Column(String(100), nullable=False)
    postal_code = Column(String(50), nullable=False)
    country = Column(String(100), nullable=False)
    phone = Column(String(50), nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    user = relationship("User", back_populates="addresses")
    orders_as_shipping = relationship("Order", back_populates="shipping_address", foreign_keys="[Order.shipping_address_id]")
    orders_as_billing = relationship("Order", back_populates="billing_address", foreign_keys="[Order.billing_address_id]")

    __table_args__ = (
        Index("ix_addresses_user_type", "user_id", "address_type"),
    )