package com.graphtest;

import com.graphtest.model.NodeStatus;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;

import static org.assertj.core.api.Assertions.*;

@DisplayName("Category 2: Tính đầy đủ (Completeness)")
class Category2_CompletenessTest {

    private CodeGraph graph;

    @BeforeEach
    void setUp() throws Exception {
        URL resource = getClass().getClassLoader().getResource("fixtures/cat2_completeness");
        Path dir = Paths.get(resource.toURI());
        graph = new GraphBuilder().buildFromDirectory(dir);
    }

    @Test
    @DisplayName("Tất cả 5 class phải có node trong graph")
    void allClassesShouldBePresent() {
        assertThat(graph.hasNode("MultiDepClass")).isTrue();
        assertThat(graph.hasNode("NoDepClass")).isTrue();
        assertThat(graph.hasNode("Alpha")).isTrue();
        assertThat(graph.hasNode("Beta")).isTrue();
        assertThat(graph.hasNode("Gamma")).isTrue();
    }

    @Test
    @DisplayName("MultiDepClass phải có đúng 3 outgoing edges (3 imports)")
    void allThreeDependenciesMustBeCaptured() {
        assertThat(graph.getOutgoingEdges("MultiDepClass")).hasSize(3);
    }

    @Test
    @DisplayName("Tất cả 3 dependencies của MultiDepClass phải được capture đầy đủ")
    void allDependencyEdgesMustExist() {
        assertThat(graph.hasEdge("MultiDepClass", "Alpha")).isTrue();
        assertThat(graph.hasEdge("MultiDepClass", "Beta")).isTrue();
        assertThat(graph.hasEdge("MultiDepClass", "Gamma")).isTrue();
    }

    @Test
    @DisplayName("Class không có import phải có 0 outgoing edges")
    void classWithNoImportsShouldHaveZeroOutgoingEdges() {
        assertThat(graph.getOutgoingEdges("NoDepClass")).isEmpty();
    }

    @Test
    @DisplayName("Không được tạo thêm edge ngoài những import đã khai báo")
    void shouldNotCreatePhantomEdges() {
        // NoDepClass không import gì nên không có edge nào
        assertThat(graph.hasEdge("NoDepClass", "Alpha")).isFalse();
        assertThat(graph.hasEdge("NoDepClass", "MultiDepClass")).isFalse();
    }

    @Test
    @DisplayName("Số node trong graph không được vượt quá số file thực tế")
    void nodeShouldNotExceedActualFileCount() {
        // Chỉ có 5 file, không có missing import → không tạo thêm node MISSING
        assertThat(graph.getNodesByStatus(NodeStatus.MISSING)).isEmpty();
        assertThat(graph.getNodes()).hasSize(5);
    }
}
