package parser_test

import (
	"context"
	"testing"

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

func TestOrchestratorUsesFallbackForUnsupportedLanguage(t *testing.T) {
	workspace := setupWorkspace(t, map[string]string{
		"main.rs": "fn main() { println!(\"hi\"); }\n",
	})
	artifactDir := t.TempDir()
	fs, err := store.NewFilesystemStore(artifactDir)
	if err != nil {
		t.Fatalf("NewFilesystemStore: %v", err)
	}

	built := registry.Build(registry.Options{EnableFallback: true})
	pub := &mockPublisher{}
	svc := parser.NewService(parser.ServiceConfig{
		WorkspacePath: workspace,
		Workers:       1,
	}, built.Analyzers, pub, fs, parser.WithFallbackAnalyzer(built.Fallback))

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

	jobID := parser.JobIDFromEvent(event)
	job, ok := svc.GetParseJob(jobID)
	if !ok {
		t.Fatal("expected job")
	}
	if job.Status != parser.JobStatusCompleted {
		t.Fatalf("status: got %q, want completed", job.Status)
	}

	diags, ok := svc.GetJobDiagnostics(jobID)
	if !ok {
		t.Fatal("expected diagnostics")
	}
	foundFallback := false
	for _, d := range diags {
		if d.Code == "fallback_parser_used" {
			foundFallback = true
		}
	}
	if !foundFallback {
		t.Fatal("expected fallback_parser_used diagnostic")
	}
}

func TestFallbackAnalyzerInterface(t *testing.T) {
	var _ parser.FallbackAnalyzer = fallback.NewAnalyzer()
}
