import enum
from datetime import datetime
from typing import Optional

from sqlalchemy import DECIMAL, Boolean, Column, DateTime
from sqlalchemy import Enum
from sqlalchemy import Enum as SAEnum
from sqlalchemy import ForeignKey, Integer, String, Text, UniqueConstraint
from sqlalchemy.orm import relationship
from src.apps.wine.wine.models.wine import *

from src.apps.match.enums import (
    RequestType,
    Separator,
    Source,
    SourceEnum,
    Status,
    WineDbStatus,
)
from src.core.models.base import Base 

class Producer(Base):
    __tablename__ = "producers"

    id = Column(Integer, primary_key=True, index=True)
    literal = Column(String, nullable=True)
    name = Column(Text, nullable=True)
    name_show = Column(Text, nullable=True)
    mongo_id = Column(String, unique=True, nullable=True)
    source = Column(SAEnum(Source), nullable=True)

    deleted_at = Column(DateTime, nullable=True)
    date_created = Column(DateTime, default=datetime.utcnow)
    last_updated = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

    # Relationships
    producer_keyword = relationship("ProducerKeyword", uselist=False, back_populates="producer")
    wine_dbs = relationship("WineDb", back_populates="producer")
    producer_noises = relationship("ProducerNoise", back_populates="producer")
    winesdb = relationship("WineDb", back_populates="producer")



class ProducerKeyword(Base):
    __tablename__ = "producer_keywords"
    __table_args__ = (UniqueConstraint("producer_id", name="uq_producer_keyword_producer"),)

    id = Column(Integer, primary_key=True, index=True)
    literal = Column(String, nullable=True)
    producer_id = Column(Integer, ForeignKey("producers.id"), nullable=False, unique=True)
    keyword = Column(Text, nullable=True)
    source = Column(SAEnum(Source), nullable=True)

    deleted_at = Column(DateTime, nullable=True)
    date_created = Column(DateTime, default=datetime.utcnow)
    last_updated = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

    # Relationships
    producer = relationship("Producer", back_populates="producer_keyword")



class ProducerNoise(Base):
    __tablename__ = "producer_noises"
    __table_args__ = (UniqueConstraint("producer_id", "noise", name="uq_producer_noise_producer_noise"),)

    id = Column(Integer, primary_key=True, index=True)
    literal = Column(String, nullable=True)
    noise = Column(Text, nullable=False)
    producer_id = Column(Integer, ForeignKey("producers.id"), nullable=False)

    deleted_at = Column(DateTime, nullable=True)
    date_created = Column(DateTime, default=datetime.utcnow, nullable=True)
    last_updated = Column(DateTime, default=datetime.utcnow, nullable=True, onupdate=datetime.utcnow)

    # Relationships
    producer = relationship("Producer", back_populates="producer_noises")

