from datetime import datetime
from app.extensions import db


# ═══════════════════════════════════════════════════════════════════════════════
#  Society Project Model
# ═══════════════════════════════════════════════════════════════════════════════

class SocietyProject(db.Model):
    """User-submitted projects for society viewing."""
    __tablename__ = "society_projects"

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)

    # Title and Description
    title = db.Column(db.String(500), nullable=False)
    title_ar = db.Column(db.String(500))
    slug = db.Column(db.String(255), unique=True, nullable=False, index=True)
    description = db.Column(db.Text)
    description_ar = db.Column(db.Text)

    # Content
    content = db.Column(db.Text)  # Markdown content
    video_url = db.Column(db.String(500))
    video_path = db.Column(db.String(500))
    pdf_path = db.Column(db.String(500))
    cover_image = db.Column(db.String(500))

    # NotebookLM shared data
    notebooklm_data = db.Column(db.JSON)  # Shared AI content/study data

    # Project settings
    status = db.Column(db.String(20), default="pending")  # pending, approved, rejected, published
    is_featured = db.Column(db.Boolean, default=False)
    view_count = db.Column(db.Integer, default=0)

    # Flexible sponsorship tiers (JSON for customization per project)
    # Format: {"platinum": {"min": 50000, "logo_size": 120, "placement": "top"},
    #           "gold": {"min": 20000, "logo_size": 90, "placement": "below_platinum"},
    #           "silver": {"min": 10000, "logo_size": 60, "placement": "below_gold"},
    #           "bronze": {"min": 5000, "logo_size": 40, "placement": "footer"}}
    sponsorship_tiers = db.Column(db.JSON)

    # Default sponsorship tiers (fallback)
    sponsorship_target = db.Column(db.Integer)  # Target sponsorship amount
    currency = db.Column(db.String(10), default="SAR")

    # Timestamps
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    published_at = db.Column(db.DateTime)

    # Relationships
    user = db.relationship("User", backref="society_projects")
    sponsors = db.relationship("SocietyProjectSponsor", back_populates="project", cascade="all, delete-orphan")
    likes = db.relationship("SocietyProjectLike", back_populates="project", cascade="all, delete-orphan")
    comments = db.relationship("SocietyProjectComment", back_populates="project", cascade="all, delete-orphan")

    @property
    def default_tiers(self):
        """Get default sponsorship tiers."""
        return self.sponsorship_tiers or {
            "platinum": {"min": 50000, "logo_size": 120, "placement": "top", "label_ar": "بلاتيني"},
            "gold": {"min": 20000, "logo_size": 90, "placement": "below_platinum", "label_ar": "ذهبي"},
            "silver": {"min": 10000, "logo_size": 60, "placement": "below_gold", "label_ar": "فضي"},
            "bronze": {"min": 5000, "logo_size": 40, "placement": "footer", "label_ar": "برونزي"}
        }

    @property
    def approved_sponsors(self):
        """Get approved sponsors ordered by tier."""
        tier_order = {"platinum": 1, "gold": 2, "silver": 3, "bronze": 4}
        return sorted(
            [s for s in self.sponsors if s.status == "approved"],
            key=lambda x: tier_order.get(x.tier, 99)
        )

    @property
    def like_count(self):
        """Get total likes."""
        return len(self.likes)

    @property
    def comment_count(self):
        """Get total comments."""
        return len(self.comments)

    @property
    def total_sponsorship(self):
        """Calculate total sponsorship amount."""
        return sum(s.monthly_contribution or 0 for s in self.approved_sponsors)

    def get_tier_config(self, tier_name):
        """Get configuration for a specific tier."""
        return self.default_tiers.get(tier_name, {})

    def __repr__(self):
        return f"<SocietyProject {self.id}: {self.title}>"


# ═══════════════════════════════════════════════════════════════════════════════
#  Society Project Sponsor Model
# ═══════════════════════════════════════════════════════════════════════════════

class SocietyProjectSponsor(db.Model):
    """Sponsors for society projects."""
    __tablename__ = "society_project_sponsors"

    id = db.Column(db.Integer, primary_key=True)
    project_id = db.Column(db.Integer, db.ForeignKey("society_projects.id"), nullable=False)
    sponsor_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)

    # Sponsor details
    sponsor_type = db.Column(db.String(50), default="individual")  # factory, investor, individual
    tier = db.Column(db.String(20), default="bronze")  # platinum, gold, silver, bronze
    logo_url = db.Column(db.String(500))
    website_url = db.Column(db.String(500))

    # Status and amount
    status = db.Column(db.String(20), default="pending")  # pending, approved, rejected
    monthly_contribution = db.Column(db.Numeric(10, 2))
    notes = db.Column(db.Text)

    # Timestamps
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    approved_at = db.Column(db.DateTime)

    # Relationships
    project = db.relationship("SocietyProject", back_populates="sponsors")
    sponsor = db.relationship("User", backref="sponsorships")

    @property
    def tier_label_ar(self):
        """Get Arabic tier label."""
        labels = {
            "platinum": "بلاتيني",
            "gold": "ذهبي",
            "silver": "فضي",
            "bronze": "برونزي"
        }
        return labels.get(self.tier, self.tier)

    @property
    def sponsor_type_ar(self):
        """Get Arabic sponsor type label."""
        labels = {
            "factory": "مصنع",
            "investor": "مستثمر",
            "individual": "فردي"
        }
        return labels.get(self.sponsor_type, self.sponsor_type)

    def __repr__(self):
        return f"<SocietyProjectSponsor {self.id}: {self.project_id} - {self.sponsor_id}>"


# ═══════════════════════════════════════════════════════════════════════════════
#  Society Project Like Model
# ═══════════════════════════════════════════════════════════════════════════════

class SocietyProjectLike(db.Model):
    """Likes for society projects."""
    __tablename__ = "society_project_likes"

    id = db.Column(db.Integer, primary_key=True)
    project_id = db.Column(db.Integer, db.ForeignKey("society_projects.id"), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

    # Relationships
    project = db.relationship("SocietyProject", back_populates="likes")
    user = db.relationship("User", backref="liked_projects")

    # Unique constraint
    __table_args__ = (db.UniqueConstraint('project_id', 'user_id', name='uq_project_like'),)

    def __repr__(self):
        return f"<SocietyProjectLike {self.id}: User {self.user_id} -> Project {self.project_id}>"


# ═══════════════════════════════════════════════════════════════════════════════
#  Society Project Comment Model
# ═══════════════════════════════════════════════════════════════════════════════

class SocietyProjectComment(db.Model):
    """Comments for society projects."""
    __tablename__ = "society_project_comments"

    id = db.Column(db.Integer, primary_key=True)
    project_id = db.Column(db.Integer, db.ForeignKey("society_projects.id"), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    parent_id = db.Column(db.Integer, db.ForeignKey("society_project_comments.id"))
    content = db.Column(db.Text, nullable=False)
    is_deleted = db.Column(db.Boolean, default=False)

    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

    # Relationships
    project = db.relationship("SocietyProject", back_populates="comments", foreign_keys=[project_id])
    user = db.relationship("User", backref="society_comments")
    parent = db.relationship("SocietyProjectComment", remote_side=[id], backref="replies")

    @property
    def is_reply(self):
        """Check if this is a reply to another comment."""
        return self.parent_id is not None

    def __repr__(self):
        return f"<SocietyProjectComment {self.id}: Project {self.project_id}>"
