from flask import Flask, render_template, request, redirect
import sqlite3

app = Flask(__name__)

def get_db():
    conn = sqlite3.connect("quiz.db")
    conn.row_factory = sqlite3.Row
    return conn


# ساخت دیتابیس
@app.route("/init")
def init():

    conn = get_db()
    cur = conn.cursor()

    cur.execute("""
    CREATE TABLE IF NOT EXISTS exams(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title TEXT
    )
    """)

    cur.execute("""
    CREATE TABLE IF NOT EXISTS questions(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        exam_id INTEGER,
        question TEXT,
        option1 TEXT,
        option2 TEXT,
        option3 TEXT,
        option4 TEXT,
        answer TEXT
    )
    """)

    cur.execute("""
    CREATE TABLE IF NOT EXISTS results(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        exam_id INTEGER,
        student_name TEXT,
        score INTEGER
    )
    """)

    conn.commit()
    conn.close()

    return "database created"


# صفحه اصلی
@app.route("/")
def index():
    return render_template("index.html")


# ساخت آزمون
@app.route("/create_exam", methods=["GET","POST"])
def create_exam():

    if request.method == "POST":

        title = request.form["title"]

        conn = get_db()
        cur = conn.cursor()

        cur.execute("INSERT INTO exams (title) VALUES (?)",(title,))
        exam_id = cur.lastrowid

        conn.commit()
        conn.close()

        return f"""
        <h2>آزمون ساخته شد</h2>

        <a href="/add/{exam_id}">اضافه کردن سوال</a>
        <br><br>
        <a href="/results/{exam_id}">مشاهده نتایج</a>
        """

    return render_template("create_exam.html")


# لیست آزمون ها برای دانش آموز
@app.route("/exams")
def exams():

    conn = get_db()

    exams = conn.execute("SELECT * FROM exams").fetchall()

    conn.close()

    return render_template("exams.html", exams=exams)


# شروع آزمون
@app.route("/start/<int:exam_id>", methods=["GET","POST"])
def start_exam(exam_id):

    if request.method == "POST":

        name = request.form["name"]

        return redirect(f"/quiz/{exam_id}?name={name}")

    return render_template("start.html")


# اضافه کردن سوال
@app.route("/add/<int:exam_id>", methods=["GET","POST"])
def add_question(exam_id):

    if request.method == "POST":

        question = request.form["question"]
        option1 = request.form["option1"]
        option2 = request.form["option2"]
        option3 = request.form["option3"]
        option4 = request.form["option4"]
        answer = request.form["answer"]

        conn = get_db()

        conn.execute(
        "INSERT INTO questions (exam_id,question,option1,option2,option3,option4,answer) VALUES (?,?,?,?,?,?,?)",
        (exam_id,question,option1,option2,option3,option4,answer)
        )

        conn.commit()
        conn.close()

        return redirect(f"/add/{exam_id}")

    return render_template("add.html")


# نمایش آزمون
@app.route("/quiz/<int:exam_id>")
def quiz(exam_id):

    conn = get_db()

    questions = conn.execute(
        "SELECT * FROM questions WHERE exam_id=?",
        (exam_id,)
    ).fetchall()

    conn.close()

    name = request.args.get("name")

    return render_template("quiz.html", questions=questions, exam_id=exam_id, name=name)


# ثبت نتیجه
@app.route("/result", methods=["POST"])
def result():

    exam_id = request.form["exam_id"]
    student_name = request.form["student_name"]

    conn = get_db()

    questions = conn.execute(
        "SELECT * FROM questions WHERE exam_id=?",
        (exam_id,)
    ).fetchall()

    score = 0

    for q in questions:

        user_answer = request.form.get(f"q{q['id']}")

        if user_answer == q["answer"]:
            score += 1

    conn.execute(
        "INSERT INTO results (exam_id,student_name,score) VALUES (?,?,?)",
        (exam_id,student_name,score)
    )

    conn.commit()
    conn.close()

    return f"نمره {student_name}: {score} از {len(questions)}"


# لیست آزمون ها برای دیدن نتایج
@app.route("/results_list")
def results_list():

    conn = get_db()

    exams = conn.execute("SELECT * FROM exams").fetchall()

    conn.close()

    return render_template("results_list.html", exams=exams)


# مشاهده نتایج یک آزمون
@app.route("/results/<int:exam_id>")
def results(exam_id):

    conn = get_db()

    rows = conn.execute(
        "SELECT * FROM results WHERE exam_id=?",
        (exam_id,)
    ).fetchall()

    conn.close()

    return render_template("results.html", rows=rows)


if __name__ == "__main__":
    app.run(debug=True)
