package process

import (
	"bytes"
	"compress/gzip"
	"io"
	"strings"
	"testing"
	"time"

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

func TestIsHourReadyToProcess(t *testing.T) {
	hour09 := time.Date(2026, 7, 10, 9, 0, 0, 0, time.UTC).Unix()
	hour10 := time.Date(2026, 7, 10, 10, 0, 0, 0, time.UTC).Unix()

	// 10:31 UTC: hour 09 is done (+30m buffer passed at 10:30); hour 10 is not.
	at1031 := time.Date(2026, 7, 10, 10, 31, 0, 0, time.UTC)
	assert.True(t, isHourReadyToProcess(hour09, at1031))
	assert.False(t, isHourReadyToProcess(hour10, at1031))

	// 11:30 UTC: hour 10 becomes processable.
	at1130 := time.Date(2026, 7, 10, 11, 30, 0, 0, time.UTC)
	assert.True(t, isHourReadyToProcess(hour10, at1130))
	assert.False(t, isHourReadyToProcess(hour10, at1130.Add(-time.Second)))
}

func TestOpenRawLogReader_plainText(t *testing.T) {
	input := "2023-11-20T07:05:56.858176156Z;host;pod;instance;component log line\n"
	reader, closer, err := openRawLogReader("example.log.gz", strings.NewReader(input))
	require.NoError(t, err)
	defer closer()

	got, err := io.ReadAll(reader)
	require.NoError(t, err)
	assert.Equal(t, input, string(got))
}

func TestOpenRawLogReader_gzipContent(t *testing.T) {
	plain := "2023-11-20T07:05:56.858176156Z;host;pod;instance;component log line\n"
	var buf bytes.Buffer
	gw := gzip.NewWriter(&buf)
	_, err := gw.Write([]byte(plain))
	require.NoError(t, err)
	require.NoError(t, gw.Close())

	reader, closer, err := openRawLogReader("example.log.gz", &buf)
	require.NoError(t, err)
	defer closer()

	got, err := io.ReadAll(reader)
	require.NoError(t, err)
	assert.Equal(t, plain, string(got))
}

func TestOpenRawLogReader_alreadyDecompressedDespiteGzSuffix(t *testing.T) {
	plain := "already decompressed by storage client\n"
	reader, closer, err := openRawLogReader("example.log.gz", strings.NewReader(plain))
	require.NoError(t, err)
	defer closer()

	got, err := io.ReadAll(reader)
	require.NoError(t, err)
	assert.Equal(t, plain, string(got))
}
