package util

import (
	"html/template"
	"time"
)

func Date2HTML(t time.Time) template.HTML {
	return template.HTML(t.Local().Format("<time datetime=\"2006-01-02 15:04:05\" title=\"2006-01-02 15:04:05\">2006-01-02 <span class=time>15:04:05</span></time>"))
}

func DateTime2HTML(t time.Time) template.HTML {
	return template.HTML(t.Local().Format("<time datetime=\"2006-01-02 15:04:05\">2006-01-02 15:04:05</time>"))
}

func DateTime2ColorHTML(t time.Time) template.HTML {
	return template.HTML(t.Local().Format("<time class=daily datetime=\"2006-01-02 15:04:05\">2006-01-02 15:04:05</time>"))
}

type TimeRange struct {
	A, B time.Time
}

func (tr TimeRange) ToPct(point time.Time) float64 {
	dur_ab := tr.B.Sub(tr.A)
	dur_ap := point.Sub(tr.A)
	return float64(dur_ap) / float64(dur_ab)
}

type ByteRange struct {
	A, B byte
}

func (br ByteRange) FromPct(pct float64) byte {
	ab := int16(br.B) - int16(br.A)
	ap := int16(pct * float64(ab))
	return byte(int16(br.A) + ap)
}

func PctCap(pct float64) float64 {
	if pct < 0 {
		pct = 0
	} else if pct > 1 {
		pct = 1
	}
	return pct
}

func MapRange(tr TimeRange, br ByteRange, t time.Time) byte {
	return br.FromPct(PctCap(tr.ToPct(t)))
}