package kr.itn.itnhub.contact;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.jupiter.api.Test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.List;

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

class MemberDirectoryParserTest {

    private final MemberDirectoryParser parser = new MemberDirectoryParser();

    private byte[] workbook(String[]... dataRows) throws Exception {
        try (XSSFWorkbook wb = new XSSFWorkbook();
             ByteArrayOutputStream out = new ByteArrayOutputStream()) {

            Sheet sheet = wb.createSheet(MemberDirectoryParser.SHEET_NAME);
            sheet.createRow(0); // 헤더

            int rowNum = 1;
            for (String[] data : dataRows) {
                Row row = sheet.createRow(rowNum++);
                for (int i = 0; i < data.length; i++) {
                    if (data[i] == null) {
                        continue;
                    }
                    row.createCell(i).setCellValue(data[i]);
                }
            }
            wb.write(out);
            return out.toByteArray();
        }
    }

    @Test
    void 담당자명이_빈_첫_행에서_읽기를_멈춘다() throws Exception {
        byte[] xlsx = workbook(
                new String[]{"1", "신청기관", "기관A", "팀", "김담당", "과장", "02-1", "a@b.kr"},
                new String[]{"2", "신청기관", "기관B", null, null, null, null, null},
                new String[]{"3", "신청기관", "기관C", "팀", "이담당", "대리", "02-3", "c@d.kr"});

        MemberParseResult result = parser.parse(new ByteArrayInputStream(xlsx));

        assertThat(result.rows()).hasSize(1);
        assertThat(result.rows().get(0).name()).isEqualTo("김담당");
    }

    @Test
    void 부서명이_대시나_공백이면_null로_취급한다() throws Exception {
        byte[] xlsx = workbook(
                new String[]{"1", "변호사", null, "-", "이변호", null, "02-1", "a@b.kr"});

        List<MemberRow> rows = parser.parse(new ByteArrayInputStream(xlsx)).rows();

        assertThat(rows.get(0).deptName()).isNull();
    }

    @Test
    void 알수없는_구분은_건너뛰고_계속_읽는다() throws Exception {
        byte[] xlsx = workbook(
                new String[]{"1", "이상한구분", "기관A", "팀", "김담당", "과장", "02-1", "a@b.kr"},
                new String[]{"2", "변호사", null, null, "이변호", null, "02-2", "b@c.kr"});

        MemberParseResult result = parser.parse(new ByteArrayInputStream(xlsx));

        assertThat(result.skipped()).isEqualTo(1);
        assertThat(result.rows()).hasSize(1);
        assertThat(result.rows().get(0).name()).isEqualTo("이변호");
    }
}
