package slowquery

import (
	"context"
	"fmt"
	"testing"
	"time"

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

func Test_stringTsToSecNsec(t *testing.T) {
	sec, nsec, err := stringTsToSecNsec("1704294935.1507144")
	require.NoError(t, err)
	require.Equal(t, int64(1704294935), sec)
	require.Equal(t, int64(150714400), nsec)

	sec, nsec, err = stringTsToSecNsec("1704294986.406164")
	require.NoError(t, err)
	require.Equal(t, int64(1704294986), sec)
	require.Equal(t, int64(406164000), nsec)
}

func Test_slowQueryV2_ListFiltersInternalFlagWithUser(t *testing.T) {
	tmExternal := time.Date(2024, 1, 3, 10, 15, 35, 150714400, time.UTC)
	tmInternal := time.Date(2024, 1, 3, 10, 20, 10, 406164000, time.UTC)
	ms := &mockStorage{data: map[string]string{
		"diagnosis/data/cluster-1/slowlog-merged/1h/2024010310": v2SlowLogLine(tmExternal, "external_digest", false) + v2SlowLogLine(tmInternal, "internal_digest", true),
	}}
	sq := &slowQueryV2{stores: newMockStorageFactory(ms)}

	logs, err := sq.List(context.Background(), &ListParams{
		Provider:  "aws",
		Region:    "us-west-2",
		ClusterID: "cluster-1",
		BeginTime: int(tmExternal.Add(-time.Minute).Unix()),
		EndTime:   int(tmInternal.Add(time.Minute).Unix()),
		IsDesc:    true,
	})
	require.NoError(t, err)
	require.Len(t, logs, 1)
	require.Equal(t, "external_digest", logs[0].Digest)

	logs, err = sq.List(context.Background(), &ListParams{
		Provider:     "aws",
		Region:       "us-west-2",
		ClusterID:    "cluster-1",
		BeginTime:    int(tmExternal.Add(-time.Minute).Unix()),
		EndTime:      int(tmInternal.Add(time.Minute).Unix()),
		IsDesc:       true,
		ShowInternal: true,
	})
	require.NoError(t, err)
	require.Len(t, logs, 2)
	require.Equal(t, "internal_digest", logs[0].Digest)
	require.Equal(t, "external_digest", logs[1].Digest)
}

func Test_slowQueryV2_DetailFiltersInternalFlagWithUser(t *testing.T) {
	tm := time.Date(2024, 1, 3, 10, 20, 10, 406164000, time.UTC)
	ms := &mockStorage{data: map[string]string{
		"diagnosis/data/cluster-1/slowlog-merged/1h/2024010310": v2SlowLogLine(tm, "internal_digest", true),
	}}
	sq := &slowQueryV2{stores: newMockStorageFactory(ms)}

	_, err := sq.Detail(context.Background(), &DetailParams{
		Provider:  "aws",
		Region:    "us-west-2",
		ClusterID: "cluster-1",
		Timestamp: timeToFloat(tm),
		ConnID:    6204412174144681481,
		Digest:    "internal_digest",
	})
	require.EqualError(t, err, "not found")

	sl, err := sq.Detail(context.Background(), &DetailParams{
		Provider:     "aws",
		Region:       "us-west-2",
		ClusterID:    "cluster-1",
		Timestamp:    timeToFloat(tm),
		ConnID:       6204412174144681481,
		Digest:       "internal_digest",
		ShowInternal: true,
	})
	require.NoError(t, err)
	require.Equal(t, "internal_digest", sl.Digest)
	require.True(t, sl.IsInternal)
}

func v2SlowLogLine(tm time.Time, digest string, internal bool) string {
	return fmt.Sprintf("%016d{\"User\":\"root\",\"Conn_ID\":6204412174144681481,\"Query_time\":1,\"Is_internal\":%t,\"Digest\":\"%s\",\"Query\":\"select 1\"}\n",
		tm.UnixMicro(), internal, digest)
}
