from datetime import datetime
from flask import render_template, request, redirect, url_for, flash, abort, Response
from app.extensions import db
from app.models import News, Activity, Announcement, Lecturer, ContactMessage
from app.forms import ContactForm

from app.public import bp

@bp.route("/")
def home():
    news = News.query.filter_by(status="published").filter(News.deleted_at.is_(None)).order_by(News.published_at.desc()).limit(6).all()
    activities = Activity.query.filter_by(status="published").order_by(Activity.starts_at.desc()).limit(4).all()
    lecturers = Lecturer.query.filter_by(active=True).limit(4).all()
    announcements = Announcement.query.filter_by(status="published").order_by(Announcement.published_at.desc()).limit(4).all()
    return render_template("public/home.html", news=news, activities=activities, lecturers=lecturers, announcements=announcements)

@bp.route("/profil")
def profile():
    return render_template("public/profile.html")

@bp.route("/berita")
def news_list():
    page = request.args.get("page", 1, type=int)
    q = request.args.get("q", "").strip()
    query = News.query.filter_by(status="published").filter(News.deleted_at.is_(None))
    if q:
        query = query.filter(News.title.ilike(f"%{q}%"))
    pagination = query.order_by(News.published_at.desc()).paginate(page=page, per_page=9, error_out=False)
    return render_template("public/news_list.html", pagination=pagination, q=q)

@bp.route("/berita/<slug>")
def news_detail(slug):
    item = News.query.filter_by(slug=slug, status="published").filter(News.deleted_at.is_(None)).first_or_404()
    related = News.query.filter(News.id != item.id, News.status == "published").order_by(News.published_at.desc()).limit(3).all()
    return render_template("public/news_detail.html", item=item, related=related)

@bp.route("/aktivitas")
def activities_list():
    page = request.args.get("page", 1, type=int)
    pagination = Activity.query.filter_by(status="published").order_by(Activity.starts_at.desc()).paginate(page=page, per_page=9, error_out=False)
    return render_template("public/activities.html", pagination=pagination)

@bp.route("/dosen")
def lecturers():
    from app.models import Lecturer
    items = Lecturer.query.filter_by(active=True).order_by(Lecturer.name).all()
    return render_template("public/lecturers.html", lecturers=items)

@bp.route("/akademik")
def academic():
    return render_template("public/academic.html")

@bp.route("/kontak", methods=["GET", "POST"])
def contact():
    form = ContactForm()
    if form.validate_on_submit():
        db.session.add(ContactMessage(name=form.name.data.strip(), email=form.email.data.strip(), subject=form.subject.data.strip(), message=form.message.data.strip()))
        db.session.commit()
        flash("Pesan Anda berhasil dikirim.", "success")
        return redirect(url_for("public.contact"))
    return render_template("public/contact.html", form=form)

@bp.route("/robots.txt")
def robots():
    return Response(f"User-agent: *\nAllow: /\nSitemap: {url_for('public.sitemap', _external=True)}\n", mimetype="text/plain")

@bp.route("/sitemap.xml")
def sitemap():
    urls = [url_for("public.home", _external=True), url_for("public.profile", _external=True), url_for("public.news_list", _external=True), url_for("public.activities_list", _external=True), url_for("public.lecturers", _external=True), url_for("public.academic", _external=True), url_for("public.contact", _external=True)]
    urls += [url_for("public.news_detail", slug=n.slug, _external=True) for n in News.query.filter_by(status="published").all()]
    xml = '<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' + ''.join(f"<url><loc>{u}</loc></url>" for u in urls) + "</urlset>"
    return Response(xml, mimetype="application/xml")
