from flask import Blueprint, render_template, request, jsonify, flash, redirect, url_for
from flask_login import login_required, current_user
#from extensions import db
from app.extensions import db
from app.models.student import Student
from app.models.booking import Booking
from app.models.course import Course
from app.models.teacher import Teacher
from app.models.payment import Payment
from app.models.feedback import Feedback
from datetime import datetime, timedelta

student_bp = Blueprint('student', __name__)

@student_bp.before_request
@login_required
def require_student():
    """要求学生权限"""
    if not current_user.is_student:
        flash('您没有权限访问此页面。', 'error')
        return redirect(url_for('main.index'))

@student_bp.route('/')
def dashboard():
    """学生仪表盘"""
    student = Student.query.filter_by(user_id=current_user.id).first_or_404()
    
    # 统计数据
    stats = {
        'total_bookings': Booking.query.filter_by(student_id=student.id).count(),
        'completed_classes': Booking.query.filter_by(
            student_id=student.id, 
            status='completed'
        ).count(),
        'upcoming_classes': Booking.query.filter(
            Booking.student_id == student.id,
            Booking.status.in_(['confirmed', 'pending']),
            Booking.booking_time > datetime.utcnow()
        ).count(),
        'total_spent': db.session.query(db.func.sum(Booking.total_amount)).filter(
            Booking.student_id == student.id,
            Booking.status == 'completed'
        ).scalar() or 0
    }
    
    # 即将开始的课程
    upcoming_bookings = Booking.query.filter(
        Booking.student_id == student.id,
        Booking.status.in_(['confirmed', 'pending']),
        Booking.booking_time > datetime.utcnow()
    ).order_by(Booking.booking_time.asc()).limit(5).all()
    
    # 最近完成的课程
    recent_completed = Booking.query.filter(
        Booking.student_id == student.id,
        Booking.status == 'completed'
    ).order_by(Booking.booking_time.desc()).limit(5).all()
    
    return render_template('student/dashboard.html',
                         student=student,
                         stats=stats,
                         upcoming_bookings=upcoming_bookings,
                         recent_completed=recent_completed)

@student_bp.route('/profile', methods=['GET', 'POST'])
def profile():
    """学生个人资料"""
    student = Student.query.filter_by(user_id=current_user.id).first_or_404()
    
    if request.method == 'POST':
        student.full_name = request.form.get('full_name')
        student.age = request.form.get('age', type=int)
        student.english_level = request.form.get('english_level')
        student.learning_goals = request.form.get('learning_goals')
        student.phone = request.form.get('phone')
        student.wechat = request.form.get('wechat')
        student.preferred_teaching_style = request.form.get('preferred_teaching_style')
        student.interests = request.form.get('interests')
        
        db.session.commit()
        flash('个人资料更新成功！', 'success')
        return redirect(url_for('student.profile'))
    
    return render_template('student/profile.html', student=student)

@student_bp.route('/bookings')
def bookings():
    """我的预约"""
    student = Student.query.filter_by(user_id=current_user.id).first_or_404()
    page = request.args.get('page', 1, type=int)
    per_page = 10
    status = request.args.get('status')
    
    query = Booking.query.filter_by(student_id=student.id)
    
    if status:
        query = query.filter_by(status=status)
    
    bookings = query.order_by(Booking.booking_time.desc()).paginate(
        page=page, per_page=per_page, error_out=False
    )
    
    return render_template('student/bookings.html', bookings=bookings)

@student_bp.route('/booking/<int:booking_id>')
def booking_detail(booking_id):
    """预约详情"""
    booking = Booking.query.get_or_404(booking_id)
    
    # 检查权限
    if booking.student.user_id != current_user.id:
        flash('您没有权限查看此预约。', 'error')
        return redirect(url_for('student.bookings'))
    
    return render_template('student/booking_detail.html', booking=booking)

@student_bp.route('/booking/create/<int:teacher_id>', methods=['GET', 'POST'])
def create_booking(teacher_id):
    """创建预约"""
    teacher = Teacher.query.get_or_404(teacher_id)
    student = Student.query.filter_by(user_id=current_user.id).first_or_404()
    
    if request.method == 'POST':
        booking_time_str = request.form.get('booking_time')
        duration = request.form.get('duration', type=int, default=60)
        lesson_type = request.form.get('lesson_type')
        course_id = request.form.get('course_id', type=int)
        notes = request.form.get('notes')
        
        try:
            booking_time = datetime.fromisoformat(booking_time_str)
        except ValueError:
            flash('请选择有效的预约时间。', 'error')
            return redirect(url_for('student.create_booking', teacher_id=teacher_id))
        
        # 检查时间是否在未来
        if booking_time <= datetime.utcnow():
            flash('请选择未来的时间进行预约。', 'error')
            return redirect(url_for('student.create_booking', teacher_id=teacher_id))
        
        # 计算总金额
        course = Course.query.get(course_id) if course_id else None
        if course:
            total_amount = course.price * (duration / 60)
        else:
            total_amount = teacher.hourly_rate * (duration / 60)
        
        # 创建预约
        booking = Booking(
            student_id=student.id,
            teacher_id=teacher_id,
            course_id=course_id,
            booking_time=booking_time,
            duration=duration,
            lesson_type=lesson_type,
            total_amount=total_amount,
            notes=notes,
            status='pending'
        )
        
        db.session.add(booking)
        db.session.commit()
        
        flash('预约申请已提交，等待老师确认。', 'success')
        return redirect(url_for('student.booking_detail', booking_id=booking.id))
    
    # GET 请求：显示可用课程和时间
    courses = Course.query.filter_by(teacher_id=teacher_id, is_available=True).all()
    
    return render_template('student/create_booking.html',
                         teacher=teacher,
                         courses=courses)

@student_bp.route('/booking/<int:booking_id>/cancel', methods=['POST'])
def cancel_booking(booking_id):
    """取消预约"""
    booking = Booking.query.get_or_404(booking_id)
    
    # 检查权限
    if booking.student.user_id != current_user.id:
        flash('您没有权限取消此预约。', 'error')
        return redirect(url_for('student.bookings'))
    
    # 检查是否可以取消
    if booking.status not in ['pending', 'confirmed']:
        flash('该预约无法取消。', 'error')
        return redirect(url_for('student.booking_detail', booking_id=booking_id))
    
    # 检查取消时间（至少提前2小时）
    time_diff = booking.booking_time - datetime.utcnow()
    if time_diff < timedelta(hours=2):
        flash('距离课程开始不足2小时，无法取消。', 'error')
        return redirect(url_for('student.booking_detail', booking_id=booking_id))
    
    booking.status = 'cancelled'
    db.session.commit()
    
    flash('预约已取消。', 'success')
    return redirect(url_for('student.booking_detail', booking_id=booking_id))

@student_bp.route('/balance')
def balance():
    """账户余额"""
    student = Student.query.filter_by(user_id=current_user.id).first_or_404()
    
    # 充值记录
    payments = Payment.query.filter_by(
        student_id=student.id,
        payment_type='balance_topup'
    ).order_by(Payment.created_at.desc()).all()
    
    return render_template('student/balance.html',
                         student=student,
                         payments=payments)

@student_bp.route('/balance/topup', methods=['POST'])
def topup_balance():
    """充值余额"""
    student = Student.query.filter_by(user_id=current_user.id).first_or_404()
    amount = request.form.get('amount', type=float)
    
    if not amount or amount <= 0:
        flash('请输入有效的充值金额。', 'error')
        return redirect(url_for('student.balance'))
    
    # 创建充值记录
    payment = Payment(
        student_id=student.id,
        amount=amount,
        payment_type='balance_topup',
        payment_method='balance',  # 模拟充值
        status='completed'
    )
    
    # 更新余额
    student.balance += amount
    
    db.session.add(payment)
    db.session.commit()
    
    flash(f'成功充值 ¥{amount:.2f}', 'success')
    return redirect(url_for('student.balance'))

@student_bp.route('/feedback/<int:booking_id>', methods=['GET', 'POST'])
def submit_feedback(booking_id):
    """提交反馈"""
    booking = Booking.query.get_or_404(booking_id)
    
    # 检查权限和状态
    if booking.student.user_id != current_user.id:
        flash('您没有权限评价此课程。', 'error')
        return redirect(url_for('student.bookings'))
    
    if booking.status != 'completed':
        flash('只能对已完成的课程进行评价。', 'error')
        return redirect(url_for('student.booking_detail', booking_id=booking_id))
    
    # 检查是否已经评价过
    existing_feedback = Feedback.query.filter_by(booking_id=booking_id).first()
    if existing_feedback:
        flash('您已经对此课程进行过评价。', 'error')
        return redirect(url_for('student.booking_detail', booking_id=booking_id))
    
    if request.method == 'POST':
        rating = request.form.get('rating', type=int)
        comment = request.form.get('comment')
        categories = request.form.getlist('categories')
        
        if not rating or rating < 1 or rating > 5:
            flash('请选择有效的评分。', 'error')
            return render_template('student/feedback.html', booking=booking)
        
        # 创建反馈
        feedback = Feedback(
            student_id=booking.student_id,
            teacher_id=booking.teacher_id,
            booking_id=booking_id,
            rating=rating,
            comment=comment,
            categories=','.join(categories) if categories else ''
        )
        
        db.session.add(feedback)
        
        # 更新老师评分
        booking.teacher.update_rating()
        
        db.session.commit()
        
        flash('感谢您的评价！', 'success')
        return redirect(url_for('student.booking_detail', booking_id=booking_id))
    
    return render_template('student/feedback.html', booking=booking)

@student_bp.route('/teachers')
def teacher_list():
    """学生查看老师列表"""
    page = request.args.get('page', 1, type=int)
    per_page = 12
    
    # 筛选条件
    nationality = request.args.get('nationality')
    level = request.args.get('level')
    course_type = request.args.get('course_type')
    min_price = request.args.get('min_price', type=float)
    max_price = request.args.get('max_price', type=float)
    
    query = Teacher.query.filter_by(is_verified=True)
    
    # 应用筛选条件
    if nationality:
        query = query.filter(Teacher.nationality == nationality)
    if level:
        query = query.filter(Teacher.courses.any(Course.level == level))
    if course_type:
        if course_type == 'online':
            query = query.filter(Teacher.available_online == True)
        elif course_type == 'offline':
            query = query.filter(Teacher.available_offline == True)
    
    if min_price is not None:
        query = query.filter(Teacher.hourly_rate >= min_price)
    if max_price is not None:
        query = query.filter(Teacher.hourly_rate <= max_price)
    
    teachers = query.order_by(Teacher.rating.desc(), Teacher.total_reviews.desc()).paginate(
        page=page, per_page=per_page, error_out=False
    )
    
    return render_template('teacher/list.html', teachers=teachers)