from datetime import datetime
from app.extensions import db


class SocialAccount(db.Model):
    __tablename__ = "social_accounts"
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    platform = db.Column(db.String(50), nullable=False)
    access_token = db.Column(db.Text, nullable=True)
    refresh_token = db.Column(db.Text, nullable=True)
    platform_user_id = db.Column(db.String(255), nullable=True)
    platform_username = db.Column(db.String(255), nullable=True)
    token_expires_at = db.Column(db.DateTime, nullable=True)
    connected_at = db.Column(db.DateTime, default=datetime.utcnow)
    user = db.relationship("User", backref=db.backref("social_accounts", lazy="dynamic"))


class VideoHistory(db.Model):
    """Store previous video versions when users recreate videos"""
    __tablename__ = "video_history"
    id = db.Column(db.Integer, primary_key=True)
    campaign_id = db.Column(db.Integer, db.ForeignKey("campaigns.id"), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)

    # Video details
    video_url = db.Column(db.Text, nullable=True)
    video_id = db.Column(db.String(255), nullable=True)
    video_with_text_url = db.Column(db.Text, nullable=True)

    # Settings used for this video
    video_language = db.Column(db.String(10), nullable=True)
    video_duration = db.Column(db.Integer, nullable=True)
    video_provider = db.Column(db.String(50), nullable=True)

    # Script snapshot
    script_snapshot = db.Column(db.Text, nullable=True)

    # Metadata
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    is_deleted = db.Column(db.Boolean, default=False)  # Soft delete
    file_removed = db.Column(db.Boolean, default=False)  # Track if physical file was deleted

    # Relationships
    campaign = db.relationship("Campaign", backref=db.backref("video_history", lazy="dynamic"))
    user = db.relationship("User", backref=db.backref("video_history", lazy="dynamic"))


class Campaign(db.Model):
    __tablename__ = "campaigns"
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    report_id = db.Column(db.Integer, db.ForeignKey("reports.id"), nullable=True)
    name = db.Column(db.String(500), nullable=False)
    video_url = db.Column(db.Text, nullable=True)
    video_id = db.Column(db.String(255), nullable=True)
    video_provider = db.Column(db.String(50), nullable=True)
    video_language = db.Column(db.String(10), default="ar")  # Language for voice and text (ar/en)
    script = db.Column(db.Text, nullable=True)
    storyboard_json = db.Column(db.JSON, nullable=True)
    user_script_notes = db.Column(db.Text, nullable=True)
    video_duration = db.Column(db.Integer, nullable=True)
    text_overlays = db.Column(db.JSON, nullable=True)  # Store text overlay configurations
    overlay_instructions = db.Column(db.JSON, nullable=True)  # Store font/style instructions
    video_with_text_url = db.Column(db.Text, nullable=True)  # URL of video with text overlays applied
    status = db.Column(db.String(50), default="draft")
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    user = db.relationship("User", backref=db.backref("campaigns", lazy="dynamic"))
    report = db.relationship("Report", backref=db.backref("campaigns", lazy="dynamic"))
    posts = db.relationship("CampaignPost", backref="campaign", lazy="dynamic")


class CampaignPost(db.Model):
    __tablename__ = "campaign_posts"
    id = db.Column(db.Integer, primary_key=True)
    campaign_id = db.Column(db.Integer, db.ForeignKey("campaigns.id"), nullable=False)
    platform = db.Column(db.String(50), nullable=False)
    publish_mode = db.Column(db.String(20), default="my_accounts")  # my_accounts / sponsor / paid_ad
    post_id = db.Column(db.String(255), nullable=True)
    post_url = db.Column(db.Text, nullable=True)
    caption = db.Column(db.Text, nullable=True)
    scheduled_at = db.Column(db.DateTime, nullable=True)
    published_at = db.Column(db.DateTime, nullable=True)
    status = db.Column(db.String(50), default="pending")
    metrics = db.relationship("CampaignMetrics", backref="post", lazy="dynamic")


class CampaignMetrics(db.Model):
    __tablename__ = "campaign_metrics"
    id = db.Column(db.Integer, primary_key=True)
    post_id = db.Column(db.Integer, db.ForeignKey("campaign_posts.id"), nullable=False)
    views = db.Column(db.Integer, default=0)
    likes = db.Column(db.Integer, default=0)
    comments = db.Column(db.Integer, default=0)
    shares = db.Column(db.Integer, default=0)
    ctr = db.Column(db.Float, default=0.0)
    fetched_at = db.Column(db.DateTime, default=datetime.utcnow)


class Website(db.Model):
    __tablename__ = "websites"
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    report_id = db.Column(db.Integer, db.ForeignKey("reports.id"), nullable=True)
    tenant_id = db.Column(db.String(255), nullable=True)
    subdomain = db.Column(db.String(255), nullable=True)
    custom_domain = db.Column(db.String(500), nullable=True)
    status = db.Column(db.String(50), default="pending")
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    user = db.relationship("User", backref=db.backref("websites", lazy="dynamic"))
    report = db.relationship("Report", backref=db.backref("website", uselist=False))


class WhatsAppInstance(db.Model):
    __tablename__ = "whatsapp_instances"
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    instance_name = db.Column(db.String(255), nullable=False)
    api_url = db.Column(db.String(500), nullable=False)
    api_key = db.Column(db.Text, nullable=False)
    phone_number = db.Column(db.String(50), nullable=True)
    status = db.Column(db.String(50), default="disconnected")
    connected_at = db.Column(db.DateTime, nullable=True)
    user = db.relationship("User", backref=db.backref("whatsapp_instances", lazy="dynamic"))


class WhatsAppCampaign(db.Model):
    __tablename__ = "whatsapp_campaigns"
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    instance_id = db.Column(db.Integer, db.ForeignKey("whatsapp_instances.id"), nullable=False)
    name = db.Column(db.String(500), nullable=False)
    message_template = db.Column(db.Text, nullable=False)
    media_url = db.Column(db.Text, nullable=True)
    contacts_json = db.Column(db.JSON, nullable=True)
    sent_count = db.Column(db.Integer, default=0)
    delivered_count = db.Column(db.Integer, default=0)
    read_count = db.Column(db.Integer, default=0)
    status = db.Column(db.String(50), default="draft")
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    user = db.relationship("User", backref=db.backref("whatsapp_campaigns", lazy="dynamic"))
    instance = db.relationship("WhatsAppInstance")


class LandingPage(db.Model):
    __tablename__ = "landing_pages"
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    report_id = db.Column(db.Integer, db.ForeignKey("reports.id"), nullable=False)
    name = db.Column(db.String(500), nullable=False)
    slug = db.Column(db.String(255), unique=True, nullable=True)
    status = db.Column(db.String(50), default="draft")
    content_ar = db.Column(db.JSON, nullable=True)
    content_en = db.Column(db.JSON, nullable=True)
    design_style = db.Column(db.String(50), default="modern")
    color_scheme = db.Column(db.String(50), default="auto")
    layout_type = db.Column(db.String(50), default="single_column")
    user_preferences = db.Column(db.JSON, nullable=True)
    hero_image_url = db.Column(db.String(1000), nullable=True)
    additional_images = db.Column(db.JSON, nullable=True)
    custom_domain = db.Column(db.String(500), nullable=True)
    jadwa_subdomain = db.Column(db.String(255), nullable=True)
    is_public = db.Column(db.Boolean, default=False)
    published_at = db.Column(db.DateTime, nullable=True)
    generation_metadata = db.Column(db.JSON, nullable=True)
    seo_metadata = db.Column(db.JSON, nullable=True)
    analytics_data = db.Column(db.JSON, nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    user = db.relationship("User", backref=db.backref("landing_pages", lazy="dynamic"))
    report = db.relationship("Report", backref=db.backref("landing_pages", lazy="dynamic"))
