import os
from flask import Flask, render_template, request, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

# --- KHỞI TẠO ỨNG DỤNG FLASK ---
app = Flask(__name__)

# --- CẤU HÌNH CƠ SỞ DỮ LIỆU ---
# Lấy đường dẫn tuyệt đối của thư mục chứa file app.py


app.secret_key = os.environ.get("SECRET_KEY", "Thi1234!@#$")

# Cấu hình cơ sở dữ liệu MySQL cho CPanel
# Ưu tiên sử dụng DATABASE_URL nếu được cung cấp
database_url = os.environ.get("DATABASE_URL")
if database_url and database_url.startswith("mysql+pymysql://"):
    app.config["SQLALCHEMY_DATABASE_URI"] = database_url
else:
    # Nếu không tạo URL từ các biến môi trường riêng lẻ
    mysql_user = os.environ.get("MYSQL_USER", "bhnkcaet_ql")
    mysql_password = os.environ.get("MYSQL_PASSWORD", "uFM9B?5kUHqQQv3~")
    mysql_host = os.environ.get("MYSQL_HOST", "localhost")
    mysql_database = os.environ.get("MYSQL_DATABASE", "bhnkcaet_ql")
    
    # Tạo URL kết nối MySQL
    app.config["SQLALCHEMY_DATABASE_URI"] = f"mysql+pymysql://{mysql_user}:{mysql_password}@{mysql_host}/{mysql_database}"


db = SQLAlchemy(app)


# --- MODELS (DỰA TRÊN THIẾT KẾ MỚI CỦA BẠN) ---

# Bảng liên kết Many-to-Many giữa HocVien và KhoaThi
class DanhSachThi(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    hoc_vien_id = db.Column(db.Integer, db.ForeignKey('hoc_vien.id'))
    khoa_thi_id = db.Column(db.Integer, db.ForeignKey('khoa_thi.id'))
    ket_qua = db.Column(db.String(50), default='Chưa thi') # 'đậu','rớt hình','rớt luật','vắng'...
    ghi_chu = db.Column(db.Text)
    
    # Tạo relationship để truy cập ngược
    hoc_vien = db.relationship('HocVien', back_populates='danh_sach_thi_entries')
    khoa_thi = db.relationship('KhoaThi', back_populates='danh_sach_thi_entries')

class HocVien(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    ho_ten = db.Column(db.String(100), nullable=False)
    ngay_sinh = db.Column(db.Date, nullable=False)
    anh_the = db.Column(db.String(200)) # Lưu đường dẫn
    sdt = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(100))
    ngay_dang_ky = db.Column(db.Date, default=datetime.utcnow)
    goi_thi = db.Column(db.String(50))
    gplx_da_co = db.Column(db.String(10))
    sv_truong = db.Column(db.String(100))
    phi = db.Column(db.Float)
    ghi_chu = db.Column(db.Text)
    trang_thai = db.Column(db.String(50), default='chưa thi')

    # Relationships
    danh_sach_thi_entries = db.relationship('DanhSachThi', back_populates='hoc_vien', cascade="all, delete-orphan")
    thi_lai_entries = db.relationship('ThiLai', backref='hoc_vien', lazy=True, cascade="all, delete-orphan")
    tra_bang_entry = db.relationship('TraBang', backref='hoc_vien', uselist=False, cascade="all, delete-orphan")

class KhoaThi(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    ngay_thi = db.Column(db.Date, nullable=False)
    san_thi = db.Column(db.String(100))
    hang_thi = db.Column(db.String(10), nullable=False)
    ngay_tap_xe = db.Column(db.Date)
    
    danh_sach_thi_entries = db.relationship('DanhSachThi', back_populates='khoa_thi', cascade="all, delete-orphan")

class ThiLai(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    hoc_vien_id = db.Column(db.Integer, db.ForeignKey('hoc_vien.id'), nullable=False)
    ngay_rot = db.Column(db.Date)
    san_rot = db.Column(db.String(100))
    phi_thi_lai = db.Column(db.Float)
    phi_thi_lai_da_dong = db.Column(db.Boolean, default=False)
    ngay_thi_lai = db.Column(db.Date)

class TraBang(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    hoc_vien_id = db.Column(db.Integer, db.ForeignKey('hoc_vien.id'), nullable=False, unique=True)
    trang_thai_bang = db.Column(db.String(50), default='đang đợi')
    trang_thai_nhan = db.Column(db.String(50), default='chưa trả')
    ngay_tra = db.Column(db.Date)


# --- ROUTES ---

@app.route('/')
def index():
    # Lấy 5 học viên mới nhất và 5 khóa thi sắp tới
    hoc_vien_list = HocVien.query.order_by(HocVien.ngay_dang_ky.desc()).limit(5).all()
    khoa_thi_list = KhoaThi.query.filter(KhoaThi.ngay_thi >= datetime.today()).order_by(KhoaThi.ngay_thi.asc()).limit(5).all()
    return render_template('index.html', hoc_vien_list=hoc_vien_list, khoa_thi_list=khoa_thi_list)

# == QUẢN LÝ HỌC VIÊN ==
@app.route('/hocvien')
def hocvien_danhsach():
    hoc_vien_all = HocVien.query.order_by(HocVien.id.desc()).all()
    return render_template('hocvien_danhsach.html', hoc_vien_all=hoc_vien_all)

@app.route('/hocvien/them', methods=['GET', 'POST'])
def them_hoc_vien():
    if request.method == 'POST':
        # Kiểm tra trùng SĐT
        if HocVien.query.filter_by(sdt=request.form['sdt']).first():
            flash('Số điện thoại đã tồn tại trong hệ thống!', 'danger')
            return render_template('hocvien_form.html', action="Thêm mới", hoc_vien=request.form)

        new_hv = HocVien(
            ho_ten=request.form['ho_ten'],
            ngay_sinh=datetime.strptime(request.form['ngay_sinh'], '%Y-%m-%d').date(),
            sdt=request.form['sdt'],
            email=request.form.get('email'),
            goi_thi=request.form.get('goi_thi'),
            phi=float(request.form.get('phi', 0)),
            ghi_chu=request.form.get('ghi_chu'),
        )
        db.session.add(new_hv)
        # Tự động tạo bản ghi Trả Bằng tương ứng
        new_tra_bang = TraBang(hoc_vien=new_hv)
        db.session.add(new_tra_bang)

        db.session.commit()
        flash('Thêm học viên mới thành công!', 'success')
        return redirect(url_for('hocvien_chitiet', id=new_hv.id))
        
    return render_template('hocvien_form.html', action="Thêm mới")

@app.route('/hocvien/<int:id>')
def hocvien_chitiet(id):
    hoc_vien = HocVien.query.get_or_404(id)
    # Lấy danh sách các khóa thi mà học viên này CHƯA tham gia
    khoa_thi_da_tham_gia_ids = [entry.khoa_thi_id for entry in hoc_vien.danh_sach_thi_entries]
    khoa_thi_chua_tham_gia = KhoaThi.query.filter(KhoaThi.id.notin_(khoa_thi_da_tham_gia_ids)).all()
    
    return render_template('hocvien_chitiet.html', hoc_vien=hoc_vien, khoa_thi_chua_tham_gia=khoa_thi_chua_tham_gia)
    
@app.route('/hocvien/<int:id>/sua', methods=['GET', 'POST'])
def sua_hoc_vien(id):
    hoc_vien = HocVien.query.get_or_404(id)
    if request.method == 'POST':
        hoc_vien.ho_ten = request.form['ho_ten']
        hoc_vien.ngay_sinh = datetime.strptime(request.form['ngay_sinh'], '%Y-%m-%d').date()
        hoc_vien.sdt = request.form['sdt']
        hoc_vien.email = request.form.get('email')
        hoc_vien.goi_thi = request.form.get('goi_thi')
        hoc_vien.phi = float(request.form.get('phi', 0))
        hoc_vien.ghi_chu = request.form.get('ghi_chu')
        hoc_vien.trang_thai = request.form.get('trang_thai')
        db.session.commit()
        flash('Cập nhật thông tin học viên thành công!', 'info')
        return redirect(url_for('hocvien_chitiet', id=id))

    return render_template('hocvien_form.html', action="Cập nhật", hoc_vien=hoc_vien)

@app.route('/hocvien/<int:id>/xoa', methods=['POST'])
def xoa_hoc_vien(id):
    hoc_vien = HocVien.query.get_or_404(id)
    db.session.delete(hoc_vien)
    db.session.commit()
    flash(f'Đã xóa vĩnh viễn học viên {hoc_vien.ho_ten}!', 'warning')
    return redirect(url_for('hocvien_danhsach'))


# == QUẢN LÝ KHÓA THI ==
@app.route('/khoathi')
def khoathi_danhsach():
    khoa_thi_all = KhoaThi.query.order_by(KhoaThi.ngay_thi.desc()).all()
    return render_template('khoathi_danhsach.html', khoa_thi_all=khoa_thi_all)

@app.route('/khoathi/them', methods=['GET', 'POST'])
def them_khoa_thi():
    if request.method == 'POST':
        new_kt = KhoaThi(
            ngay_thi=datetime.strptime(request.form['ngay_thi'], '%Y-%m-%d').date(),
            san_thi=request.form['san_thi'],
            hang_thi=request.form['hang_thi']
        )
        db.session.add(new_kt)
        db.session.commit()
        flash('Tạo khóa thi mới thành công!', 'success')
        return redirect(url_for('khoathi_danhsach'))
    return render_template('khoathi_form.html', action="Tạo mới")

@app.route('/khoathi/<int:id>')
def khoathi_chitiet(id):
    khoa_thi = KhoaThi.query.get_or_404(id)
    # Lấy các học viên chưa tham gia khóa này
    hoc_vien_da_tham_gia_ids = [entry.hoc_vien_id for entry in khoa_thi.danh_sach_thi_entries]
    hoc_vien_co_the_them = HocVien.query.filter(HocVien.id.notin_(hoc_vien_da_tham_gia_ids)).all()
    return render_template('khoathi_chitiet.html', khoa_thi=khoa_thi, hoc_vien_co_the_them=hoc_vien_co_the_them)


# == LOGIC NGHIỆP VỤ PHỨC TẠP ==

@app.route('/ghidanh', methods=['POST'])
def ghi_danh_hoc_vien():
    hoc_vien_id = request.form.get('hoc_vien_id')
    khoa_thi_id = request.form.get('khoa_thi_id')
    
    # Tạo bản ghi trong bảng liên kết DanhSachThi
    new_entry = DanhSachThi(hoc_vien_id=hoc_vien_id, khoa_thi_id=khoa_thi_id)
    
    # Cập nhật trạng thái học viên
    hoc_vien = HocVien.query.get(hoc_vien_id)
    hoc_vien.trang_thai = 'đang thi'

    db.session.add(new_entry)
    db.session.commit()
    flash('Ghi danh học viên vào khóa thi thành công!', 'success')
    
    # Quay lại trang chi tiết học viên hoặc khóa thi tùy ngữ cảnh
    if 'from_khoathi' in request.form:
        return redirect(url_for('khoathi_chitiet', id=khoa_thi_id))
    return redirect(url_for('hocvien_chitiet', id=hoc_vien_id))

@app.route('/khoathi/<int:id>/capnhatketqua', methods=['POST'])
def cap_nhat_ket_qua(id):
    khoa_thi = KhoaThi.query.get_or_404(id)
    for entry in khoa_thi.danh_sach_thi_entries:
        ket_qua_form = request.form.get(f'ketqua_{entry.hoc_vien_id}')
        if ket_qua_form:
            entry.ket_qua = ket_qua_form
            # Logic cập nhật trạng thái chính của học viên
            if ket_qua_form == 'đậu':
                entry.hoc_vien.trang_thai = 'đậu'
            elif 'rớt' in ket_qua_form:
                 entry.hoc_vien.trang_thai = 'rớt'
            else:
                 entry.hoc_vien.trang_thai = 'đã thi'
    db.session.commit()
    flash('Cập nhật kết quả thi thành công!', 'info')
    return redirect(url_for('khoathi_chitiet', id=id))

@app.route('/hocvien/<int:id>/themthilai', methods=['POST'])
def them_thi_lai(id):
    hoc_vien = HocVien.query.get_or_404(id)
    new_thilai = ThiLai(
        hoc_vien_id=id,
        ngay_rot=datetime.strptime(request.form['ngay_rot'], '%Y-%m-%d').date(),
        san_rot=request.form['san_rot'],
        phi_thi_lai=float(request.form.get('phi_thi_lai', 0)),
        phi_thi_lai_da_dong='phi_thi_lai_da_dong' in request.form
    )
    hoc_vien.trang_thai = 'thi lại'
    db.session.add(new_thilai)
    db.session.commit()
    flash('Đã thêm lịch sử thi lại cho học viên!', 'success')
    return redirect(url_for('hocvien_chitiet', id=id))

@app.route('/hocvien/<int:id>/capnhatbang', methods=['POST'])
def cap_nhat_bang(id):
    hoc_vien = HocVien.query.get_or_404(id)
    if hoc_vien.tra_bang_entry:
        hoc_vien.tra_bang_entry.trang_thai_bang = request.form['trang_thai_bang']
        hoc_vien.tra_bang_entry.trang_thai_nhan = request.form['trang_thai_nhan']
        if request.form.get('ngay_tra'):
            hoc_vien.tra_bang_entry.ngay_tra = datetime.strptime(request.form['ngay_tra'], '%Y-%m-%d').date()
        else:
            hoc_vien.tra_bang_entry.ngay_tra = None
        
        # Cập nhật trạng thái chính
        if hoc_vien.tra_bang_entry.trang_thai_nhan == 'đã trả':
            hoc_vien.trang_thai = 'đã có bằng'

        db.session.commit()
        flash('Cập nhật trạng thái bằng lái thành công!', 'info')
    return redirect(url_for('hocvien_chitiet', id=id))


# --- CHẠY ỨNG DỤNG ---
if __name__ == '__main__':
    with app.app_context():
        db.create_all()
    app.run(debug=True, port=5001)