package pgsql

import "strings"

var GoToStdTypes = map[string]string{
	"bool":            "boolean",
	"int64":           "bigint",
	"int":             "integer",
	"int8":            "smallint",
	"int16":           "smallint",
	"int32":           "integer",
	"uint":            "integer",
	"uint8":           "smallint",
	"uint16":          "smallint",
	"uint32":          "integer",
	"uint64":          "bigint",
	"uintptr":         "bigint",
	"znullint64":      "bigint",
	"znullint32":      "integer",
	"znullbyte":       "smallint",
	"float64":         "double",
	"float32":         "double",
	"complex64":       "double",
	"complex128":      "double",
	"customfloat64":   "double",
	"string":          "text",
	"Pointer":         "bigint",
	"[]byte":          "blob",
	"customdate":      "date",
	"customtime":      "time",
	"customtimestamp": "timestamp",
	"sqlfloat64":      "double",
	"sqlfloat16":      "double",
	"sqluuid":         "uuid",
	"sqljsonb":        "jsonb",
	"sqljson":         "json",
	"sqlint64":        "bigint",
	"sqlint32":        "integer",
	"sqlint16":        "smallint",
	"sqlbool":         "boolean",
	"sqlstring":       "text",
	"nullablejsonb":   "jsonb",
	"nullablejson":    "json",
	"nullableuuid":    "uuid",
	"sqldate":         "date",
	"sqltime":         "time",
	"sqltimestamp":    "timestamp",
}

var GoToPGSQLTypes = map[string]string{
	"bool":            "boolean",
	"int64":           "bigint",
	"int":             "integer",
	"int8":            "smallint",
	"int16":           "smallint",
	"int32":           "integer",
	"uint":            "integer",
	"uint8":           "smallint",
	"uint16":          "smallint",
	"uint32":          "integer",
	"uint64":          "bigint",
	"uintptr":         "bigint",
	"znullint64":      "bigint",
	"znullint32":      "integer",
	"znullbyte":       "integer",
	"float64":         "double precision",
	"float32":         "real",
	"complex64":       "double precision",
	"complex128":      "double precision",
	"customfloat64":   "double precision",
	"string":          "text",
	"Pointer":         "bigint",
	"[]byte":          "bytea",
	"customdate":      "date",
	"customtime":      "time",
	"customtimestamp": "timestamp",
	"sqlfloat64":      "double precision",
	"sqlfloat16":      "double precision",
	"sqluuid":         "uuid",
	"sqljsonb":        "jsonb",
	"sqljson":         "json",
	"sqlint64":        "bigint",
	"sqlint32":        "integer",
	"sqlint16":        "smallint",
	"sqlbool":         "boolean",
	"sqlstring":       "text",
	"nullablejsonb":   "jsonb",
	"nullablejson":    "json",
	"nullableuuid":    "uuid",
	"sqldate":         "date",
	"sqltime":         "time",
	"sqltimestamp":    "timestamp",
	"citext":          "citext",
}

func ValidSQLType(sqltype string) bool {
	for _, sql := range GoToPGSQLTypes {
		if strings.EqualFold(sql, sqltype) {
			return true
		}
	}
	for _, sql := range GoToStdTypes {
		if strings.EqualFold(sql, sqltype) {
			return true
		}
	}
	return false
}

func GetSQLType(anytype string) string {
	for gotype, sql := range GoToPGSQLTypes {
		if strings.EqualFold(gotype, anytype) || strings.EqualFold(sql, anytype) {
			return sql
		}
	}
	for gotype, sql := range GoToStdTypes {
		if strings.EqualFold(gotype, anytype) || strings.EqualFold(sql, anytype) {
			return sql
		}
	}
	return "text"
}

func ConvertSQLType(anytype string) string {
	for gotype, sql := range GoToPGSQLTypes {
		if strings.EqualFold(gotype, anytype) || strings.EqualFold(sql, anytype) {
			return sql
		}
	}
	for gotype, sql := range GoToStdTypes {
		if strings.EqualFold(gotype, anytype) || strings.EqualFold(sql, anytype) {
			return sql
		}
	}
	return anytype
}

func IsGoType(pTypeName string) bool {
	for k := range GoToStdTypes {
		if strings.EqualFold(pTypeName, k) {
			return true
		}
	}
	return false
}

func GetStdTypeFromGo(pTypeName string) string {
	for k, s := range GoToStdTypes {
		if strings.EqualFold(pTypeName, k) {
			return s
		}
	}
	return pTypeName
}
