package kr.itn.itnhub.code;

import kr.itn.itnhub.AbstractDbTest;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

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

class CodeMapperTest extends AbstractDbTest {

    @Autowired
    CodeMapper mapper;

    @Test
    void 모든_코드를_그룹과_정렬순서대로_읽는다() {
        List<CodeRow> rows = mapper.findAllCodes();

        assertThat(rows).isNotEmpty();
        List<CodeRow> stages = rows.stream().filter(r -> r.groupId().equals("STAGE")).toList();
        assertThat(stages).hasSize(13);
        assertThat(stages.get(0).code()).isEqualTo("1");
        assertThat(stages.get(12).label()).isEqualTo("보고서 제출 완료");
    }

    @Test
    void attrs를_JSON_문자열로_읽는다() {
        CodeRow stage13 = mapper.findAllCodes().stream()
                .filter(r -> r.groupId().equals("STAGE") && r.code().equals("13"))
                .findFirst().orElseThrow();

        assertThat(stage13.attrsJson())
                .contains("progress")
                .contains("done")
                .contains("completed");
    }

    @Test
    void 비활성_코드도_함께_읽는다() {
        // 활성 필터는 CodeService가 용도에 따라 건다. 매퍼는 전부 내려줘야
        // 과거 데이터의 라벨을 그릴 수 있다.
        List<CodeRow> rows = mapper.findAllCodes();

        assertThat(rows).allSatisfy(r -> assertThat(r.groupId()).isNotBlank());
        assertThat(rows).anySatisfy(r -> assertThat(r.active()).isTrue());
    }

    @Test
    void 그룹_목록을_읽는다() {
        List<CodeGroup> groups = mapper.findAllGroups();

        assertThat(groups).hasSize(12);
        assertThat(groups).anySatisfy(g -> {
            assertThat(g.groupId()).isEqualTo("STAGE");
            assertThat(g.editable()).isFalse();
        });
        assertThat(groups).anySatisfy(g -> {
            assertThat(g.groupId()).isEqualTo("CONTACT_METHOD");
            assertThat(g.editable()).isTrue();
        });
    }
}
