package incheon.uis.ums.web;

import incheon.com.cmm.api.DefaultApiResponse;
import incheon.com.security.util.SecurityUtil;
import incheon.uis.ums.service.UisRouteService;
import incheon.uis.urf.model.RdtNordD;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import incheon.uis.ums.vo.UisRouteVO;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 노선 관리를 위한 통합 컨트롤러
 * UisBaseController를 상속받아 동적으로 타입을 처리하는 방식으로 구현
 *
 * @author 김재흥
 * @since 2025.10.23
 * @version 1.0.0
 */
@Controller
@RequestMapping("/api/uis/router")
@RequiredArgsConstructor
@Slf4j
public class UisRouteController {

    @Autowired
	private UisRouteService uisRouteService;

    /**
	 * 기존 검색 메서드 (하위 호환성 유지)
	 */
    @GetMapping("/search.do")
    @ResponseBody
    public ResponseEntity<DefaultApiResponse<Map<String, Object>>> searchFacility(
            @ModelAttribute UisRouteVO uisRouteVO) throws Exception {

        SecurityUtil.requirePermission("UIS", "PERM_FUNC_READ");
		try {
            List<?> results = uisRouteService.selectRouteList(uisRouteVO);

            Map<String, Object> resultMap = new HashMap<>();
            resultMap.put("success", true);
            resultMap.put("results", results);

			return ResponseEntity.ok(DefaultApiResponse.success(resultMap));
        } catch (RuntimeException e) {
            log.error("시설물검색 중 오류", e);
            return ResponseEntity.status(500)
                    .body(DefaultApiResponse.error(500, "검색 중 오류가 발생했습니다.", "InternalServerError"));
        }
	}

    /**
     * 시설물정보 등록
     */
    @PostMapping("/insert.do")
    @ResponseBody
    @Transactional
    public ResponseEntity<Map<String, Object>> insertFacility(@ModelAttribute UisRouteVO uisRouteVO) throws Exception {

        SecurityUtil.requirePermission("UIS", "PERM_FUNC_EDIT");
        try {
            log.info("노선 등록 요청: {}", uisRouteVO);

            // 엔티티 생성
            RdtNordD rdtNordD = new RdtNordD();
            rdtNordD.setRidn(uisRouteVO.getIdn());                    // ridn 매핑
            rdtNordD.setNidn(uisRouteVO.getNidn());   // nidn 매핑
            rdtNordD.setLastMdfcnId("ADMIN");
            rdtNordD.setLastMdfcnDt(new Date());
            rdtNordD.setRmrkCn(null);
            rdtNordD.setUseYn("Y");
            rdtNordD.setFrstRegId("ADMIN");

            // 서비스 호출
            Object result = uisRouteService.insert(rdtNordD);

            return ResponseEntity.ok(Map.of(
                    "success", true,
                    "message", "노선 등록 성공",
                    "result", result
            ));
        } catch (RuntimeException e) {
            log.error("노선 등록 중 오류 발생", e);
            return ResponseEntity.status(500).body(Map.of(
                    "success", false,
                    "message", "노선 등록 중 오류 발생"
            ));
        }
    }


    @PostMapping("/delete.do")
    @ResponseBody
    @Transactional
    public ResponseEntity<Map<String, Object>> deleteRoutes(@RequestBody List<UisRouteVO> deleteList) {
        SecurityUtil.requirePermission("UIS", "PERM_FUNC_EDIT");
        if (deleteList == null || deleteList.isEmpty()) {
            return ResponseEntity.badRequest().body(Map.of(
                    "success", false,
                    "message", "삭제할 데이터가 없습니다."
            ));
        }

        int deleted = 0;
        for (UisRouteVO vo : deleteList) {
            try {
                //  필드명 변경 반영
                if (vo.getRidn() == null || vo.getNidn() == null) continue;
                uisRouteService.deleteByRidnAndNidn(vo.getRidn(), vo.getNidn());
                deleted++;
            } catch (RuntimeException e) {
                log.error("노선 삭제 중 오류 발생: ridn={}, nidn={}", vo.getRidn(), vo.getNidn(), e);
            }
        }

        return ResponseEntity.ok(Map.of(
                "success", true,
                "deleted", deleted,
                "message", deleted + "건 삭제 완료"
        ));
    }


}


