package main

import (
	"compress/gzip"
	"os"
	"testing"
	"time"
)

func TestRollingGzipUploaderOpenNewFileWritesHeader(t *testing.T) {
	uploader := newRollingGzipUploader(t.Context(), nil, "", "target/path/", defaultMaxOutputFileSize, logKindSlowlog)
	if err := uploader.openNewFileLocked(); err != nil {
		t.Fatalf("openNewFileLocked failed: %v", err)
	}
	defer os.Remove(uploader.gzPath)

	if err := uploader.flushWritersLocked(); err != nil {
		t.Fatalf("flush failed: %v", err)
	}
	stat, err := uploader.gzFile.Stat()
	if err != nil {
		t.Fatalf("stat failed: %v", err)
	}
	if stat.Size() == 0 {
		t.Fatal("expected non-empty gzip file with csv header")
	}

	f, err := os.Open(uploader.gzPath)
	if err != nil {
		t.Fatalf("open gzip file: %v", err)
	}
	defer f.Close()
	gr, err := gzip.NewReader(f)
	if err != nil {
		t.Fatalf("gzip reader: %v", err)
	}
	defer gr.Close()
	buf := make([]byte, 64)
	n, err := gr.Read(buf)
	if err != nil {
		t.Fatalf("read gzip payload: %v", err)
	}
	if n == 0 || string(buf[:n]) == "" {
		t.Fatal("expected csv header in gzip payload")
	}
}

func TestRollingGzipUploaderDoesNotRotateBeforeSizeLimit(t *testing.T) {
	uploader := newRollingGzipUploader(t.Context(), nil, "", "target/path/", defaultMaxOutputFileSize, logKindStatement)
	base := time.Date(2026, 2, 3, 7, 47, 1, 0, time.UTC)
	if err := uploader.AppendStatement([]byte(`{"end":1784534325,"digest":"abc","exec_count":1}`), base); err != nil {
		t.Fatalf("append failed: %v", err)
	}
	if uploader.gzFile == nil {
		t.Fatal("expected gzip file to remain open before finish")
	}
	if uploader.csvWriter == nil {
		t.Fatal("expected statement output to use csv writer")
	}
}
