from sqlalchemy import Column, String, Integer, Date, DateTime, ForeignKey
from sqlalchemy.orm import relationship
from utils.utils import Base
from datetime import datetime
import uuid


class Gradingservice(Base):
    __tablename__ = "grading_services"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    name = Column(String(255), nullable=False, unique=True, index=True)
    abbreviation = Column(String(50), nullable=False, unique=True, index=True)
    website_url = Column(String(500), nullable=True)
    description = Column(String(1000), nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    graded_cards = relationship("Gradedcard", back_populates="grading_service")


class Gradedcard(Base):
    __tablename__ = "graded_cards"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    listing_id = Column(String(36), ForeignKey("listings.id", ondelete="CASCADE"), nullable=False, unique=True, index=True)
    grading_service_id = Column(String(36), ForeignKey("grading_services.id", ondelete="RESTRICT"), nullable=False, index=True)
    grade = Column(String(50), nullable=False)
    certification_number = Column(String(255), nullable=True, unique=True, index=True)
    grading_date = Column(Date, nullable=True)
    population_count = Column(Integer, nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    listing = relationship("Listing", back_populates="graded_card")
    grading_service = relationship("Gradingservice", back_populates="graded_cards")