// meta4ra -- Metalink 4.0 utilities
// Copyright (C) 2021-2026 Sergey Matveev <stargrave@stargrave.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

package main

import (
	"fmt"
	"io"
	"os"
	"time"

	"github.com/dustin/go-humanize"
)

var ProgressPeriod = time.Second

type Progress struct {
	w            io.Writer
	now, next    time.Time
	wrote, total uint64
}

func (p *Progress) Write(data []byte) (n int, err error) {
	n, err = p.w.Write(data)
	p.wrote += uint64(len(data))
	p.now = time.Now()
	if p.now.After(p.next) {
		p.next = p.now.Add(ProgressPeriod)
		if p.total == 0 {
			fmt.Fprintf(os.Stderr, "%s\n", humanize.IBytes(p.wrote))
		} else {
			fmt.Fprintf(os.Stderr, "%d%% | %s / %s\n",
				int(100*p.wrote/p.total),
				humanize.IBytes(p.wrote),
				humanize.IBytes(p.total))
		}
	}
	return
}
