package column

import (
	"fmt"
	"reflect"
	"time"
)

type ErrUnexpectedType struct {
	Column Column
	T      interface{}
}

func (err *ErrUnexpectedType) Error() string {
	return fmt.Sprintf("%s: unexpected type %T", err.Column, err.T)
}

var baseTypes = map[interface{}]reflect.Value{
	int8(0):     reflect.ValueOf(int8(0)),
	int16(0):    reflect.ValueOf(int16(0)),
	int32(0):    reflect.ValueOf(int32(0)),
	int64(0):    reflect.ValueOf(int64(0)),
	uint8(0):    reflect.ValueOf(uint8(0)),
	uint16(0):   reflect.ValueOf(uint16(0)),
	uint32(0):   reflect.ValueOf(uint32(0)),
	uint64(0):   reflect.ValueOf(uint64(0)),
	float32(0):  reflect.ValueOf(float32(0)),
	float64(0):  reflect.ValueOf(float64(0)),
	string(""):  reflect.ValueOf(string("")),
	time.Time{}: reflect.ValueOf(time.Time{}),
}

type base struct {
	name, chType string
	valueOf      reflect.Value
}

func (base *base) Name() string {
	return base.name
}

func (base *base) CHType() string {
	return base.chType
}

func (base *base) ScanType() reflect.Type {
	return base.valueOf.Type()
}

func (base *base) defaultValue() interface{} {
	return base.valueOf.Interface()
}

func (base *base) String() string {
	return fmt.Sprintf("%s (%s)", base.name, base.chType)
}