package gtid

import (
	"strings"
)

func Add(gtidDesc0, gtidDesc1 string) (string, error) {
	gtid, err := Parse(gtidDesc0 + "," + gtidDesc1)
	if nil != err {
		return "", err
	}
	return gtid.String(), nil
}

func Sub(gtidDesc0, gtidDesc1 string) (string, error) {
	if strings.TrimSpace(gtidDesc0) == "" {
		return "", nil
	}
	gtid, err := parse(gtidDesc0)
	if err != nil {
		return "", err
	}
	if strings.TrimSpace(gtidDesc1) == "" {
		return gtid.String(), nil
	}
	err = gtid.sub(gtidDesc1)
	if err != nil {
		return "", err
	}
	return gtid.String(), nil
}

func Contain(gtidDesc0, gtidDesc1 string) (bool, error) {
	if strings.TrimSpace(gtidDesc0) == "" {
		if strings.TrimSpace(gtidDesc1) == "" {
			return true, nil
		}
		return false, nil
	}
	gtid, err := parse(gtidDesc0)
	if err != nil {
		return false, err
	}
	return gtid.Contain(gtidDesc1)
}

func Overlap(gtidDesc0, gtidDesc1 string) (bool, error) {
	if strings.TrimSpace(gtidDesc0) == "" {
		if strings.TrimSpace(gtidDesc1) == "" {
			return true, nil
		}
		return false, nil
	}
	gtid, err := parse(gtidDesc0)
	if err != nil {
		return false, err
	}
	return gtid.Overlap(gtidDesc1)
}

func Equal(gtidDesc0, gtidDesc1 string) (bool, error) {
	if strings.TrimSpace(gtidDesc0) == "" {
		if strings.TrimSpace(gtidDesc1) == "" {
			return true, nil
		}
		return false, nil
	}
	gtid, err := parse(gtidDesc0)
	if err != nil {
		return false, err
	}
	return gtid.Equal(gtidDesc1)
}

func EventCount(gtidDesc string) (uint64, error) {
	gtid, err := Parse(gtidDesc)
	if err != nil {
		return 0, err
	}
	return gtid.EventCount(), nil
}

func EventList(gtidDesc string) ([]string, error) {
	gtid, err := Parse(gtidDesc)
	if err != nil {
		return nil, err
	}
	return gtid.EventList(), nil
}

func Uniform(gtidDesc string) (string, error) {
	gtid, err := Parse(gtidDesc)
	if err != nil {
		return gtidDesc, err
	}
	return gtid.String(), nil
}
