package com.optage.parser;

import com.optage.model.ChangeMarker;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.DisplayName;
import java.util.List;

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

@DisplayName("Pattern A - Change Markers Extraction")
class PatternAExtractorTest {
    private PatternAExtractor extractor = new PatternAExtractor();

    @Test
    @DisplayName("A1: Extract ADD marker with START/END")
    void testExtractAddMarker() {
        String code = """
            // v72.00.00 ANK-4494-00-00 ADD START
            else if(JKKHakkoSODConstCC.IDO_DIV_ENUMDEL.equals(ido_div)) {
                param = enumDelOdrCtrl(handle, param, sodMap);
            }
            // v72.00.00 ANK-4494-00-00 ADD END
            """;

        List<ChangeMarker> markers = extractor.extract(code);

        assertThat(markers).hasSize(1);
        assertThat(markers.get(0).getTicketId()).isEqualTo("ANK-4494-00-00");
        assertThat(markers.get(0).getOpType()).isEqualTo("ADD");
        assertThat(markers.get(0).getVersion()).isEqualTo("v72.00.00");
    }

    @Test
    @DisplayName("A2: Extract MOD marker")
    void testExtractModMarker() {
        String code = """
            // v73.00.00 ANK-0099-00-00 MOD START
            int value = 100;
            // v73.00.00 ANK-0099-00-00 MOD END
            """;

        List<ChangeMarker> markers = extractor.extract(code);

        assertThat(markers).hasSize(1);
        assertThat(markers.get(0).getOpType()).isEqualTo("MOD");
    }

    @Test
    @DisplayName("A3: Extract DEL marker")
    void testExtractDelMarker() {
        String code = """
            // ANK-4427-00-00 DEL START
            oldMethod();
            // ANK-4427-00-00 DEL END
            """;

        List<ChangeMarker> markers = extractor.extract(code);

        assertThat(markers).hasSize(1);
        assertThat(markers.get(0).getOpType()).isEqualTo("DEL");
    }

    @Test
    @DisplayName("A4: Handle unmatched START without END")
    void testUnmatchedStartMarker() {
        String code = """
            // ANK-1234-00-00 ADD START
            newCode();
            // No END marker
            """;

        List<ChangeMarker> markers = extractor.extract(code);

        assertThat(markers).isEmpty();
    }

    @Test
    @DisplayName("A5: Extract nested markers")
    void testNestedMarkers() {
        String code = """
            // ANK-1111-00-00 ADD START
            // ANK-2222-00-00 MOD START
            code();
            // ANK-2222-00-00 MOD END
            // ANK-1111-00-00 ADD END
            """;

        List<ChangeMarker> markers = extractor.extract(code);

        assertThat(markers).hasSize(2);
    }

    @Test
    @DisplayName("A6: Support multiple ticket formats")
    void testMultipleTicketFormats() {
        String[] tickets = {"ANK-4494-00-00", "OM-1234-00-00", "IT1-5678-00-00", 
                           "IT2-9999-00-00", "ST-1111-00-00", "KAD-2222-00-00"};

        for (String ticket : tickets) {
            String code = String.format("""
                // %s ADD START
                code();
                // %s ADD END
                """, ticket, ticket);

            List<ChangeMarker> markers = extractor.extract(code);
            assertThat(markers).hasSize(1);
            assertThat(markers.get(0).getTicketId()).isEqualTo(ticket);
        }
    }
}