package dbman

import (
	"database/sql"
	"errors"
	"fmt"
	"os"

	_ "github.com/mattn/go-sqlite3"
)

func OpenDB(dsn string) (*sql.DB, error) {
	db, err := sql.Open("sqlite3", dsn)
	if err != nil {
		return nil, err
	}
	if err = db.Ping(); err != nil {
		return nil, err
	}
	return db, nil
}

func InitializeDB(db *sql.DB, client bool) error {
	var stmt string
	// Only users table needs to be different between client and server
	if client {
		stmt = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, uuid TEXT UNIQUE, username TEXT)"
	} else {
		stmt = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, uuid TEXT UNIQUE, auth_token TEXT)"
	}
	_, err := db.Exec(stmt)
	if err != nil {
		return err
	}

	_, err = db.Exec("CREATE TABLE IF NOT EXISTS passwords (id INTEGER PRIMARY KEY, uuid TEXT UNIQUE, userId TEXT, service TEXT, username TEXT, password TEXT, last_changed DATETIME DEFAULT CURRENT_TIMESTAMP, deleted BOOLEAN DEFAULT FALSE)")
	if err != nil {
		return err
	}

	return nil
}

func getHome(dirname string) (string, error) {
	homeDir, err := os.UserHomeDir()
	if err != nil {
		return "", err
	}

	qpassHome := fmt.Sprintf("%s/%s", homeDir, dirname)
	if _, err := os.Stat(qpassHome); errors.Is(err, os.ErrNotExist) {
		err := os.Mkdir(qpassHome, os.ModePerm)
		if err != nil {
			return "", err
		}
	}

	return qpassHome, nil
}

func GetQpassHome() (string, error) {
	return getHome(".qpass")
}

func GetQpassServerHome() (string, error) {
	return getHome(".qpass_server")
}