const sqlite3 = require('sqlite3');
const { open } = require('sqlite');

// データベースに接続し、テーブルを初期化する関数
async function openDB() {
	// データベースに接続し、指定されたファイルを使用
	return await open({
		filename: './db.sqlite3', // ファイル名
		driver: sqlite3.Database // データベースドライバ
	});
}
// テーブルを初期化する関数
async function initDB() {
	// データベース接続を取得
	const db = await openDB();
	/* usersテーブルを作成
	username TEXT PRIMARY KEY // ユーザー名
	password TEXT NOT NULL // パスワード
	*/
	await db.exec(`
	CREATE TABLE IF NOT EXISTS users (
	username TEXT PRIMARY KEY, 
	password TEXT NOT NULL
	)
	`);
	// ユーザーのシードを作成
	const user = await db.get(`SELECT * FROM users
	WHERE username = ?`, ['user1']);
	if (!user) {
		await createUser('user1', 'password1');
		await createUser('taro', 'yamada');
		await createUser('hanako', 'flower');
		await createUser('sachiko', 'happy');
	}
	/* bookmarksテーブルを作成
	id INTEGER PRIMARY KEY // 主キー
	username TEXT // ユーザー名
	url TEXT // ブックマークのURL
	title TEXT // ブックマークのタイトル
	description TEXT // ブックマークの説明
	*/
	await db.exec(`
	CREATE TABLE IF NOT EXISTS bookmarks (
	id INTEGER PRIMARY KEY,
	username TEXT,
	url TEXT,
	title TEXT,
	description TEXT
	)
	`);
}

// データベース接続を作成する
const dbPromise = openDB();
initDB();
// 新しいユーザーを作成するための関数
async function createUser(username, password) {
	const db = await dbPromise; // データベース接続を取得
	// ユーザー情報をusersテーブルに挿入
	await db.run(`INSERT INTO users
	(username, password) VALUES (?, ?)`,
		[username, password]);
}
// ユーザー認証を行うための関数
async function authenticateUser(username, password) {
	const db = await dbPromise; // データベース接続を取得
	// ユーザー情報を'users'テーブルから取得
	const user = await db.get(`SELECT * FROM users
WHERE username = ?`, [username]);
	// ユーザーとパスワードが一致すれば認証成功
	if (user && password == user.password) {
		return true;
	} else {
		return false; // 認証失敗
	}
}

// ユーザーのブックマークを取得する関数
async function getBookmarks(username) {
	const db = await dbPromise; // データベース接続を取得
	// ユーザーのブックマークをタイトル順で取得
	return await db.all(`SELECT * FROM bookmarks
	WHERE username = ? ORDER BY title ASC`,
		[username]);
}
// 新しいブックマークを追加する関数
async function addBookmark(username, { url, title, description }) {
	const db = await dbPromise; // データベース接続を取得
	// bookmarksテーブルに新しいブックマークを挿入
	await db.run(
		`INSERT INTO bookmarks
	(username, url, title, description)
	VALUES (?, ?, ?, ?)`,
		[username, url, title, description]
	);
}
// 指定されたIDのブックマークを削除するための関数
async function deleteBookmark(id) {
	const db = await dbPromise; // データベース接続を取得
	// 'bookmarks'テーブルから指定されたIDのブックマークを削除
	await db.run('DELETE FROM bookmarks WHERE id = ?', [id]);
}
// モジュールとして関数をエクスポート
module.exports = {
	createUser,
	authenticateUser,
	getBookmarks,
	addBookmark,
	deleteBookmark
};