package types

import (
	

	
	
)

const (
	pgBool = 16

	pgInt2 = 21
	pgInt4 = 23
	pgInt8 = 20

	pgFloat4 = 700
	pgFloat8 = 701

	pgText    = 25
	pgVarchar = 1043
	pgBytea   = 17
	pgJSON    = 114
	pgJSONB   = 3802

	pgTimestamp   = 1114
	pgTimestamptz = 1184

	// pgInt2Array = 1005
	pgInt32Array  = 1007
	pgInt8Array   = 1016
	pgFloat8Array = 1022
	pgStringArray = 1009

	pgUUID = 2950
)

type ColumnInfo = pool.ColumnInfo

type RawValue struct {
	Type  int32
	Value string
}

func ( RawValue) ( []byte,  int) ([]byte, error) {
	return AppendString(, .Value, ), nil
}

func ( RawValue) () ([]byte, error) {
	return pgjson.Marshal(.Value)
}

func ( ColumnInfo,  Reader,  int) (interface{}, error) {
	switch .DataType {
	case pgBool:
		return ScanBool(, )

	case pgInt2:
		,  := scanInt64(, , 16)
		if  != nil {
			return nil, 
		}
		return int16(), nil
	case pgInt4:
		,  := scanInt64(, , 32)
		if  != nil {
			return nil, 
		}
		return int32(), nil
	case pgInt8:
		return ScanInt64(, )

	case pgFloat4:
		return ScanFloat32(, )
	case pgFloat8:
		return ScanFloat64(, )

	case pgBytea:
		return ScanBytes(, )
	case pgText, pgVarchar, pgUUID:
		return ScanString(, )
	case pgJSON, pgJSONB:
		,  := ScanString(, )
		if  != nil {
			return nil, 
		}
		return json.RawMessage(), nil

	case pgTimestamp:
		return ScanTime(, )
	case pgTimestamptz:
		return ScanTime(, )

	case pgInt32Array:
		return scanInt64Array(, )
	case pgInt8Array:
		return scanInt64Array(, )
	case pgFloat8Array:
		return scanFloat64Array(, )
	case pgStringArray:
		return scanStringArray(, )

	default:
		,  := ScanString(, )
		if  != nil {
			return nil, 
		}
		return RawValue{
			Type:  .DataType,
			Value: ,
		}, nil
	}
}