package go.kr.project.carInspectionPenalty.registration.service;

import go.kr.project.carInspectionPenalty.registration.model.CarFfnlgTrgtExcelVO;
import go.kr.project.carInspectionPenalty.registration.model.CarFfnlgTrgtModifiedDataVO;
import go.kr.project.carInspectionPenalty.registration.model.CarFfnlgTrgtVO;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * 자동차 과태료 대상 Service
 */
public interface CarFfnlgTrgtService {
    
    /**
     * 과태료 대상 목록 총 개수 조회
     * @param vo 검색 조건
     * @return 총 개수
     */
    int selectListTotalCount(CarFfnlgTrgtVO vo);
    
    /**
     * 과태료 대상 목록 조회
     * @param vo 검색 조건
     * @return 목록
     */
    List<CarFfnlgTrgtVO> selectList(CarFfnlgTrgtVO vo);
    
    /**
     * 과태료 대상 상세 조회
     * @param vo 조회 조건 (carFfnlgTrgtId)
     * @return 상세 정보
     */
    CarFfnlgTrgtVO selectOne(CarFfnlgTrgtVO vo);
    
    /**
     * 과태료 대상 등록
     * @param vo 등록할 데이터
     * @return 등록 건수
     */
    int insert(CarFfnlgTrgtVO vo);
    
    /**
     * 과태료 대상 수정
     * @param vo 수정할 데이터
     * @return 수정 건수
     */
    int update(CarFfnlgTrgtVO vo);
    
    /**
     * 과태료 대상 삭제 (논리삭제)
     * @param vo 삭제할 데이터 (carFfnlgTrgtId, dltr)
     * @return 삭제 건수
     */
    int delete(CarFfnlgTrgtVO vo);
    
    /**
     * TXT 파일 업로드 및 파싱하여 DB 저장
     * @param file 업로드된 TXT 파일
     * @param rgtr 등록자 ID
     * @return 처리 결과 (성공 건수, 실패 건수, 오류 메시지 목록)
     */
    Map<String, Object> uploadAndParseTxtFile(MultipartFile file, String rgtr);

    /**
     * 과태료 대상 목록을 EUC-KR 인코딩의 고정폭 텍스트 바이트로 생성
     * 샘플 텍스트(docs/샘플용-EUC-KR.txt)와 동일한 포맷으로 출력합니다.
     *
     * @param vo 검색 조건
     * @return EUC-KR 인코딩 바이트 배열
     */
    byte[] generateEucKrDownloadBytes(CarFfnlgTrgtVO vo);

    /**
     * 선택된 목록에 대해 API 호출 및 기본정보/등록원부 비교
     *
     * @param targetList 선택된 과태료 대상 목록 (carFfnlgTrgtId, vhclno, inspYmd 포함)
     * @return 비교 결과 (compareResults, totalCount, successCount, failCount)
     */
    Map<String, Object> compareWithApi(List<Map<String, String>> targetList);

    /**
     * 과태료 대상 정보를 일괄 저장
     * 생성, 수정, 삭제된 데이터를 처리합니다.
     *
     * @param modifyData 생성/수정/삭제할 데이터를 담은 VO 객체
     * @return 저장 건수
     */
    int saveCarFfnlgTrgts(CarFfnlgTrgtModifiedDataVO modifyData);

    /**
     * 과태료 대상 목록 엑셀 다운로드용 조회
     * @param vo 검색 조건
     * @return 엑셀 다운로드용 목록
     */
    List<CarFfnlgTrgtExcelVO> selectListForExcel(CarFfnlgTrgtVO vo);
}
