package database

import (
	"fmt"
	"strings"

	"npm/internal/errors"
	"npm/internal/model"
	"npm/internal/util"
)

const (
	// DateFormat for DateFormat
	DateFormat = "2006-01-02"
	// DateTimeFormat for DateTimeFormat
	DateTimeFormat = "2006-01-02T15:04:05"
)

// GetByQuery returns a row given a query, populating the model given
func GetByQuery(model interface{}, query string, params []interface{}) error {
	db := GetInstance()
	if db != nil {
		err := db.Get(model, query, params...)
		return err
	}

	return errors.ErrDatabaseUnavailable
}

// BuildOrderBySQL takes a `Sort` slice and constructs a query fragment
func BuildOrderBySQL(columns []string, sort *[]model.Sort) (string, []model.Sort) {
	var sortStrings []string
	var newSort []model.Sort
	for _, sortItem := range *sort {
		if util.SliceContainsItem(columns, sortItem.Field) {
			sortStrings = append(sortStrings, fmt.Sprintf("`%s` %s", sortItem.Field, sortItem.Direction))
			newSort = append(newSort, sortItem)
		}
	}

	if len(sortStrings) > 0 {
		return fmt.Sprintf("ORDER BY %s", strings.Join(sortStrings, ", ")), newSort
	}

	return "", newSort
}