package storage

import (
	"fmt"
	"net/url"
	"path"
)

const (
	DBTYPE_MEM = iota
	DBTYPE_GDBM
	DBTYPE_POSTGRES
)

type connData struct {
	typ int
	str string
}

func (cd *connData) DbType() int {
	return cd.typ
}

func (cd *connData) String() string {
	return cd.str
}

func probePostgres(s string) (string, bool) {
	v, err := url.Parse(s)
	if err != nil {
		return "", false
	}
	if v.Scheme != "postgres" {
		return "", false
	}
	return s, true
}

func probeGdbm(s string) (string, bool) {
	if !path.IsAbs(s) {
		return "", false
	}
	if path.Ext(s) != ".gdbm" {
		return "", false
	}
	s = path.Clean(s)
	return s, true
}

func toConnData(connStr string) (connData, error) {
	var o connData

	if connStr == "" {
		return o, nil
	}

	v, ok := probePostgres(connStr)
	if ok {
		o.typ = DBTYPE_POSTGRES
		o.str = v
		return o, nil
	}

	v, ok = probeGdbm(connStr)
	if ok {
		o.typ = DBTYPE_GDBM
		o.str = v
		return o, nil
	}

	return o, fmt.Errorf("invalid connection string: %s", connStr)
}