package com.optage.parser;

import com.optage.model.BusinessLabel;
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 B - Business Labels Extraction")
class PatternBExtractorTest {
    private PatternBExtractor extractor = new PatternBExtractor();

    @Test
    @DisplayName("B1: Extract Japanese business label from field")
    void testExtractJapaneseLabel() {
        String code = "private String key_svc_kei_no = \"\";  // KEY_サービス契約番号";

        List<BusinessLabel> labels = extractor.extract(code);

        assertThat(labels).hasSize(1);
        assertThat(labels.get(0).getFieldName()).isEqualTo("key_svc_kei_no");
        assertThat(labels.get(0).getLabel()).contains("サービス契約番号");
    }

    @Test
    @DisplayName("B2: Ignore field without business label")
    void testIgnoreFieldWithoutLabel() {
        String code = "private String fieldName = \"\";";

        List<BusinessLabel> labels = extractor.extract(code);

        assertThat(labels).isEmpty();
    }

    @Test
    @DisplayName("B3: Ignore English comments")
    void testIgnoreEnglishComments() {
        String code = "private String fieldName = \"\";  // This is a field";

        List<BusinessLabel> labels = extractor.extract(code);

        assertThat(labels).isEmpty();
    }

    @Test
    @DisplayName("B4: Extract label from array declaration")
    void testExtractFromArrayDeclaration() {
        String code = "{\"templateID\", \"String\"},  // サービスIF_ID";

        List<BusinessLabel> labels = extractor.extract(code);

        assertThat(labels).isNotEmpty();
    }

    @Test
    @DisplayName("B5: Extract label from static final constant")
    void testExtractFromConstant() {
        String code = "public static final String CONST = \"value\";  // 定数";

        List<BusinessLabel> labels = extractor.extract(code);

        assertThat(labels).isNotEmpty();
        assertThat(labels.get(0).getLabel()).contains("定数");
    }
}