from datetime import datetime
from app.extensions import db


class GammaPresentationRequest(db.Model):
    __tablename__ = "gamma_presentations"
    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)
    gamma_id = db.Column(db.String(255), nullable=True)
    gamma_url = db.Column(db.Text, nullable=True)
    format_type = db.Column(db.String(50), default="presentation")
    theme = db.Column(db.String(100), nullable=True)
    status = db.Column(db.String(50), default="pending")
    error_message = db.Column(db.Text, nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    user = db.relationship("User", backref=db.backref("gamma_presentations", lazy="dynamic"))
    report = db.relationship("Report", backref=db.backref("gamma_presentations", lazy="dynamic"))


class CompanyRegistration(db.Model):
    __tablename__ = "company_registrations"
    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)
    company_name_ar = db.Column(db.String(500), nullable=False)
    company_name_en = db.Column(db.String(500), nullable=True)
    entity_type = db.Column(db.String(100), nullable=False)
    country = db.Column(db.String(100), default="SA")
    capital = db.Column(db.Numeric(15, 2), nullable=True)
    activities_json = db.Column(db.JSON, nullable=True)
    owners_json = db.Column(db.JSON, nullable=True)
    required_licenses_json = db.Column(db.JSON, nullable=True)
    ai_legal_advice = db.Column(db.Text, nullable=True)
    wathq_cr_number = db.Column(db.String(50), nullable=True)
    misa_license_number = db.Column(db.String(50), 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("company_registrations", lazy="dynamic"))
    report = db.relationship("Report", backref=db.backref("company_registration", uselist=False))


class IncubatorApplication(db.Model):
    __tablename__ = "incubator_applications"
    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)
    incubator_name = db.Column(db.String(500), nullable=False)
    incubator_type = db.Column(db.String(100), nullable=True)
    application_data_json = db.Column(db.JSON, nullable=True)
    ai_application_text = db.Column(db.Text, nullable=True)
    pitch_summary = db.Column(db.Text, nullable=True)
    status = db.Column(db.String(50), default="draft")
    submitted_at = db.Column(db.DateTime, nullable=True)
    response_status = db.Column(db.String(50), nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    user = db.relationship("User", backref=db.backref("incubator_applications", lazy="dynamic"))
    report = db.relationship("Report", backref=db.backref("incubator_applications", lazy="dynamic"))


class IncubatorPartner(db.Model):
    __tablename__ = "incubator_partners"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(500), nullable=False)
    name_ar = db.Column(db.String(500), nullable=True)
    logo_url = db.Column(db.Text, nullable=True)
    website_url = db.Column(db.Text, nullable=True)
    api_endpoint = db.Column(db.Text, nullable=True)
    api_key_hash = db.Column(db.Text, nullable=True)
    country = db.Column(db.String(100), default="SA")
    city = db.Column(db.String(200), nullable=True)
    sectors_json = db.Column(db.JSON, nullable=True)
    is_active = db.Column(db.Boolean, default=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)


# ── Factory Prototyping Hub ──────────────────────────────────────────

class FactoryPartner(db.Model):
    __tablename__ = "factory_partners"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(500), nullable=False)
    name_ar = db.Column(db.String(500), nullable=True)
    country = db.Column(db.String(100), default="SA")
    city = db.Column(db.String(200), nullable=True)
    website_url = db.Column(db.Text, nullable=True)
    email = db.Column(db.String(255), nullable=True)
    phone = db.Column(db.String(50), nullable=True)
    sectors_json = db.Column(db.JSON, nullable=True)
    capabilities_json = db.Column(db.JSON, nullable=True)
    min_order = db.Column(db.Integer, default=1)
    logo_url = db.Column(db.Text, nullable=True)
    description = db.Column(db.Text, nullable=True)
    description_ar = db.Column(db.Text, nullable=True)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=True)
    is_verified = db.Column(db.Boolean, default=False)
    is_active = db.Column(db.Boolean, default=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    owner = db.relationship("User", backref=db.backref("owned_factories", lazy="dynamic"), foreign_keys=[user_id])


class PrototypeRequest(db.Model):
    __tablename__ = "prototype_requests"
    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)
    factory_id = db.Column(db.Integer, db.ForeignKey("factory_partners.id"), nullable=True)
    title = db.Column(db.String(500), nullable=False)
    description = db.Column(db.Text, nullable=True)
    specifications_json = db.Column(db.JSON, nullable=True)
    quantity = db.Column(db.Integer, default=1)
    budget_range = db.Column(db.String(100), nullable=True)
    deadline = db.Column(db.DateTime, nullable=True)
    attachments_json = db.Column(db.JSON, nullable=True)
    status = db.Column(db.String(30), default="draft")
    # NDA fields
    nda_html = db.Column(db.Text, nullable=True)
    nda_status = db.Column(db.String(30), nullable=True)  # draft, pending_admin, pending_factory, approved, rejected
    nda_generated_at = db.Column(db.DateTime, nullable=True)
    nda_approved_at = db.Column(db.DateTime, nullable=True)
    # Cost estimate fields
    cost_estimate_json = db.Column(db.JSON, nullable=True)
    cost_estimate_generated_at = db.Column(db.DateTime, nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    user = db.relationship("User", backref=db.backref("prototype_requests", lazy="dynamic"))
    report = db.relationship("Report", backref=db.backref("prototype_requests", lazy="dynamic"))
    factory = db.relationship("FactoryPartner", backref=db.backref("requests", lazy="dynamic"))


class PrototypeQuote(db.Model):
    __tablename__ = "prototype_quotes"
    id = db.Column(db.Integer, primary_key=True)
    request_id = db.Column(db.Integer, db.ForeignKey("prototype_requests.id"), nullable=False)
    factory_id = db.Column(db.Integer, db.ForeignKey("factory_partners.id"), nullable=False)
    unit_price = db.Column(db.Float, default=0)
    total_price = db.Column(db.Float, default=0)
    currency = db.Column(db.String(10), default="SAR")
    lead_time_days = db.Column(db.Integer, default=0)
    notes = db.Column(db.Text, nullable=True)
    status = db.Column(db.String(30), default="pending")
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    request = db.relationship("PrototypeRequest", backref=db.backref("quotes", lazy="dynamic"))
    factory = db.relationship("FactoryPartner", backref=db.backref("quotes", lazy="dynamic"))


class PrototypeMessage(db.Model):
    __tablename__ = "prototype_messages"
    id = db.Column(db.Integer, primary_key=True)
    request_id = db.Column(db.Integer, db.ForeignKey("prototype_requests.id"), nullable=False)
    sender_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    sender_type = db.Column(db.String(20), default="user")
    message = db.Column(db.Text, nullable=False)
    attachments_json = db.Column(db.JSON, nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    request = db.relationship("PrototypeRequest", backref=db.backref("messages", lazy="dynamic"))
    sender = db.relationship("User", backref=db.backref("prototype_messages", lazy="dynamic"))


# ── IP Patent & Trademark Applications ───────────────────────────────

class PatentApplication(db.Model):
    __tablename__ = "patent_applications"
    FILING_TYPES = ["saip", "gcc", "pct"]

    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)
    filing_type = db.Column(db.String(30), default="saip")
    status = db.Column(db.String(30), default="draft")
    applicant_json = db.Column(db.JSON, nullable=True)
    inventors_json = db.Column(db.JSON, nullable=True)
    title_ar = db.Column(db.String(1000), nullable=True)
    title_en = db.Column(db.String(1000), nullable=True)
    technical_field = db.Column(db.Text, nullable=True)
    ipc_code = db.Column(db.String(50), nullable=True)
    background_art = db.Column(db.Text, nullable=True)
    invention_description = db.Column(db.Text, nullable=True)
    claims_json = db.Column(db.JSON, nullable=True)
    abstract_ar = db.Column(db.Text, nullable=True)
    abstract_en = db.Column(db.Text, nullable=True)
    drawings_description = db.Column(db.Text, nullable=True)
    priority_claims_json = db.Column(db.JSON, nullable=True)
    ai_generated_content = db.Column(db.JSON, nullable=True)
    share_token = db.Column(db.String(64), nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    user = db.relationship("User", backref=db.backref("patent_applications", lazy="dynamic"))
    report = db.relationship("Report", backref=db.backref("patent_applications", lazy="dynamic"))


class TrademarkApplication(db.Model):
    __tablename__ = "trademark_applications"
    FILING_TYPES = ["saip", "gcc", "international"]

    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)
    filing_type = db.Column(db.String(30), default="saip")
    status = db.Column(db.String(30), default="draft")
    applicant_json = db.Column(db.JSON, nullable=True)
    brand_name_ar = db.Column(db.String(500), nullable=True)
    brand_name_en = db.Column(db.String(500), nullable=True)
    logo_url = db.Column(db.Text, nullable=True)
    nice_classes_json = db.Column(db.JSON, nullable=True)
    goods_services_description = db.Column(db.Text, nullable=True)
    color_claim = db.Column(db.String(500), nullable=True)
    priority_claims_json = db.Column(db.JSON, nullable=True)
    ai_generated_content = db.Column(db.JSON, nullable=True)
    share_token = db.Column(db.String(64), nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    user = db.relationship("User", backref=db.backref("trademark_applications", lazy="dynamic"))
    report = db.relationship("Report", backref=db.backref("trademark_applications", lazy="dynamic"))
