package validate_test

import (
	"testing"
	"time"

	"bit.admedia.com/scm/ad/adpilot-indexing-commit-intel.com/internal/contracts/events"
	"bit.admedia.com/scm/ad/adpilot-indexing-commit-intel.com/internal/contracts/metadata"
	"bit.admedia.com/scm/ad/adpilot-indexing-commit-intel.com/internal/contracts/validate"
)

func TestGraphArtifactReadyValid(t *testing.T) {
	event := events.NewGraphArtifactReadyEvent(
		"evt_1",
		"ad/example",
		"snap_1",
		"abc123",
		"art_1",
		"file:///data/art_1.json",
		"v0.1.0",
		"v1",
	)

	if err := validate.GraphArtifactReady(event); err != nil {
		t.Fatalf("expected valid event, got %v", err)
	}
}

func TestGraphArtifactReadyMissingArtifactURI(t *testing.T) {
	event := events.GraphArtifactReadyEvent{
		Envelope: metadata.Envelope{
			EventID:      "evt_1",
			EventVersion: metadata.EventVersionV1,
			CreatedAt:    time.Now().UTC(),
		},
		RepoID:             "ad/example",
		CommitSHA:          "abc123",
		ArtifactID:         "art_1",
		ParserVersion:      "v0.1.0",
		GraphSchemaVersion: "v1",
	}

	if err := validate.GraphArtifactReady(event); err == nil {
		t.Fatal("expected validation error")
	}
}

func TestGraphDeltaReadyValid(t *testing.T) {
	event := events.NewGraphDeltaReadyEvent(
		"evt_delta_1",
		"ad/example",
		"base123",
		"target456",
		"delta_1",
		"file:///data/delta_1.json",
		"v1",
	)

	if err := validate.GraphDeltaReady(event); err != nil {
		t.Fatalf("expected valid event, got %v", err)
	}
}

func TestGraphDeltaReadyMissingTargetCommitSHA(t *testing.T) {
	event := events.GraphDeltaReadyEvent{
		Envelope: metadata.Envelope{
			EventID:      "evt_1",
			EventVersion: metadata.EventVersionV1,
			CreatedAt:    time.Now().UTC(),
		},
		RepoID:             "ad/example",
		BaseCommitSHA:      "base123",
		DeltaArtifactID:    "delta_1",
		DeltaArtifactURI:   "file:///data/delta_1.json",
		GraphSchemaVersion: "v1",
	}

	if err := validate.GraphDeltaReady(event); err == nil {
		t.Fatal("expected validation error")
	}
}

func TestCommitAnalysisReadyValid(t *testing.T) {
	event := events.NewCommitAnalysisReadyEvent(
		"evt_analysis_1",
		"ad/example",
		"target456",
		"analysis_1",
	)

	if err := validate.CommitAnalysisReady(event); err != nil {
		t.Fatalf("expected valid event, got %v", err)
	}
}

func TestCommitAnalysisReadyMissingAnalysisID(t *testing.T) {
	event := events.CommitAnalysisReadyEvent{
		Envelope: metadata.Envelope{
			EventID:      "evt_1",
			EventVersion: metadata.EventVersionV1,
			CreatedAt:    time.Now().UTC(),
		},
		RepoID:    "ad/example",
		CommitSHA: "target456",
	}

	if err := validate.CommitAnalysisReady(event); err == nil {
		t.Fatal("expected validation error")
	}
}

func TestGraphDeltaReadyUnsupportedVersion(t *testing.T) {
	event := events.NewGraphDeltaReadyEvent(
		"evt_1",
		"ad/example",
		"base",
		"target",
		"delta_1",
		"file:///data/delta.json",
		"v1",
	)
	event.EventVersion = "v2"

	if err := validate.GraphDeltaReady(event); err == nil {
		t.Fatal("expected validation error for unsupported version")
	}
}
