from urllib.parse import urlsplit

from flask import render_template, redirect, url_for, flash, request
from flask_login import login_user, logout_user, login_required, current_user
from app.auth import auth_bp
from app.auth.forms import LoginForm, SchoolRegistrationForm, SettingsForm
from app.models.user import User
from app.models.school import School
from app.extensions import db


def _is_safe_redirect_target(target):
    if not target:
        return False
    ref = urlsplit(request.host_url)
    test = urlsplit(target)
    return (not test.netloc or test.netloc == ref.netloc) and test.scheme in ('', ref.scheme)


@auth_bp.route('/login', methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('index'))
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()
        if user and user.check_password(form.password.data):
            if not user.is_active:
                flash('Akun Anda telah dinonaktifkan. Hubungi admin.', 'error')
                return render_template('auth/login.html', form=form)
            login_user(user)
            flash(f'Assalamu\'alaikum, {user.name}!', 'success')
            next_page = request.args.get('next')
            if _is_safe_redirect_target(next_page):
                return redirect(next_page)
            return redirect(url_for('index'))
        flash('Email atau password salah.', 'error')
    return render_template('auth/login.html', form=form)


@auth_bp.route('/register', methods=['GET', 'POST'])
def register_school():
    if current_user.is_authenticated:
        return redirect(url_for('index'))
    form = SchoolRegistrationForm()
    if form.validate_on_submit():
        school = School(
            name=form.school_name.data,
            npsn=form.npsn.data,
            address=form.address.data,
            phone=form.school_phone.data,
            email=form.school_email.data,
            status='pending'
        )
        db.session.add(school)
        db.session.flush()

        admin = User(
            school_id=school.id,
            name=form.admin_name.data,
            email=form.admin_email.data,
            role='admin'
        )
        admin.set_password(form.admin_password.data)
        db.session.add(admin)
        db.session.commit()

        flash('Pendaftaran berhasil! Silakan login. Sekolah Anda akan diverifikasi oleh admin.', 'success')
        return redirect(url_for('auth.login'))
    return render_template('auth/register_school.html', form=form)


@auth_bp.route('/pending')
@login_required
def pending_approval():
    if current_user.role == 'superadmin':
        return redirect(url_for('superadmin.dashboard'))
    if current_user.school and current_user.school.status == 'approved':
        return redirect(url_for('index'))
    return render_template('auth/pending_approval.html')


@auth_bp.route('/settings', methods=['GET', 'POST'])
@login_required
def settings():
    form = SettingsForm(original_email=current_user.email)
    if form.validate_on_submit():
        if form.current_password.data:
            if not current_user.check_password(form.current_password.data):
                flash('Password saat ini salah.', 'error')
                return render_template('auth/settings.html', form=form)
            
            if form.new_password.data:
                current_user.set_password(form.new_password.data)
                flash('Password berhasil diperbarui.', 'success')

        current_user.name = form.name.data
        current_user.email = form.email.data
        current_user.language = form.language.data
        db.session.commit()
        flash('Profil berhasil diperbarui.', 'success')
        return redirect(url_for('auth.settings'))
    
    elif request.method == 'GET':
        form.name.data = current_user.name
        form.email.data = current_user.email
        form.language.data = current_user.language
        
    return render_template('auth/settings.html', form=form)


@auth_bp.route('/logout')
@login_required
def logout():
    logout_user()
    flash('Anda telah keluar. Wassalamu\'alaikum.', 'info')
    return redirect(url_for('auth.login'))
