# routes/booking.py
from flask import Blueprint, render_template, request, redirect, url_for, flash, jsonify
from flask_login import login_required, current_user

from extensions import db
#from extensions import db
#from app.models import Booking, Course, User  # 根据你的实际模型调整
from models import booking as BookingModel, course as CourseModel, user as UserModel
import logging

booking_bp = Blueprint('booking', __name__, url_prefix='/booking')

# 日志配置
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


@booking_bp.route('/')
@login_required
def index():
    """预约主页"""
    if current_user.role == 'student':
        bookings = Booking.query.filter_by(student_id=current_user.id).all()
    elif current_user.role == 'teacher':
        bookings = Booking.query.join(Course).filter(Course.teacher_id == current_user.id).all()
    else:
        bookings = Booking.query.all()

    return render_template('booking/index.html', bookings=bookings)


@booking_bp.route('/create', methods=['GET', 'POST'])
@login_required
def create():
    """创建预约"""
    if current_user.role != 'student':
        flash('只有学生可以预约课程。', 'danger')
        return redirect(url_for('booking.index'))

    courses = Course.query.filter_by(status='open').all()

    if request.method == 'POST':
        course_id = request.form.get('course_id')
        booking_time = request.form.get('booking_time')

        course = Course.query.get(course_id)
        if not course:
            flash('课程不存在。', 'danger')
            return redirect(url_for('booking.create'))

        # 检查是否已预约
        existing = Booking.query.filter_by(student_id=current_user.id, course_id=course_id).first()
        if existing:
            flash('您已预约该课程。', 'warning')
            return redirect(url_for('booking.index'))

        new_booking = Booking(
            student_id=current_user.id,
            course_id=course_id,
            booking_time=booking_time,
            status='pending'
        )
        try:
            db.session.add(new_booking)
            db.session.commit()
            logger.info(f"学生 {current_user.username} 预约课程 {course.name}")
            flash('预约成功！', 'success')
            return redirect(url_for('booking.index'))
        except Exception as e:
            db.session.rollback()
            logger.error(f"预约失败: {e}")
            flash('系统错误，请稍后重试。', 'danger')

    return render_template('booking/create.html', courses=courses)


@booking_bp.route('/cancel/<int:booking_id>', methods=['POST'])
@login_required
def cancel(booking_id):
    """取消预约"""
    booking = Booking.query.get_or_404(booking_id)

    if current_user.role == 'student' and booking.student_id != current_user.id:
        flash('您无权取消此预约。', 'danger')
        return redirect(url_for('booking.index'))

    try:
        db.session.delete(booking)
        db.session.commit()
        flash('预约已取消。', 'info')
    except Exception as e:
        db.session.rollback()
        logger.error(f"取消预约失败: {e}")
        flash('取消失败，请稍后重试。', 'danger')

    return redirect(url_for('booking.index'))


# 可选：API 接口
@booking_bp.route('/api/my', methods=['GET'])
@login_required
def api_my_bookings():
    """获取当前用户预约（JSON）"""
    bookings = []
    if current_user.role == 'student':
        query = Booking.query.filter_by(student_id=current_user.id)
    elif current_user.role == 'teacher':
        query = Booking.query.join(Course).filter(Course.teacher_id == current_user.id)
    else:
        query = Booking.query

    for b in query.all():
        bookings.append({
            'id': b.id,
            'course': b.course.name,
            'student': b.student.username,
            'booking_time': b.booking_time.strftime('%Y-%m-%d %H:%M'),
            'status': b.status,
            'created_at': b.created_at.strftime('%Y-%m-%d %H:%M')
        })

    return jsonify(bookings)