from datetime import datetime
from flask_login import UserMixin
from app import db, login_manager


class Admin(UserMixin, db.Model):
    """Admin user allowed to log in to the control panel."""
    __tablename__ = "admins"

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password_hash = db.Column(db.String(255), nullable=False)


@login_manager.user_loader
def load_user(user_id):
    return Admin.query.get(int(user_id))


class SiteSetting(db.Model):
    """Single-row table holding every piece of editable, site-wide content:
    header contact info, social links, home page background/photo/text,
    about page photo/text, footer details. Everything the admin can tweak
    without touching code lives here."""
    __tablename__ = "site_settings"

    id = db.Column(db.Integer, primary_key=True)

    site_name = db.Column(db.String(150), default="Pashupati Legal Services")
    logo_path = db.Column(db.String(255), default="")

    # Header / footer contact + social
    phone = db.Column(db.String(50), default="")
    email = db.Column(db.String(120), default="")
    address = db.Column(db.String(255), default="")
    office_hours = db.Column(db.String(150), default="")
    registration_number = db.Column(db.String(80), default="")
    whatsapp_number = db.Column(db.String(50), default="+9779800000000")
    facebook_url = db.Column(db.String(255), default="")
    instagram_url = db.Column(db.String(255), default="")

    # Home page
    home_background_path = db.Column(db.String(255), default="")
    home_photo_path = db.Column(db.String(255), default="")
    home_headline = db.Column(db.String(255), default="")
    home_description = db.Column(db.Text, default="")

    # Home page background video (takes priority over home_background_path if set)
    home_background_video_path = db.Column(db.String(255), default="")
    home_background_video_url = db.Column(db.String(500), default="")

    # About page
    about_photo_path = db.Column(db.String(255), default="")
    about_description = db.Column(db.Text, default="")

    # About page — "Message from the MD" section
    md_name = db.Column(db.String(120), default="")
    md_title = db.Column(db.String(150), default="")
    md_photo_path = db.Column(db.String(255), default="")
    md_photo_url = db.Column(db.String(500), default="")
    md_message = db.Column(db.Text, default="")

    # Page header banners — each can use an uploaded photo OR an external link
    about_header_image_path = db.Column(db.String(255), default="")
    about_header_image_url = db.Column(db.String(500), default="")
    publications_header_image_path = db.Column(db.String(255), default="")
    publications_header_image_url = db.Column(db.String(500), default="")
    team_header_image_path = db.Column(db.String(255), default="")
    team_header_image_url = db.Column(db.String(500), default="")
    connect_header_image_path = db.Column(db.String(255), default="")
    connect_header_image_url = db.Column(db.String(500), default="")

    # Connect page — map location (paste the "Embed a map" src from Google Maps)
    map_embed_url = db.Column(
        db.String(1000),
        default="https://www.google.com/maps?q=Kathmandu,Nepal&output=embed",
    )

    # Footer
    footer_description = db.Column(db.Text, default=(
        "Pashupati Legal Services is committed to delivering trusted, "
        "ethical and effective legal solutions to clients across Nepal."
    ))

    @staticmethod
    def get_settings():
        return SiteSetting.query.first()


class PracticeArea(db.Model):
    """A box in the 'Areas of Practice' section on the home page."""
    __tablename__ = "practice_areas"

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(120), nullable=False)
    description = db.Column(db.Text, default="")
    icon = db.Column(db.String(50), default="scale")  # simple icon keyword
    image_path = db.Column(db.String(255), default="")
    order = db.Column(db.Integer, default=0)


class Partner(db.Model):
    """Logo shown in the 'Trusted Partners' strip on the home page."""
    __tablename__ = "partners"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(120), nullable=False)
    logo_path = db.Column(db.String(255), nullable=False)
    order = db.Column(db.Integer, default=0)


class AboutValue(db.Model):
    """One of the three core values shown on the About Us page."""
    __tablename__ = "about_values"

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(120), nullable=False)
    description = db.Column(db.Text, default="")
    icon = db.Column(db.String(50), default="shield")
    order = db.Column(db.Integer, default=0)


class TeamMember(db.Model):
    """Person listed on the Our Team page."""
    __tablename__ = "team_members"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(120), nullable=False)
    title = db.Column(db.String(150), default="")
    phone = db.Column(db.String(50), default="")
    photo_path = db.Column(db.String(255), default="")
    bio = db.Column(db.Text, default="")
    order = db.Column(db.Integer, default=0)


class Publication(db.Model):
    """Blog post / publication entry, shareable to social media.

    Field names kept from the original 'Publication' model for backward
    compatibility with existing data and routes, but this now backs the
    full blog post editor: topic=Post Title, description=Short Description,
    cover_image_path=Feature Picture, plus author, feature video, an
    "about this blog" section, and repeatable subtopics.
    """
    __tablename__ = "publications"

    id = db.Column(db.Integer, primary_key=True)
    topic = db.Column(db.String(200), nullable=False)
    author = db.Column(db.String(150), default="")
    description = db.Column(db.Text, default="")
    cover_image_path = db.Column(db.String(255), default="")

    feature_video_url = db.Column(db.String(500), default="")   # YouTube / Vimeo link
    feature_video_path = db.Column(db.String(255), default="")  # uploaded video file

    about_description = db.Column(db.Text, default="")
    about_photo_path = db.Column(db.String(255), default="")

    is_published = db.Column(db.Boolean, default=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

    subtopics = db.relationship(
        "PublicationSubtopic",
        backref="publication",
        order_by="PublicationSubtopic.order",
        cascade="all, delete-orphan",
    )


class PublicationSubtopic(db.Model):
    """One 'point + photo' block shown side by side within a blog post."""
    __tablename__ = "publication_subtopics"

    id = db.Column(db.Integer, primary_key=True)
    publication_id = db.Column(db.Integer, db.ForeignKey("publications.id"), nullable=False)
    description = db.Column(db.Text, default="")
    photo_path = db.Column(db.String(255), default="")
    order = db.Column(db.Integer, default=0)


class ContactMessage(db.Model):
    """Message submitted through the Connect Us page form."""
    __tablename__ = "contact_messages"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(120), nullable=False)
    email = db.Column(db.String(120), nullable=False)
    phone = db.Column(db.String(50), default="")
    subject = db.Column(db.String(200), default="")
    message = db.Column(db.Text, nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    is_read = db.Column(db.Boolean, default=False)
