package incheon.ags.ias.trms.web;

import incheon.ags.ias.trms.service.TrmsService;
import incheon.ags.ias.trms.vo.TrmsAgreVO;
import incheon.ags.ias.trms.vo.TrmsAgreeBulkRequestVO;
import incheon.ags.ias.trms.vo.TrmsSearchVO;
import incheon.ags.ias.trms.vo.TrmsVO;
import incheon.com.cmm.api.DefaultApiResponse;
import incheon.com.cmm.exception.BusinessException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

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

/**
 * 약관 동의 내부 시스템 연계 API 컨트롤러
 * - 도로굴착 등 내부 시스템에서 약관 조회 및 동의 이력 저장용
 * - 읽기 전용 (약관 CRUD는 TrmsApiController 사용)
 */
@RestController
@RequiredArgsConstructor
@Slf4j
public class TrmsInternalApiController {

    private final TrmsService trmsService;

    /**
     * 내부 시스템별 활성 약관 목록 조회
     * @param sysCd 시스템 코드 (RES: 도로굴착, AGS: 관리시스템 등)
     */
    @GetMapping("/api/internal/v1/trms/active")
    public ResponseEntity<DefaultApiResponse<List<Map<String, Object>>>> getActiveTerms(
            @RequestParam String sysCd) throws Exception {

        log.info("[내부 연계] 활성 약관 조회 요청 - sysCd: {}", sysCd);

        TrmsSearchVO searchVO = new TrmsSearchVO();
        searchVO.setSysCd(sysCd);
        // 활성 상태(ACT), 사용여부(Y), 최신 버전만 조회는 쿼리에서 자동 처리

        // 내부 연동은 페이징 없이, 약관 유형별 최신 버전만 조회
        List<Map<String, Object>> terms = trmsService.selectTrmsListAll(searchVO);

        log.info("[내부 연계] 활성 약관 조회 완료 - {}건 (약관 유형별 최신 버전)", terms.size());
        return ResponseEntity.ok(
            DefaultApiResponse.success(terms, "조회 성공")
        );
    }

    /**
     * 약관 상세 조회 (약관 내용 포함)
     * @param trmsSn 약관 일련번호
     */
    @GetMapping("/api/internal/v1/trms/{trmsSn}")
    public ResponseEntity<DefaultApiResponse<TrmsVO>> getTermDetail(
            @PathVariable Long trmsSn) throws Exception {

        log.info("[내부 연계] 약관 상세 조회 - trmsSn: {}", trmsSn);
        
        TrmsVO term = trmsService.selectTrmsDetail(trmsSn);
        
        if (term == null) {
            throw new BusinessException("약관을 찾을 수 없습니다.");
        }
        
        return ResponseEntity.ok(
            DefaultApiResponse.success(term, "조회 성공")
        );
    }

    /**
     * 약관 동의 일괄 저장 (회원가입 시)
     * - 단일 PK(trms_agre_sn)로 변경되어 중복 동의 가능
     * - 매번 새로운 동의 이력 생성 (이력 추적)
     */
    @PostMapping("/api/internal/v1/trms/agree/bulk")
    public ResponseEntity<DefaultApiResponse<Map<String, Object>>> saveAgreementsBulk(
            @RequestBody TrmsAgreeBulkRequestVO requestVO) throws Exception {

        log.info("[내부 연계] 약관 동의 일괄 저장 요청 - userId: {}, 약관 수: {}",
                 requestVO.getUserId(), requestVO.getAgreements().size());
        
        if (requestVO.getUserId() == null || requestVO.getUserId().isEmpty()) {
            throw new BusinessException("사용자 ID가 필요합니다.");
        }
        
        int successCount = 0;
        
        for (TrmsAgreVO agreement : requestVO.getAgreements()) {
            agreement.setUserId(requestVO.getUserId());
            
            // 필수 검증
            if (agreement.getTrmsSn() == null || agreement.getTrmsVer() == null) {
                log.warn("필수 값 누락 - trmsSn: {}, trmsVer: {}", 
                         agreement.getTrmsSn(), agreement.getTrmsVer());
                continue;
            }
            
            // 신규 동의 이력 생성 (중복 허용)
            trmsService.insertTrmsAgre(agreement);
            successCount++;
            
            log.debug("약관 동의 등록 - trmsSn: {}, userId: {}, agreYn: {}", 
                      agreement.getTrmsSn(), requestVO.getUserId(), agreement.getAgreYn());
        }
        
        Map<String, Object> result = Map.of(
            "userId", requestVO.getUserId(),
            "successCount", successCount,
            "totalCount", requestVO.getAgreements().size()
        );
        
        log.info("[내부 연계] 약관 동의 일괄 저장 완료 - {}건", successCount);
        
        return ResponseEntity.ok(
            DefaultApiResponse.success(result, "약관 동의가 저장되었습니다.")
        );
    }

    /**
     * 사용자별 약관 동의 조회
     * @param userId 사용자 ID
     */
    @GetMapping("/api/internal/v1/trms/agree/{userId}")
    public ResponseEntity<DefaultApiResponse<List<Map<String, Object>>>> getUserAgreements(
            @PathVariable String userId) throws Exception {
        
        log.info("[외부 연계] 사용자 약관 동의 조회 - userId: {}", userId);
        
        List<Map<String, Object>> agreements = trmsService.selectTrmsAgreList(userId);
        
        log.info("[외부 연계] 사용자 약관 동의 조회 완료 - {}건", agreements.size());
        
        return ResponseEntity.ok(
            DefaultApiResponse.success(agreements, "조회 성공")
        );
    }

    /**
     * 특정 약관에 대한 사용자 최신 동의 여부 확인
     */
    @GetMapping("/api/internal/v1/trms/agree/{userId}/{trmsSn}")
    public ResponseEntity<DefaultApiResponse<Map<String, Object>>> checkUserAgreement(
            @PathVariable String userId,
            @PathVariable Long trmsSn) throws Exception {
        
        log.info("[외부 연계] 약관 동의 여부 확인 - userId: {}, trmsSn: {}", userId, trmsSn);
        
        // 최신 버전의 약관 조회
        TrmsVO term = trmsService.selectTrmsDetail(trmsSn);
        
        if (term == null) {
            throw new BusinessException("약관을 찾을 수 없습니다.");
        }
        
        // 최신 동의 이력 조회
        TrmsAgreVO latestAgreement = trmsService.selectLatestAgreement(trmsSn, userId);
        
        boolean isAgreed = (latestAgreement != null && "Y".equals(latestAgreement.getAgreYn()));
        boolean isLatestVersion = (latestAgreement != null && 
                                   term.getTrmsVer().equals(latestAgreement.getTrmsVer()));
        
        Map<String, Object> result = Map.of(
            "userId", userId,
            "trmsSn", trmsSn,
            "currentVer", term.getTrmsVer(),
            "agreedVer", latestAgreement != null ? latestAgreement.getTrmsVer() : "",
            "isAgreed", isAgreed,
            "isLatestVersion", isLatestVersion,
            "needReagree", !isLatestVersion && "Y".equals(term.getReAgreYn()),
            "agreDt", latestAgreement != null ? latestAgreement.getAgreDt() : null
        );
        
        return ResponseEntity.ok(
            DefaultApiResponse.success(result, "조회 성공")
        );
    }
}
