from datetime import datetime, timezone
from app.extensions import db


class CollaborationRequest(db.Model):
    __tablename__ = "collaboration_requests"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(150), nullable=False)
    email = db.Column(db.String(150), nullable=False, index=True)
    phone = db.Column(db.String(50), nullable=True)
    organisation = db.Column(db.String(150), nullable=True)
    role = db.Column(db.String(100), nullable=True)
    collaboration_type = db.Column(db.String(100), nullable=False)
    website = db.Column(db.String(255), nullable=True)
    contribution = db.Column(db.Text, nullable=False)
    support_requested = db.Column(db.Text, nullable=False)
    message = db.Column(db.Text, nullable=True)
    agreement = db.Column(db.Boolean, default=False, nullable=False)
    ip_address = db.Column(db.String(45), nullable=True, index=True)
    created_at = db.Column(
        db.DateTime(timezone=True), 
        nullable=False, 
        default=lambda: datetime.now(timezone.utc)
    )

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def __repr__(self):
        return f"<CollaborationRequest {self.name} - {self.email}>"


class ContactMessage(db.Model):
    __tablename__ = "contact_messages"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(120), nullable=False)
    email = db.Column(db.String(150), nullable=False, index=True)
    phone = db.Column(db.String(30), nullable=True)
    subject = db.Column(db.String(100), nullable=False)
    message = db.Column(db.Text, nullable=False)
    privacy_consent = db.Column(
        db.Boolean, nullable=False, default=False
    )
    ip_address = db.Column(db.String(45), nullable=True, index=True)
    created_at = db.Column(
        db.DateTime(timezone=True), 
        nullable=False, 
        default=lambda: datetime.now(timezone.utc)
    )

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def __repr__(self):
        return f"<ContactMessage {self.name} - {self.email}>"


class ProjectEnquiry(db.Model):
    __tablename__ = "project_enquiries"

    id = db.Column(db.Integer, primary_key=True)
    service = db.Column(db.String(100), nullable=False)
    project_title = db.Column(db.String(150), nullable=False)
    description = db.Column(db.Text, nullable=False)
    name = db.Column(db.String(100), nullable=False)
    email = db.Column(db.String(120), nullable=False, index=True)
    phone = db.Column(db.String(50), nullable=True)
    timeline = db.Column(db.String(50), nullable=True)
    
    # Store IP address for rate-limiting (supports IPv4 and IPv6)
    ip_address = db.Column(db.String(45), nullable=True, index=True)
    
    # Creation timestamp updated to timezone-aware UTC
    created_at = db.Column(
        db.DateTime(timezone=True), 
        nullable=False, 
        index=True,
        default=lambda: datetime.now(timezone.utc)
    )

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def __repr__(self):
        return f"<ProjectEnquiry {self.project_title} - {self.email}>"


class WebSubscribers(db.Model):
        __tablename__ = "subscribers"

        id = db.Column(db.Integer, primary_key=True)
        email = db.Column(db.String(150), nullable=False, index=True)
        ip_address = db.Column(db.String(45), nullable=True, index=True)

        created_at = db.Column(
            db.DateTime(timezone=True), 
            nullable=False, 
            default=lambda: datetime.now(timezone.utc)
        )

        def __init__(self, **kwargs):
            super().__init__(**kwargs)

        def __repr__(self):
            return f"<WebSubscribers {self.email}>"


class PreDevSubmission(db.Model):
    __tablename__ = "predev_submissions"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(120), nullable=False)
    email = db.Column(db.String(150), nullable=False, index=True)
    whatsapp = db.Column(db.String(30), nullable=False)
    location = db.Column(db.String(100), nullable=False)
    current_status = db.Column(db.String(50), nullable=False)
    primary_skill = db.Column(db.String(100), nullable=False)
    experience_level = db.Column(db.String(50), nullable=False)
    preferred_start_period = db.Column(db.String(50), nullable=False)
    development_goal = db.Column(db.Text, nullable=False)
    program_understanding = db.Column(db.Boolean, default=False, nullable=False)
    ip_address = db.Column(db.String(45), nullable=True, index=True)
    
    created_at = db.Column(
        db.DateTime(timezone=True), 
        nullable=False, 
        default=lambda: datetime.now(timezone.utc)
    )

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def __repr__(self):
        return f"<PreDevSubmission {self.name} - {self.email}>"


   