package models

import (
	"errors"
	"fmt"
	"os"
	"regexp"
	"strconv"
	"strings"
)

type BinaryVersion struct {
	Name string
	Major int
	Minor int
	Patch int
}

func ParseBinaryVersion(path string) (*BinaryVersion, error) {
	data, err := os.ReadFile(path)
	if err != nil {
		return nil, err
	}

	content := string(data)

	lastDash := strings.LastIndex(content, "-")
	if lastDash == -1 {
		return nil, errors.New("no dash found in version string")
	}
	
	secondLastDash := strings.LastIndex(content[:lastDash], "-")
	if secondLastDash == -1 {
		return nil, errors.New("only one dash found in version string")
	}

	versionSlice := content[secondLastDash+1 : lastDash]
	re := regexp.MustCompile(`^([A-Za-z]+)([\d\.]+)$`)
	matches := re.FindStringSubmatch(versionSlice)
	if len(matches) < 3 {
		return nil, errors.New("invalid version format")
	}
	binaryVersion := BinaryVersion{
		Name: matches[1],
	}
	numbers := strings.Split(matches[2], ".")

	if len(numbers) > 0 {
		binaryVersion.Major, err = strconv.Atoi(numbers[0])
		if err != nil {
			return nil, err
		}
	}
	if len(numbers) > 1 {
		binaryVersion.Minor, err = strconv.Atoi(numbers[1])
		if err != nil {
			return nil, err
		}
	}
	if len(numbers) > 2 {
		binaryVersion.Patch, err = strconv.Atoi(numbers[2])
		if err != nil {
			return nil, err
		}
	}

	return &binaryVersion, nil
}

func (v *BinaryVersion) String() string {
	return fmt.Sprintf("%d.%d.%d", v.Major, v.Minor, v.Patch)
}

func (v BinaryVersion) ToInt() int {
	return v.Major*100 + v.Minor*10 + v.Patch
}

func (v BinaryVersion) Subtract(other BinaryVersion) int {
	return v.ToInt() - other.ToInt()
}
