package hook

import (
    "context"
    "time"
    "testing"

    "github.com/stretchr/testify/assert"

    "github.com/tidbcloud/pov-service/internal/common/constant"
    "github.com/tidbcloud/pov-service/internal/model"
    "github.com/tidbcloud/pov-service/internal/service/workload/task"
)

func TestSendEmailAtPrepareComplete_MatchAndDo(t *testing.T) {
    fcli := &fakeEmailClient{}
    h := NewSendEmailAtPrepareComplete(fcli, "tmpl-prepare-complete", "noreply@example.com")

    test := baseTest()
    test.Phase = model.WorkloadTestPhasePrepareData
    // ensure current task is prepare and completed
    test.Tasks = []model.WorkloadTask[any]{
        {
            WorkloadTaskBase: model.WorkloadTaskBase{Typ: model.WorkloadTaskTypePrepareData, Phase: model.WorkloadTaskPhaseCompleted, ExecBase: model.ExecBase{Status: model.ExecStatusCompleted}},
        },
    }

    // Match against the running processor name for prepare
    proc := task.PrepareDataRunningProcessor{}
    matched := h.Match(&proc, test)
    assert.True(t, matched)

    err := h.Do(context.Background(), test)
    assert.NoError(t, err)
    assert.Equal(t, 1, fcli.called)
    assert.Equal(t, "tmpl-prepare-complete", fcli.lastReq.TemplateID)
    assert.Equal(t, []string{test.StartedBy}, fcli.lastReq.To)
    // Check a few vars
    assert.Equal(t, "tpcc", fcli.lastReq.TemplateVars["workload_name"])
    assert.Equal(t, "64", fcli.lastReq.TemplateVars["max_connections"])
}

func TestSendEmailAtComplete_MatchAndDo(t *testing.T) {
    fcli := &fakeEmailClient{}
    h := NewSendEmailAtComplete(fcli, "tmpl-complete", "noreply@example.com")

    test := baseTest()
    test.Phase = model.WorkloadTestPhaseFinished
    finished := test.CreatedAt.Add(30 * time.Minute) // +30m
    test.FinishedAt = &finished

    proc := task.PhaseTransitionProcessor{}
    matched := h.Match(&proc, test)
    assert.True(t, matched)

    err := h.Do(context.Background(), test)
    assert.NoError(t, err)
    assert.Equal(t, 1, fcli.called)
    assert.Equal(t, "tmpl-complete", fcli.lastReq.TemplateID)
    // RU capacity aggregated
    assert.Equal(t, "100 - 200", fcli.lastReq.TemplateVars["RU_capacity"])
}

// sanity check: params accepted as different types
func TestSendEmail_ParamTypes(t *testing.T) {
    fcli := &fakeEmailClient{}
    h := NewSendEmailAtPrepareComplete(fcli, "tmpl", "from@example.com")

    test := baseTest()
    test.Phase = model.WorkloadTestPhasePrepareData
    // replace duration as string to exercise conversion path used elsewhere
    test.Params.Set(string(constant.Duration), "20")
    test.Tasks[0].Phase = model.WorkloadTaskPhaseCompleted
    test.Tasks[0].Status = model.ExecStatusCompleted

    proc := task.PrepareDataRunningProcessor{}
    assert.True(t, h.Match(&proc, test))
    assert.NoError(t, h.Do(context.Background(), test))
    assert.Equal(t, "20 min", fcli.lastReq.TemplateVars["duration"])
}
