package config

import (
	"database/sql"
	"log"
	"time"

	_ "github.com/mattn/go-sqlite3" // Importar el controlador SQLite
)

type StorageConfig struct {
	DBFile string `yaml:"db_file" env:"STORAGE_DB_FILE"`
}

// Setup inicializa el almacenamiento utilizando SQLite
func (c *StorageConfig) Setup() (*sql.DB, error) {
	db, err := sql.Open("sqlite3", c.DBFile)
	if err != nil {
		log.Fatalf("Error al conectar a la base de datos SQLite: %v", err)
		return nil, err
	}

	// Crear la tabla si no existe
	createTableQuery := `
	CREATE TABLE IF NOT EXISTS storage (
		key TEXT PRIMARY KEY,
		value TEXT,
		expire_at INTEGER
	);
	`
	_, err = db.Exec(createTableQuery)
	if err != nil {
		log.Fatalf("Error al crear la tabla de almacenamiento: %v", err)
		return nil, err
	}

	return db, nil
}

// Función para guardar un valor en el almacenamiento
func (c *StorageConfig) Set(db *sql.DB, key string, value string, expireAt int64) error {
	_, err := db.Exec("INSERT OR REPLACE INTO storage (key, value, expire_at) VALUES (?, ?, ?)", key, value, expireAt)
	return err
}

// Función para obtener un valor del almacenamiento
func (c *StorageConfig) Get(db *sql.DB, key string) (string, error) {
	var value string
	err := db.QueryRow("SELECT value FROM storage WHERE key = ? AND (expire_at IS NULL OR expire_at > ?)", key, time.Now().Unix()).Scan(&value)
	if err != nil {
		return "", err
	}
	return value, nil
}
