package incheon.cmm.g2f.search.service.impl;

import incheon.cmm.g2f.search.domain.AdmType;
import incheon.cmm.g2f.search.mapper.AddressMapper;
import incheon.cmm.g2f.search.service.AddressService;
import incheon.cmm.g2f.search.vo.AddressCoordinateVO;
import incheon.cmm.g2f.search.vo.JibunSearchRequestDTO;
import incheon.cmm.g2f.search.vo.JibunSearchResultVO;
import lombok.RequiredArgsConstructor;

import java.util.List;

import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class AddressServiseImpl implements AddressService {
    private final AddressMapper addressMapper;

    @Override
    public AddressCoordinateVO getCoordinateByBldgMngNo(String bldgMngNo) {
        return addressMapper.getCoordinateByBldgMngNo(bldgMngNo);
    }

    @Override
    public List<AddressCoordinateVO> getCoordinatesByBldgMngNo(List<String> bldgMngNoList) {
        return addressMapper.getCoordinatesByBldgMngNo(bldgMngNoList);
    }

    @Override
    public List<JibunSearchResultVO> getJibunSearchInfo(String keyword, int page, int size) {
        JibunSearchRequestDTO dto = new JibunSearchRequestDTO();
        dto.setPage(page);
        dto.setSize(size);

        parseKeyword(keyword, dto);

        if (dto.getAdmType() == null) {
            throw new IllegalArgumentException("행정구역을 찾을 수 없습니다.");
        }

        if (dto.getLastAdm().length() == 1) {
            throw new IllegalArgumentException("잘못된 행정구역 이름입니다.");
        }

        return addressMapper.getJibunSearchInfo(dto);
    }

    private void parseKeyword(String keyword, JibunSearchRequestDTO dto) {

        if (keyword == null || keyword.isBlank()) {
            return;
        }

        String[] tokens = keyword.trim().split("\\s+");

        if (!tokens[tokens.length - 1].matches("\\d+(?:-\\d+)?")) {
            throw new IllegalArgumentException("지번 형식이 아닙니다.");
        }

        for (String token : tokens) {
            if (token.matches("\\d+(?:-\\d+)?")) {
                dto.setJibun(token);
            }
        }

        if (dto.getJibun() == null) {
            throw new IllegalArgumentException("지번이 존재하지 않습니다.");
        }

        for (int i = tokens.length - 1; i >= 0; i--) {

            String clean = tokens[i].replaceAll("[^가-힣0-9]", "");

            if (clean.isEmpty()) {
                continue;
            }

            if (clean.endsWith("리")) {
                dto.setAdmType(AdmType.LI);
                dto.setLastAdm(clean);
                return;
            }

            if (clean.endsWith("군") || clean.endsWith("구")) {
                dto.setAdmType(AdmType.SIG);
                dto.setLastAdm(clean);
                return;
            }

            // 마지막 행정단위인데 위에 안 걸리면 동
            if (i == tokens.length - 2) {
                dto.setAdmType(AdmType.EMD);
                dto.setLastAdm(clean);
                return;
            }
        }
    }
}
