package db

import (
	"os"
	"path/filepath"
	"testing"

	"github.com/goodrain/rainbond/pkg/component/storage"
)

func setupEventFilePluginTestStorage(t *testing.T) {
	t.Helper()
	storage.New()
	storage.Default().StorageCli = &storage.LocalStorage{}
}

func writeEventJSONLines(t *testing.T, homePath, eventID string, lines []string) {
	t.Helper()
	dir := filepath.Join(homePath, "eventlog")
	if err := os.MkdirAll(dir, 0o755); err != nil {
		t.Fatalf("MkdirAll() error = %v", err)
	}
	path := filepath.Join(dir, eventID+".jsonl")
	content := []byte{}
	for _, line := range lines {
		content = append(content, []byte(line+"\n")...)
	}
	if err := os.WriteFile(path, content, 0o644); err != nil {
		t.Fatalf("WriteFile() error = %v", err)
	}
}

func TestEventFilePluginGetMessagesFallsBackToJSONLines(t *testing.T) {
	setupEventFilePluginTestStorage(t)

	tmpDir := t.TempDir()
	writeEventJSONLines(t, tmpDir, "event-1", []string{
		`{"event_id":"event-1","step":"build-exector","status":"info","message":"Starting CNB build","level":"info","time":"2026-05-06T17:53:45+08:00"}`,
		`{"event_id":"event-1","step":"build-exector","status":"failure","message":"CNB ERROR 401","level":"debug","time":"2026-05-06T17:53:50+08:00"}`,
	})

	plugin := NewEventFilePlugin(tmpDir)
	result, err := plugin.GetMessages("event-1", "debug", 0)
	if err != nil {
		t.Fatalf("GetMessages() error = %v", err)
	}

	messages, ok := result.(MessageDataList)
	if !ok {
		t.Fatalf("GetMessages() type = %T, want MessageDataList", result)
	}
	if len(messages) != 2 {
		t.Fatalf("GetMessages() len = %d, want 2", len(messages))
	}
	if messages[1].Message != "CNB ERROR 401" {
		t.Fatalf("GetMessages() last message = %q, want CNB ERROR 401", messages[1].Message)
	}
}

func TestEventFilePluginGetMessagesFiltersJSONLinesByLevel(t *testing.T) {
	setupEventFilePluginTestStorage(t)

	tmpDir := t.TempDir()
	writeEventJSONLines(t, tmpDir, "event-2", []string{
		`{"event_id":"event-2","step":"build-exector","status":"info","message":"create CNB build job success","level":"info","time":"2026-05-06T17:53:45+08:00"}`,
		`{"event_id":"event-2","step":"build-exector","status":"failure","message":"CNB ERROR 401","level":"debug","time":"2026-05-06T17:53:50+08:00"}`,
		`{"event_id":"event-2","step":"last","status":"failure","message":"编译失败,请查看构建日志","level":"error","time":"2026-05-06T17:53:55+08:00"}`,
	})

	plugin := NewEventFilePlugin(tmpDir)
	result, err := plugin.GetMessages("event-2", "info", 0)
	if err != nil {
		t.Fatalf("GetMessages() error = %v", err)
	}

	messages := result.(MessageDataList)
	if len(messages) != 2 {
		t.Fatalf("GetMessages() len = %d, want 2", len(messages))
	}
	if messages[0].Message != "create CNB build job success" {
		t.Fatalf("GetMessages() first message = %q", messages[0].Message)
	}
	if messages[1].Message != "编译失败,请查看构建日志" {
		t.Fatalf("GetMessages() second message = %q", messages[1].Message)
	}
}