package goscrobble

import (
	"database/sql"
	"errors"
	"fmt"
	"log"
)

type Config struct {
	Setting map[string]string `json:"configs"`
}

type ServerInfo struct {
	Version             string `json:"version"`
	RegistrationEnabled string `json:"registration_enabled"`
}

func getAllConfigs() (Config, error) {
	config := Config{}
	configs := make(map[string]string)

	rows, err := db.Query("SELECT `key`, `value` FROM `config`")
	if err != nil {
		log.Printf("Failed to fetch config: %+v", err)
		return config, errors.New("Failed to fetch configs")
	}
	defer rows.Close()

	for rows.Next() {
		var key string
		var value string
		err := rows.Scan(&key, &value)
		if err != nil {
			log.Printf("Failed to fetch config: %+v", err)
			return config, errors.New("Failed to fetch configs")
		}

		// Append
		configs[key] = value
	}

	// Assign the data to the parent
	config.Setting = configs

	err = rows.Err()
	if err != nil {
		log.Printf("Failed to fetch config: %+v", err)
		return config, errors.New("Failed to fetch configs")
	}

	return config, nil
}

func updateConfigValue(key string, value string) error {
	_, err := db.Exec("UPDATE `config` SET `value` = ? WHERE `key` = ?", value, key)
	if err != nil {
		fmt.Printf("Failed to update config: %+v", err)
		return errors.New("Failed to update config value.")
	}

	return nil
}

func getConfigValue(key string) (string, error) {
	var value string

	err := db.QueryRow("SELECT `value` FROM `config` "+
		"WHERE `key` = ?",
		key).Scan(&value)

	if err == sql.ErrNoRows {
		return value, errors.New("Config key doesn't exist")
	}

	return value, nil
}
