package imbot

import (
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
)

func TestParseDuration(t *testing.T) {
	cases := []struct {
		in      string
		want    time.Duration
		wantErr bool
	}{
		{"30m", 30 * time.Minute, false},
		{"2h", 2 * time.Hour, false},
		{"1d", 24 * time.Hour, false},
		{"7d", 7 * 24 * time.Hour, false},
		{"0d", 0, true},
		{"-1h", 0, true},
		{"xd", 0, true},
		{"", 0, true},
		{"2 hours", 0, true},
	}
	for _, c := range cases {
		got, err := parseDuration(c.in)
		if c.wantErr {
			assert.Error(t, err, "input %q", c.in)
		} else {
			assert.NoError(t, err, "input %q", c.in)
			assert.Equal(t, c.want, got, "input %q", c.in)
		}
	}
}

func TestAlreadySeen(t *testing.T) {
	b := &Bot{seen: make(map[string]time.Time)}

	assert.False(t, b.alreadySeen("ev1"))
	assert.True(t, b.alreadySeen("ev1"), "redelivery must dedup")
	assert.False(t, b.alreadySeen("ev2"))

	// Expired entries are pruned and allowed again.
	b.seen["ev1"] = time.Now().Add(-2 * eventSeenTTL)
	assert.False(t, b.alreadySeen("ev1"))
}

func TestValidResolutionsMatchesHelp(t *testing.T) {
	// Every resolution advertised in help must be accepted.
	for _, r := range []string{"handled", "self_recovered", "noise"} {
		assert.True(t, validResolutions[r], r)
	}
	assert.False(t, validResolutions["done"])
	assert.False(t, validResolutions["resolved"], "pre-taxonomy value must be rejected")
}
