package sqlfs

import (
	"reflect"
	"strings"
)

var dbTag = "db"

// RawFieldNames converts golang struct field into slice string.
func RawFieldNames[T any]() []string {

	var out []string

	var a T
	v := reflect.ValueOf(a)
	typ := v.Type()

	for i := 0; i < v.NumField(); i++ {
		// gets us a StructField
		fi := typ.Field(i)
		tagv := fi.Tag.Get(dbTag)
		switch tagv {
		case "-":
			continue
		default:
			// get tag name with the tag opton, e.g.:
			// `db:"id"`
			// `db:"id,type=char,length=16"`
			// `db:",type=char,length=16"`
			// `db:"-,type=char,length=16"`
			if strings.Contains(tagv, ",") {
				tagv = strings.TrimSpace(strings.Split(tagv, ",")[0])
			}

			if tagv == "-" {
				continue
			}

			if len(tagv) == 0 {
				tagv = fi.Name
			}

			out = append(out, tagv)
		}
	}

	return out
}