package utils

import (
	"fmt"
	"strings"
)

type progressBar struct {
	width      int
	percent    int
	rawTotal   int64
	rawCurrent int64
}

func NewProgressBar(total int64, width int) *progressBar {
	return &progressBar{
		rawTotal: total,
		width:    width,
	}
}

func (pb *progressBar) Done() {
	pb.rawCurrent = pb.rawTotal
	pb.percent = 100
}

func (pb *progressBar) Update(currentValue int64) (hasChanged bool) {
	pb.rawCurrent = currentValue
	percent := int(100.0 * (float64(pb.rawCurrent) / float64(pb.rawTotal)))
	if percent != pb.percent {
		hasChanged = true
	}
	pb.percent = percent
	return hasChanged
}

func (pb *progressBar) String() string {
	done := int((pb.percent * pb.width) / 100.0)
	if done > pb.width {
		done = pb.width
	}
	todo := pb.width - done
	if todo < 0 {
		todo = 0
	}
	head := 1

	return "[" + strings.Repeat("=", done) + strings.Repeat(">", head) + strings.Repeat(" ", todo) + "]" + fmt.Sprintf(" %d %% (%d/%d)", pb.percent, pb.rawCurrent, pb.rawTotal)
}