package com.optage.parser;

import com.optage.model.FileHeader;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.DisplayName;

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

@DisplayName("Pattern C - File Headers Extraction")
class PatternCExtractorTest {
    private PatternCExtractor extractor = new PatternCExtractor();

    @Test
    @DisplayName("C1: Extract complete file header")
    void testExtractCompleteHeader() {
        String code = """
            /*
            *<プログラム内容>
            *   システム名      :eo顧客基幹システム
            *   モジュール名    :JKKHakkoSODCC
            *<機能概要>
            *   照査時およびコース変更時に、契約内容によってサービスオーダ発行を行う
            *<修正履歴>
            *   v1.00.00    2011/08/03   FJ)      新規作成
            *   v73.00.00   2024/10/28   FJ)長田  ANK-4427-00-00 NTT光対応
            */
            """;

        FileHeader header = extractor.extract(code);

        assertThat(header.getSystemName()).contains("eo顧客基幹システム");
        assertThat(header.getModuleName()).isEqualTo("JKKHakkoSODCC");
        assertThat(header.getPurposeJa()).contains("サービスオーダ発行");
        assertThat(header.getRevisionCount()).isGreaterThan(0);
    }

    @Test
    @DisplayName("C2: Extract partial header")
    void testExtractPartialHeader() {
        String code = """
            /*
            *   システム名      :TestSystem
            *   モジュール名    :TestModule
            */
            """;

        FileHeader header = extractor.extract(code);

        assertThat(header.getSystemName()).isEqualTo("TestSystem");
        assertThat(header.getModuleName()).isEqualTo("TestModule");
    }

    @Test
    @DisplayName("C3: Handle missing header")
    void testMissingHeader() {
        String code = "public class User { }";

        FileHeader header = extractor.extract(code);

        assertThat(header.getSystemName()).isNull();
    }

    @Test
    @DisplayName("C5: Cap revision history at 200 entries")
    void testRevisionHistoryCap() {
        StringBuilder code = new StringBuilder("/*\n");
        for (int i = 0; i < 250; i++) {
            code.append(String.format("*   v%d.00.00    2024/01/01   Author%d  Description%d\n", i, i, i));
        }
        code.append("*/");

        FileHeader header = extractor.extract(code.toString());

        assertThat(header.getRevisionCount()).isGreaterThanOrEqualTo(200);
    }
}