package models

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
	"fmt"
	"strings"
)

type StringSet []string

func (s *StringSet) Scan(value any) error {
	switch value := value.(type) {
	case []byte:
		*s = strings.Split(string(value), ",")
	case string:
		*s = strings.Split(value, ",")
	default:
		return errors.New(fmt.Sprint("failed to parse set: ", value))
	}
	return nil
}

func (s StringSet) Value() (driver.Value, error) {
	return strings.Join(s, ","), nil
}

type UintList []uint64

func (l UintList) Value() (driver.Value, error) {
	if l == nil {
		return nil, nil
	}
	data, err := json.Marshal(l)
	return string(data), err
}

func (l *UintList) Scan(value any) error {
	if value == nil {
		*l = nil
		return nil
	}
	var data []byte
	switch value := value.(type) {
	case []byte:
		data = value
	case string:
		data = []byte(value)
	default:
		return fmt.Errorf("failed to parse uint list: %T", value)
	}
	return json.Unmarshal(data, l)
}
