from flask import Blueprint, render_template, redirect, url_for, flash, request
from flask_login import login_required, current_user
from app import db
from app.models import ClusteringSession, ClusterResult, RekomendasiSession, RekomendasiItem
from app.services.recommendation_service import build_rekomendasi

rekomendasi_bp = Blueprint('rekomendasi', __name__, url_prefix='/rekomendasi')


@rekomendasi_bp.route('/')
@login_required
def index():
    sessions = RekomendasiSession.query.order_by(
        RekomendasiSession.created_at.desc()
    ).all()
    return render_template('rekomendasi/index.html', sessions=sessions)


@rekomendasi_bp.route('/buat', methods=['GET', 'POST'])
@login_required
def buat():
    # Daftar sesi clustering yang tersedia
    clustering_sessions = ClusteringSession.query.order_by(
        ClusteringSession.created_at.desc()
    ).all()

    if request.method == 'POST':
        clustering_id = request.form.get('clustering_session_id', type=int)
        nama_sesi     = request.form.get('nama_sesi', '').strip()

        if not clustering_id:
            flash('Pilih sesi clustering terlebih dahulu.', 'danger')
            return render_template('rekomendasi/buat.html',
                                   clustering_sessions=clustering_sessions)

        cl_session = ClusteringSession.query.get_or_404(clustering_id)

        if not nama_sesi:
            nama_sesi = f'Rekomendasi — {cl_session.nama_sesi}'

        # Ambil semua hasil cluster beserta data penduduk
        results = ClusterResult.query\
            .filter_by(session_id=clustering_id)\
            .all()

        if not results:
            flash('Sesi clustering tidak memiliki hasil. Jalankan clustering terlebih dahulu.', 'danger')
            return render_template('rekomendasi/buat.html',
                                   clustering_sessions=clustering_sessions)

        try:
            # ── Generate rekomendasi ──────────────────────────────────────
            output = build_rekomendasi(cl_session, results)

            # ── Simpan ke DB ──────────────────────────────────────────────
            rek_session = RekomendasiSession(
                nama_sesi             = nama_sesi,
                clustering_session_id = clustering_id,
                ringkasan             = output['ringkasan'],
                created_by            = current_user.id,
            )
            db.session.add(rek_session)
            db.session.flush()

            for item in output['items']:
                ri = RekomendasiItem(
                    rekomendasi_session_id = rek_session.id,
                    level                  = item['level'],
                    label                  = item['label'],
                    prioritas              = item['prioritas'],
                )
                ri.kondisi  = item['kondisi']
                ri.tindakan = item['tindakan']
                db.session.add(ri)

            db.session.commit()
            flash('Rekomendasi berhasil di-generate dan disimpan!', 'success')
            return redirect(url_for('rekomendasi.detail', id=rek_session.id))

        except Exception as e:
            db.session.rollback()
            flash(f'Gagal generate rekomendasi: {str(e)}', 'danger')

    return render_template('rekomendasi/buat.html',
                           clustering_sessions=clustering_sessions)


@rekomendasi_bp.route('/detail/<int:id>')
@login_required
def detail(id):
    sesi = RekomendasiSession.query.get_or_404(id)

    # Pisahkan items per level
    items_cluster = [i for i in sesi.items if i.level == 'cluster']
    items_rw      = [i for i in sesi.items if i.level == 'rw']

    # Urutkan RW: prioritas tinggi dulu
    PRIO_ORDER = {'Prioritas Tinggi': 0, 'Prioritas Sedang': 1, 'Prioritas Rendah': 2}
    items_rw.sort(key=lambda x: PRIO_ORDER.get(x.prioritas, 9))

    return render_template('rekomendasi/detail.html',
        sesi=sesi,
        items_cluster=items_cluster,
        items_rw=items_rw,
    )


@rekomendasi_bp.route('/hapus/<int:id>', methods=['POST'])
@login_required
def hapus(id):
    sesi = RekomendasiSession.query.get_or_404(id)
    db.session.delete(sesi)
    db.session.commit()
    flash('Rekomendasi berhasil dihapus.', 'success')
    return redirect(url_for('rekomendasi.index'))