import datetime
from sqlalchemy import (
    Column, Integer, String, Text, Boolean, DateTime, ForeignKey, Table, Date
)
from sqlalchemy.orm import relationship
from werkzeug.security import generate_password_hash, check_password_hash
from database import Base

article_tags = Table(
    "article_tags", Base.metadata,
    Column("article_id", Integer, ForeignKey("articles.id", ondelete="CASCADE"), primary_key=True),
    Column("tag_id", Integer, ForeignKey("tags.id", ondelete="CASCADE"), primary_key=True),
)


class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True)
    username = Column(String(80), unique=True, nullable=False, index=True)
    email = Column(String(120), unique=True, nullable=False)
    password_hash = Column(String(256), nullable=False)
    display_name = Column(String(120), default="")
    display_name_ar = Column(String(120), default="")
    role = Column(String(20), default="editor")  # admin, editor
    is_active = Column(Boolean, default=True)
    avatar = Column(String(255), default="")
    created_at = Column(DateTime, default=datetime.datetime.utcnow)
    articles = relationship("Article", backref="author", lazy="dynamic")

    def set_password(self, pw):
        self.password_hash = generate_password_hash(pw)

    def check_password(self, pw):
        return check_password_hash(self.password_hash, pw)


class Category(Base):
    __tablename__ = "categories"
    id = Column(Integer, primary_key=True)
    name_en = Column(String(100), nullable=False)
    name_ar = Column(String(100), nullable=False)
    slug = Column(String(120), unique=True, nullable=False, index=True)
    description_en = Column(Text, default="")
    description_ar = Column(Text, default="")
    color = Column(String(7), default="#c70000")
    icon = Column(String(50), default="")
    order = Column(Integer, default=0)
    is_active = Column(Boolean, default=True)
    articles = relationship("Article", backref="category", lazy="dynamic")


class Tag(Base):
    __tablename__ = "tags"
    id = Column(Integer, primary_key=True)
    name_en = Column(String(80), nullable=False)
    name_ar = Column(String(80), nullable=False)
    slug = Column(String(100), unique=True, nullable=False, index=True)


class Article(Base):
    __tablename__ = "articles"
    id = Column(Integer, primary_key=True)
    title_en = Column(String(300), nullable=False)
    title_ar = Column(String(300), nullable=False)
    subtitle_en = Column(String(500), default="")
    subtitle_ar = Column(String(500), default="")
    content_en = Column(Text, default="")
    content_ar = Column(Text, default="")
    slug = Column(String(350), unique=True, nullable=False, index=True)
    status = Column(String(20), default="draft", index=True)  # draft, pending, scheduled, published, rejected
    featured_image = Column(String(255), default="")
    featured_image_caption = Column(String(300), default="")
    video_url = Column(String(500), default="")
    youtube_url = Column(String(500), default="")
    audio_url = Column(String(500), default="")
    is_featured = Column(Boolean, default=False)
    is_breaking = Column(Boolean, default=False)
    views = Column(Integer, default=0)
    meta_description_en = Column(String(300), default="")
    meta_description_ar = Column(String(300), default="")
    og_image = Column(String(255), default="")
    created_at = Column(DateTime, default=datetime.datetime.utcnow)
    updated_at = Column(DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow)
    published_at = Column(DateTime, nullable=True)
    scheduled_at = Column(DateTime, nullable=True)
    author_id = Column(Integer, ForeignKey("users.id"), nullable=False)
    category_id = Column(Integer, ForeignKey("categories.id"), nullable=False)
    tags = relationship("Tag", secondary=article_tags, backref="articles", lazy="joined")


class Advertisement(Base):
    __tablename__ = "advertisements"
    id = Column(Integer, primary_key=True)
    title = Column(String(200), nullable=False)
    image_url = Column(String(500), default="")
    html_content = Column(Text, default="")
    target_url = Column(String(500), default="")
    placement = Column(String(30), nullable=False, index=True)  # header, sidebar, in_article, between_sections
    category_id = Column(Integer, ForeignKey("categories.id"), nullable=True)
    impressions = Column(Integer, default=0)
    clicks = Column(Integer, default=0)
    is_active = Column(Boolean, default=True)
    start_date = Column(Date, nullable=True)
    end_date = Column(Date, nullable=True)
    created_at = Column(DateTime, default=datetime.datetime.utcnow)
    category = relationship("Category", backref="ads")


class NewsletterSubscriber(Base):
    __tablename__ = "newsletter_subscribers"
    id = Column(Integer, primary_key=True)
    email = Column(String(200), unique=True, nullable=False)
    is_active = Column(Boolean, default=True)
    subscribed_at = Column(DateTime, default=datetime.datetime.utcnow)
    unsubscribe_token = Column(String(100), unique=True, nullable=False)


class PushSubscription(Base):
    __tablename__ = "push_subscriptions"
    id = Column(Integer, primary_key=True)
    endpoint = Column(Text, nullable=False, unique=True)
    p256dh = Column(String(300), default="")
    auth = Column(String(200), default="")
    created_at = Column(DateTime, default=datetime.datetime.utcnow)


class SiteSettings(Base):
    __tablename__ = "site_settings"
    id = Column(Integer, primary_key=True)
    key = Column(String(100), unique=True, nullable=False, index=True)
    value = Column(Text, default="")
