from typing import Optional, TYPE_CHECKING
from sqlalchemy import String, Text, Integer, DateTime, ForeignKey, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column, relationship
from sqlalchemy.sql import func
from src.apps.base.models.base import Base
from datetime import datetime

if TYPE_CHECKING:
    from src.apps.payment_providers.models.merchant_provider_config import MerchantProviderConfig


class MerchantProviderCredential(Base):
    __tablename__ = "merchant_provider_credentials"
    __table_args__ = (
        UniqueConstraint("merchant_provider_config_id", "credential_key", name="uq_merchant_provider_credentials_config_key"),
    )

    id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True, autoincrement=True)
    merchant_provider_config_id: Mapped[int] = mapped_column(
        Integer, ForeignKey("merchant_provider_configs.id"), nullable=False, index=True
    )
    credential_key: Mapped[str] = mapped_column(String(100), nullable=False)
    credential_value: Mapped[str] = mapped_column(Text, nullable=False)
    created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False)
    updated_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True, onupdate=func.now())

    config: Mapped["MerchantProviderConfig"] = relationship("MerchantProviderConfig", back_populates="credentials")
