package repositories

import (
	"errors"

	configs "astrology-api/configs"
	usermodel "astrology-api/models/usermodel"
	"strconv"
	"strings"
)

//
// Get All System Flags
//

func GetSystemFlags() ([]usermodel.SystemFlag, error) {

	var flags []usermodel.SystemFlag

	err := configs.DB.
		Find(&flags).Error

	if err != nil {
		return nil, err
	}

	return flags, nil
}

//
// Get Category -> Sub Categories
//

func GetSubCategories() ([]usermodel.SubCategory, error) {

	var categories []usermodel.SubCategory

	var systemFlag usermodel.SystemFlag

	err := configs.DB.
		Where("name = ?", "Category").
		First(&systemFlag).Error

	if err != nil {
		return nil, err
	}

	err = configs.DB.
		Where("parent_id = ?", systemFlag.ID).
		Find(&categories).Error

	if err != nil {
		return nil, err
	}

	return categories, nil
}

func GetAppLanguages() ([]usermodel.Language, error) {

	var systemFlag usermodel.SystemFlag

	err := configs.DB.
		Where("name = ?", "Language").
		First(&systemFlag).Error

	if err != nil {
		return nil, err
	}

	ids := strings.Split(systemFlag.Value, ",")

	var languageIDs []uint

	for _, id := range ids {

		value, err := strconv.ParseUint(strings.TrimSpace(id), 10, 64)

		if err == nil {

			languageIDs = append(languageIDs, uint(value))

		}
	}

	var languages []usermodel.Language

	err = configs.DB.
		Where("id IN ?", languageIDs).
		Find(&languages).Error

	if err != nil {
		return nil, err
	}

	return languages, nil
}

//
// Get One Flag Value
//

// GetSystemFlagValue reads a single flag by name. It exists for configuration
// that has to be changeable on a running server, which .env is not: .env is
// outside version control, so a deployment whose file predates a feature has no
// way to supply its setting short of a redeploy.
func GetSystemFlagValue(name string) (string, error) {

	if configs.DB == nil {
		return "", errors.New("database is not connected")
	}

	var systemFlag usermodel.SystemFlag

	err := configs.DB.
		Where("name = ?", name).
		Where("isDelete = ?", false).
		First(&systemFlag).Error

	if err != nil {
		return "", err
	}

	return strings.TrimSpace(systemFlag.Value), nil
}
