package items

import (
	"fmt"
	"strconv"
	"strings"
)

type MIDIAftertouch struct {
	Value  uint8
	Dotted string
	Tilde  string
}

var _ Item = &MIDIAftertouch{}

func (m MIDIAftertouch) Dup() Item {
	return &m
}

func (m MIDIAftertouch) String() string {
	var bf strings.Builder

	bf.WriteString(fmt.Sprintf("AT(%v)", m.Value))

	if m.Dotted != "" {
		bf.WriteString(m.Dotted)
	}

	if m.Tilde != "" {
		bf.WriteString(m.Tilde)
	}

	return bf.String()
}

func (at *MIDIAftertouch) Parse(data string, posIn32th uint) (err error) {
	data = data[2:]
	if idx := strings.Index(data, "~"); idx > -1 {
		at.Tilde = data[idx:]
		data = data[:idx]
	}

	if idx := strings.Index(data, ":"); idx > -1 {
		at.Dotted = data[idx:]
		data = data[:idx]
	}

	dt := strings.Trim(data, "()")
	var val int
	val, err = strconv.Atoi(dt)

	if err != nil {
		return
	}

	at.Value = uint8(val)
	return
}