from sqlalchemy import (
    Column,
    Integer,
    ForeignKey,
    String,
    Text,
    JSON,
    Enum,
    DateTime,
    DECIMAL,
    Boolean,
)
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from src.core.utils.enums import AddressTypes
from src.apps.base.models.base import Base


class Address(Base):
    """
    Settings Model: ORM class for Settings Entity
    """

    __tablename__ = "address"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    name = Column(String(255), nullable=True)
    attention = Column(String(255), nullable=True)
    address_line_1 = Column(Text)
    address_line_2 = Column(Text, nullable=True)
    zipcode = Column(String(255), nullable=True)
    city = Column(String(255), nullable=True)
    state = Column(String(255), nullable=True)
    country = Column(String(255), nullable=True)
    address_type = Column(String(50), default=AddressTypes.BILLING)
    location_data = Column(JSON, nullable=True)  # to be replaced with spatial data
    lat = Column(DECIMAL(10, 8), nullable=True)
    lng = Column(DECIMAL(11, 8), nullable=True)
    use_as_default = Column(Boolean, default=False)
    is_active = Column(Boolean, default=False)
    created_at = Column(DateTime, server_default=func.now())
    updated_at = Column(DateTime, nullable=True, onupdate=func.now())
    deleted_at = Column(DateTime, nullable=True)

    merchant_id = Column(Integer, ForeignKey("merchants.id"), nullable=True)
    merchant = relationship("Merchant", foreign_keys=[merchant_id], uselist=False)

    customer_id = Column(Integer, ForeignKey("customers.id"), nullable=True)
    customer = relationship("Customer", back_populates="addresses")
