import sqlite3
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)

sqlite_path = 'db/todo.db'


def get_db_connection():
    connection = sqlite3.connect(sqlite_path)
    connection.row_factory = sqlite3.Row
    return connection


@app.route("/")
def index():
    connection = get_db_connection()
    cursor = connection.cursor()
    res = cursor.execute('SELECT * FROM todo')
    return render_template('index.html', todo_list=res.fetchall())


@app.route("/add", methods=["GET", "POST"])
def add_task():
    if request.method == "GET":
        todo = {}
        return render_template("edit.html", todo=todo)
    else:
        connection = get_db_connection()
        cursor = connection.cursor()
        error = []
        
        if not request.form["name"]:
            error.append("タスク名を入力してください。")
        if not request.form["duedate"]:
            error.append("期日を入力してください。")
                
        if error:
            todo = request.form.to_dict()
            return render_template("edit.html", todo=todo,error_list=error)
            
            
        cursor.execute("INSERT INTO todo(name, duedate, memo) VALUES(?, ?, ?)",
                      (request.form["name"],
                      request.form["duedate"],
                      request.form["memo"]))
        connection.commit()
        return redirect(url_for("index"))
    

@app.route("/delete/<int:id>")
def delete(id):
    connection = get_db_connection()
    cursor = connection.cursor()
    cursor.execute("DELETE FROM todo WHERE id = ?", (id,))
    connection.commit()
    return redirect(url_for("index"))




不明点
①todoの新規作成は辞書で、エラーはリストを返しているがなぜ違うのか
→todoは名前と項目という2つ表示させるので辞書を使っている
リストはエラーを表示させるだけなのでリストだけで事足りる。もしくはエラーが1つだけならリストに文字列を入れて表示させればいいが、エラーの表示が複数あるので、空のリストを作成して条件分岐でappendでエラーを表示させている


②エラーの表示はリストで作成しているが、print()ではだめなのか
printはコンソールに表示させるだけの関数で、フロントには表示できないんだそう。
フロントに表示させるには変数で渡す必要がある
だからリストや辞書を作成して、変数に入れてフロントに渡している

printも変数に入れて渡せるかもしれないが、リストを使うほうがのちのち追加することも考えるといいのかも