package com.optage.parser;

import com.optage.model.TestInfo;
import java.util.*;
import java.util.regex.Pattern;

public class TestDetector {
    private static final Pattern TEST_ANNOTATION_PATTERN = Pattern.compile(
        "@(Test|Before|After|BeforeEach|AfterEach|BeforeClass|AfterClass)"
    );

    public TestInfo detect(String className, String filePath, String code) {
        List<String> signals = new ArrayList<>();
        boolean isTest = false;

        // Tier 1: Check annotations
        if (hasTestAnnotation(code)) {
            signals.add("annotation:@Test");
            isTest = true;
        }

        // Tier 2: Check path
        if (isTestPath(filePath)) {
            signals.add("path:" + filePath);
            isTest = true;
        }

        // Tier 3: Check class name
        if (isTestClassName(className)) {
            signals.add("classname:" + className);
            if (!isTest) isTest = true;  // Only if no higher tier matched
        }

        // Tier 3: Check superclass
        if (extendsTestCase(code)) {
            signals.add("superclass:TestCase");
            isTest = true;
        }

        return new TestInfo(className, isTest, signals);
    }

    private boolean hasTestAnnotation(String code) {
        return TEST_ANNOTATION_PATTERN.matcher(code).find();
    }

    private boolean isTestPath(String filePath) {
        return filePath.contains("/test/") || 
               filePath.contains("\\test\\") ||
               filePath.contains("/__tests__/") ||
               filePath.contains("\\__tests__\\") ||
               filePath.contains("/tests/");
    }

    private boolean isTestClassName(String className) {
        return className.endsWith("Test") || 
               className.endsWith("Tests") ||
               className.startsWith("Test");
    }

    private boolean extendsTestCase(String code) {
        return code.contains("extends TestCase") ||
               code.contains("extends TestSuite");
    }
}