package pgtype

import (
	
	
	
	
	
	

	
)

type CircleScanner interface {
	ScanCircle(v Circle) error
}

type CircleValuer interface {
	CircleValue() (Circle, error)
}

type Circle struct {
	P     Vec2
	R     float64
	Valid bool
}

func ( *Circle) ( Circle) error {
	* = 
	return nil
}

func ( Circle) () (Circle, error) {
	return , nil
}

// Scan implements the database/sql Scanner interface.
func ( *Circle) ( any) error {
	if  == nil {
		* = Circle{}
		return nil
	}

	switch src := .(type) {
	case string:
		return scanPlanTextAnyToCircleScanner{}.Scan([]byte(), )
	}

	return fmt.Errorf("cannot scan %T", )
}

// Value implements the database/sql/driver Valuer interface.
func ( Circle) () (driver.Value, error) {
	if !.Valid {
		return nil, nil
	}

	,  := CircleCodec{}.PlanEncode(nil, 0, TextFormatCode, ).Encode(, nil)
	if  != nil {
		return nil, 
	}
	return string(), 
}

type CircleCodec struct{}

func (CircleCodec) ( int16) bool {
	return  == TextFormatCode ||  == BinaryFormatCode
}

func (CircleCodec) () int16 {
	return BinaryFormatCode
}

func (CircleCodec) ( *Map,  uint32,  int16,  any) EncodePlan {
	if ,  := .(CircleValuer); ! {
		return nil
	}

	switch  {
	case BinaryFormatCode:
		return encodePlanCircleCodecBinary{}
	case TextFormatCode:
		return encodePlanCircleCodecText{}
	}

	return nil
}

type encodePlanCircleCodecBinary struct{}

func (encodePlanCircleCodecBinary) ( any,  []byte) ( []byte,  error) {
	,  := .(CircleValuer).CircleValue()
	if  != nil {
		return nil, 
	}

	if !.Valid {
		return nil, nil
	}

	 = pgio.AppendUint64(, math.Float64bits(.P.X))
	 = pgio.AppendUint64(, math.Float64bits(.P.Y))
	 = pgio.AppendUint64(, math.Float64bits(.R))
	return , nil
}

type encodePlanCircleCodecText struct{}

func (encodePlanCircleCodecText) ( any,  []byte) ( []byte,  error) {
	,  := .(CircleValuer).CircleValue()
	if  != nil {
		return nil, 
	}

	if !.Valid {
		return nil, nil
	}

	 = append(, fmt.Sprintf(`<(%s,%s),%s>`,
		strconv.FormatFloat(.P.X, 'f', -1, 64),
		strconv.FormatFloat(.P.Y, 'f', -1, 64),
		strconv.FormatFloat(.R, 'f', -1, 64),
	)...)
	return , nil
}

func (CircleCodec) ( *Map,  uint32,  int16,  any) ScanPlan {
	switch  {
	case BinaryFormatCode:
		switch .(type) {
		case CircleScanner:
			return scanPlanBinaryCircleToCircleScanner{}
		}
	case TextFormatCode:
		switch .(type) {
		case CircleScanner:
			return scanPlanTextAnyToCircleScanner{}
		}
	}

	return nil
}

func ( CircleCodec) ( *Map,  uint32,  int16,  []byte) (driver.Value, error) {
	return codecDecodeToTextFormat(, , , , )
}

func ( CircleCodec) ( *Map,  uint32,  int16,  []byte) (any, error) {
	if  == nil {
		return nil, nil
	}

	var  Circle
	 := codecScan(, , , , , &)
	if  != nil {
		return nil, 
	}
	return , nil
}

type scanPlanBinaryCircleToCircleScanner struct{}

func (scanPlanBinaryCircleToCircleScanner) ( []byte,  any) error {
	 := ().(CircleScanner)

	if  == nil {
		return .ScanCircle(Circle{})
	}

	if len() != 24 {
		return fmt.Errorf("invalid length for Circle: %v", len())
	}

	 := binary.BigEndian.Uint64()
	 := binary.BigEndian.Uint64([8:])
	 := binary.BigEndian.Uint64([16:])

	return .ScanCircle(Circle{
		P:     Vec2{math.Float64frombits(), math.Float64frombits()},
		R:     math.Float64frombits(),
		Valid: true,
	})
}

type scanPlanTextAnyToCircleScanner struct{}

func (scanPlanTextAnyToCircleScanner) ( []byte,  any) error {
	 := ().(CircleScanner)

	if  == nil {
		return .ScanCircle(Circle{})
	}

	if len() < 9 {
		return fmt.Errorf("invalid length for Circle: %v", len())
	}

	 := string([2:])
	 := strings.IndexByte(, ',')
	,  := strconv.ParseFloat([:], 64)
	if  != nil {
		return 
	}

	 = [+1:]
	 = strings.IndexByte(, ')')

	,  := strconv.ParseFloat([:], 64)
	if  != nil {
		return 
	}

	 = [+2 : len()-1]

	,  := strconv.ParseFloat(, 64)
	if  != nil {
		return 
	}

	return .ScanCircle(Circle{P: Vec2{, }, R: , Valid: true})
}