from sqlalchemy import Column, Integer, String, Text, DateTime, JSON, Float, Boolean, CheckConstraint
from .engine import Base
from datetime import datetime
from sqlalchemy.dialects.postgresql import ARRAY


class Users(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True, autoincrement=True)  # Внутренний ID записи
    user_id = Column(Integer, nullable=False, unique=True)


class AutoInfo(Base):
    __tablename__ = 'autoinfo'

    id = Column(Integer, primary_key=True, autoincrement=True)
    ad_id = Column(String(50), unique=True, nullable=False)
    name = Column(String(255), nullable=False)
    year = Column(Integer, nullable=True)
    usd_price = Column(Float, nullable=True)
    publish_time = Column(String(100), nullable=True)
    all_phones = Column(JSON, nullable=True)  # Список номеров хранится в формате JSON
    link = Column(Text, nullable=False)
    spam = Column(Boolean, default=False, nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)  # Дата и время добавления



class filtersettings(Base):
    __tablename__ = 'filterUser'

    id = Column(Integer, primary_key=True, autoincrement=True)
    user_id = Column(Integer, nullable=False, unique=True)
    typeavto = Column(String(50), nullable=False)
    region_id = Column(JSON, nullable=True)
    year_first = Column(Integer, nullable=True)
    year_second = Column(Integer, nullable=True)
    price_first = Column(Float, nullable=True)
    price_second = Column(Float, nullable=True)


# Таблица статистики
class MessageLog(Base):
    __tablename__ = 'message_log'

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(255), nullable=False)
    link = Column(Text, nullable=False)
    is_sent = Column(Boolean, default=False, nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)  # Дата и время добавления


class MessageCounter(Base):
    __tablename__ = 'message_counter'

    id = Column(Integer, primary_key=True, autoincrement=True)
    successful = Column(Integer, default=0, nullable=False)   # количество успешно отправленных
    failed     = Column(Integer, default=0, nullable=False)   # количество неуспешных


class MessageTotals(Base):
    """
    Содержит суммарное количество всех отправленных (sent_total)
    и всех неотправленных/ошибочных (failed_total) сообщений
    за всё время работы системы. В таблице всегда ровно одна строка.
    """
    __tablename__ = 'message_totals'

    # фиксируем единственную строку с id = 1
    id = Column(Integer, primary_key=True, default=1)
    sent_total   = Column(Integer, default=0, nullable=False)
    failed_total = Column(Integer, default=0, nullable=False)

    # защита от случайной вставки второй строки
    __table_args__ = (
        CheckConstraint('id = 1', name='ck_message_totals_singleton'),
    ) 
  
  
 c l a s s   S m s S e t t i n g s ( B a s e ) :  
         " " "  
         %@0=8B  =0AB@>9:8  4;O  S M S   A>>1I5=89.  
           B01;8F5  2A5340  @>2=>  >4=0  AB@>:0  A  =0AB@>9:0<8.  
         " " "  
         _ _ t a b l e n a m e _ _   =   " s m s _ s e t t i n g s "  
  
         #   D8:A8@C5<  548=AB25==CN  AB@>:C  A  i d   =   1  
         i d   =   C o l u m n ( I n t e g e r ,   p r i m a r y _ k e y = T r u e ,   d e f a u l t = 1 )  
         s m s _ t e x t   =   C o l u m n ( T e x t ,   d e f a u l t = " T u r b o S M S   ?@825BAB2C5B  0A! " ,   n u l l a b l e = F a l s e )  
         s e n d e r _ n a m e   =   C o l u m n ( S t r i n g ( 5 0 ) ,   d e f a u l t = " B u y _ A u t o " ,   n u l l a b l e = F a l s e )  
  
         #   70I8B0  >B  A;CG09=>9  2AB02:8  2B>@>9  AB@>:8 
         _ _ t a b l e _ a r g s _ _   =   (  
                 C h e c k C o n s t r a i n t ( " i d   =   1 " ,   n a m e = " c k _ s m s _ s e t t i n g s _ s i n g l e t o n " ) ,  
         )  
 