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 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)
    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)
    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")
