package parser_test

import (
	"bytes"
	"context"
	"encoding/json"
	"log/slog"
	"strings"
	"testing"

	"bit.admedia.com/scm/ad/adpilot-indexing-code-parser.com/internal/service/parser"
)

func TestParseJobCompletedStructuredLog(t *testing.T) {
	workspace := setupWorkspace(t, map[string]string{
		"main.go": "package main\nfunc main() {}",
	})

	var logBuf bytes.Buffer
	logger := slog.New(slog.NewJSONHandler(&logBuf, nil))

	svc := parser.NewService(parser.ServiceConfig{
		WorkspacePath: workspace,
		Workers:       1,
		ParserVersion: "v0.1.0-test",
		Logger:        logger,
	}, []parser.LanguageAnalyzer{&mockAnalyzer{language: "go"}}, &mockPublisher{}, newMockArtifactStore())

	event := fileChangedEvent("snap_log", "main.go")
	if err := svc.ProcessFileChanged(context.Background(), event); err != nil {
		t.Fatalf("ProcessFileChanged: %v", err)
	}

	output := logBuf.String()
	if !strings.Contains(output, "parse job completed") {
		t.Fatalf("expected completion log, got: %s", output)
	}

	lines := strings.Split(strings.TrimSpace(output), "\n")
	var entry map[string]any
	if err := json.Unmarshal([]byte(lines[len(lines)-1]), &entry); err != nil {
		t.Fatalf("unmarshal log: %v", err)
	}

	for _, key := range []string{"job_id", "event_id", "repo_id", "snapshot_id", "file_path", "artifact_id", "parse_duration_ms"} {
		if _, ok := entry[key]; !ok {
			t.Fatalf("expected log field %q, got %v", key, entry)
		}
	}
}
