package db

import (
	"database/sql"
	"errors"
	"fmt"
	"sync"
	"th7/data/core"

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

type SQLite3Adapter struct {
	mu sync.Mutex
	db *sql.DB
}

func NewSQLite3Adapter(dbInfo map[string]interface{}) (*SQLite3Adapter, error) {

	var adapter SQLite3Adapter

	// if path is given ...
	if _, ok := dbInfo["path"]; !ok {
		return &adapter, errors.New("sqlite3 requires a path config variable")
	}

	path := fmt.Sprint(dbInfo["path"])

	db, err := sql.Open("sqlite3", path)
	if err != nil {
		return &adapter, err
	}

	adapter.db = db

	const create string = `
	CREATE TABLE IF NOT EXISTS logs (
		id     INTEGER NOT NULL,
		type      TEXT NOT NULL,
		unit      TEXT NOT NULL,
		value     REAL NOT NULL,
		timestamp TEXT NOT NULL
	);`

	if _, err := adapter.db.Exec(create); err != nil {
		return &adapter, err
	}

	return &adapter, nil
}

func (ad *SQLite3Adapter) Close() {
	ad.db.Close()
}

func (ad *SQLite3Adapter) Save([]core.Channel) error {
	ad.mu.Lock()
	defer ad.mu.Unlock()

	fmt.Println("TODO save data...")
	return nil
}