from flask import render_template, redirect, url_for, flash, request, jsonify, g
from flask_login import login_required, current_user
from app.notes import notes_bp
from app.auth.decorators import role_required
from app.models import HukumBacaan, User
from app.models.verse_note import VerseNote
from app.extensions import db


@notes_bp.route('/')
@login_required
@role_required('admin', 'guru', 'murid')
def index():
    """List all notes for the current user."""
    page = request.args.get('page', 1, type=int)
    per_page = 15

    if current_user.is_murid:
        # Show notes created by them OR sent to them by gurus
        query = VerseNote.query.filter(
            (VerseNote.user_id == current_user.id) | (VerseNote.murid_id == current_user.id)
        ).order_by(VerseNote.created_at.desc())
    else:
        # Admins and Gurus see notes they created
        query = VerseNote.query.filter_by(user_id=current_user.id).order_by(VerseNote.created_at.desc())
        
    pagination = query.paginate(page=page, per_page=per_page, error_out=False)

    return render_template('notes/index.html', pagination=pagination)


@notes_bp.route('/create', methods=['POST'])
@login_required
@role_required('admin', 'guru', 'murid')
def create():
    """Create a new verse note."""
    verse_key = request.form.get('verse_key', '').strip()
    surah_number = request.form.get('surah_number', 0, type=int)
    surah_name = request.form.get('surah_name', '').strip()
    verse_text = request.form.get('verse_text', '').strip()
    word_text = request.form.get('word_text', '').strip()
    word_translation = request.form.get('word_translation', '').strip()
    word_transliteration = request.form.get('word_transliteration', '').strip()
    word_position = request.form.get('word_position', 0, type=int)
    content = request.form.get('content', '').strip()
    murid_id = request.form.get('murid_id', type=int)
    hukum_bacaan_id = request.form.get('hukum_bacaan_id', type=int)

    if not verse_key:
        if request.is_json or request.headers.get('Accept') == 'application/json':
            return jsonify({'success': False, 'message': 'Ayat harus dipilih.'}), 400
        flash('Ayat harus dipilih.', 'danger')
        return redirect(url_for('quran.read_surah', surah_number=surah_number))

    if not content and not hukum_bacaan_id:
        if request.is_json or request.headers.get('Accept') == 'application/json':
            return jsonify({'success': False, 'message': 'Isi catatan atau pilih hukum bacaan.'}), 400
        flash('Isi catatan atau pilih hukum bacaan.', 'danger')
        return redirect(url_for('quran.read_surah', surah_number=surah_number))

    target_murid_id = None
    if murid_id:
        if not current_user.is_guru:
            return _note_error_response('Hanya guru yang dapat mengirim catatan ke murid.', surah_number, 403)
        target_murid = User.query.filter_by(id=murid_id, school_id=g.school_id, role='murid', is_active=True).first()
        if not target_murid:
            return _note_error_response('Murid tidak valid.', surah_number, 400)
        target_murid_id = target_murid.id

    target_hukum_bacaan_id = None
    if hukum_bacaan_id:
        if not current_user.is_guru:
            return _note_error_response('Hanya guru yang dapat memilih hukum bacaan.', surah_number, 403)
        hukum = HukumBacaan.query.filter_by(id=hukum_bacaan_id, school_id=g.school_id).first()
        if not hukum:
            return _note_error_response('Hukum bacaan tidak valid.', surah_number, 400)
        target_hukum_bacaan_id = hukum.id

    note = VerseNote(
        user_id=current_user.id,
        murid_id=target_murid_id,
        hukum_bacaan_id=target_hukum_bacaan_id,
        verse_key=verse_key,
        surah_number=surah_number,
        surah_name=surah_name,
        verse_text=verse_text,
        word_text=word_text or None,
        word_translation=word_translation or None,
        word_transliteration=word_transliteration or None,
        word_position=word_position or None,
        content=content,
    )
    db.session.add(note)
    db.session.commit()

    if request.is_json or request.headers.get('Accept') == 'application/json':
        return jsonify({'success': True, 'message': 'Catatan berhasil disimpan.'})

    flash('Catatan berhasil disimpan.', 'success')
    return redirect(url_for('quran.read_surah', surah_number=surah_number))


def _note_error_response(message, surah_number, status_code):
    if request.is_json or request.headers.get('Accept') == 'application/json':
        return jsonify({'success': False, 'message': message}), status_code
    flash(message, 'danger')
    return redirect(url_for('quran.read_surah', surah_number=surah_number))


@notes_bp.route('/<int:note_id>/edit', methods=['GET', 'POST'])
@login_required
@role_required('admin', 'guru', 'murid')
def edit(note_id):
    """Edit a note."""
    note = VerseNote.query.get_or_404(note_id)
    if note.user_id != current_user.id:
        flash('Anda tidak memiliki akses untuk mengedit catatan ini.', 'danger')
        return redirect(url_for('notes.index'))

    if request.method == 'POST':
        note.content = request.form.get('content', '').strip()
        db.session.commit()
        flash('Catatan berhasil diperbarui.', 'success')
        return redirect(url_for('notes.index'))

    return render_template('notes/edit.html', note=note)


@notes_bp.route('/<int:note_id>/delete', methods=['POST'])
@login_required
@role_required('admin', 'guru', 'murid')
def delete(note_id):
    """Delete a note."""
    note = VerseNote.query.get_or_404(note_id)
    if note.user_id != current_user.id:
        flash('Anda tidak memiliki akses untuk menghapus catatan ini.', 'danger')
        return redirect(url_for('notes.index'))

    surah_number = note.surah_number
    db.session.delete(note)
    db.session.commit()
    flash('Catatan berhasil dihapus.', 'success')

    if request.referrer and 'quran' in request.referrer:
        return redirect(url_for('quran.read_surah', surah_number=surah_number))
    return redirect(url_for('notes.index'))
