package opts

import (
	"encoding/csv"
	"encoding/json"
	"fmt"
	"strconv"
	"strings"

	types "github.com/docker/docker/libnetwork/ipamutils"
)

// PoolsOpt is a Value type for parsing the default address pools definitions
type PoolsOpt struct {
	Values []*types.NetworkToSplit
}

// UnmarshalJSON fills values structure  info from JSON input
func (p *PoolsOpt) UnmarshalJSON(raw []byte) error {
	return json.Unmarshal(raw, &(p.Values))
}

// Set predefined pools
func (p *PoolsOpt) Set(value string) error {
	csvReader := csv.NewReader(strings.NewReader(value))
	fields, err := csvReader.Read()
	if err != nil {
		return err
	}

	poolsDef := types.NetworkToSplit{}

	for _, field := range fields {
		// TODO(thaJeztah): this should not be case-insensitive.
		key, val, ok := strings.Cut(strings.ToLower(field), "=")
		if !ok {
			return fmt.Errorf("invalid field '%s' must be a key=value pair", field)
		}

		switch key {
		case "base":
			poolsDef.Base = val
		case "size":
			size, err := strconv.Atoi(val)
			if err != nil {
				return fmt.Errorf("invalid size value: %q (must be integer): %v", value, err)
			}
			poolsDef.Size = size
		default:
			return fmt.Errorf("unexpected key '%s' in '%s'", key, field)
		}
	}

	p.Values = append(p.Values, &poolsDef)

	return nil
}

// Type returns the type of this option
func (p *PoolsOpt) Type() string {
	return "pool-options"
}

// String returns a string repr of this option
func (p *PoolsOpt) String() string {
	var pools []string
	for _, pool := range p.Values {
		repr := fmt.Sprintf("%s %d", pool.Base, pool.Size)
		pools = append(pools, repr)
	}
	return strings.Join(pools, ", ")
}

// Value returns the mounts
func (p *PoolsOpt) Value() []*types.NetworkToSplit {
	return p.Values
}

// Name returns the flag name of this option
func (p *PoolsOpt) Name() string {
	return "default-address-pools"
}
