package hook

import (
    "context"
    "testing"
    "time"

    "github.com/stretchr/testify/assert"

    "github.com/tidbcloud/pov-service/internal/client/email"
    "github.com/tidbcloud/pov-service/internal/common/constant"
    "github.com/tidbcloud/pov-service/internal/model"
)

type fakeEmailClient struct {
    lastReq email.SendWithTemplateRequest
    called  int
}

func (f *fakeEmailClient) SendEmailWithTemplate(ctx context.Context, req email.SendWithTemplateRequest) error {
    f.lastReq = req
    f.called++
    return nil
}

func baseTest() model.WorkloadTest {
    now := time.Date(2025, 1, 2, 3, 4, 5, 0, time.UTC)
    started := now.Add(-5 * time.Minute)
    return model.WorkloadTest{
        ID:          "test-123",
        WorkloadID:  101,
        WorkloadName:"tpcc",
        StartedBy:   "alice@example.com",
        Params: model.WorkloadParams{
            {Name: string(constant.Duration), Value: "15"},
            {Name: string(constant.DataSource), Value: "small"},
            {Name: string(constant.MaxConnectionNumber), Value: "64"},
        },
        ExecBase: model.ExecBase{
            Status:    model.ExecStatusRunning,
            CreatedAt: started,
            StartedAt: &started,
        },
        Cluster: &model.TiDBCluster{MinRU: 100, MaxRU: 200},
        Tasks: []model.WorkloadTask[any]{
            {
                WorkloadTaskBase: model.WorkloadTaskBase{Typ: model.WorkloadTaskTypePrepareData, Phase: model.WorkloadTaskPhaseCompleted, ExecBase: model.ExecBase{Status: model.ExecStatusCompleted}},
            },
        },
    }
}

func TestSendEmailAtPrepareStart_MatchAndDo(t *testing.T) {
    fcli := &fakeEmailClient{}
    hook := NewSendEmailAtPrepareStart(fcli, "tmpl-prepare-start", "noreply@example.com")

    test := baseTest()
    matched := hook.Match(model.WorkloadTestPhaseCreateCluster, model.WorkloadTestPhasePrepareData, test)
    assert.True(t, matched)

    err := hook.Do(context.Background(), test)
    assert.NoError(t, err)
    assert.Equal(t, 1, fcli.called)
    assert.Equal(t, "tmpl-prepare-start", fcli.lastReq.TemplateID)
    assert.Equal(t, "noreply@example.com", fcli.lastReq.From)
    assert.Equal(t, []string{"alice@example.com"}, fcli.lastReq.To)
    // spot-check a couple template vars
    assert.Equal(t, "tpcc", fcli.lastReq.TemplateVars["workload_name"])
    assert.Equal(t, "15 min", fcli.lastReq.TemplateVars["duration"])
}
