package com.takensoft.common.certify.web;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.takensoft.cms.loginPolicy.service.LoginModeService;
import com.takensoft.cms.loginPolicy.service.LoginPolicyService;
import com.takensoft.cms.mber.service.LgnHstryService;
import com.takensoft.cms.mber.service.MberService;
import com.takensoft.cms.mber.vo.MberVO;
import com.takensoft.cms.token.service.RefreshTokenService;
import com.takensoft.common.message.MessageCode;
import com.takensoft.common.util.*;
import com.takensoft.common.certify.service.EmailService;
import com.takensoft.common.certify.vo.EmailVO;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 하석형
 * @since 2025.05.20
 * @modification
 *     since    |    author    | description
 *  2025.05.20  |    하석형     | 최초 등록
 *
 * 이메일 관련 Controller
 */
@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping(value="/sys/email")
public class EmailController {

    private final EmailService emailService;
    private final ResponseUtil resUtil;
    private final MberService mberService;
    private final HttpRequestUtil httpRequestUtil;
    private final LgnHstryService lgnHstryService;
    private final LoginModeService loginModeService;
    private final RefreshTokenService refreshTokenService;
    private final LoginPolicyService loginPolicyService;
    private final JWTUtil jwtUtil;
    private final SessionUtil sessionUtil;
    private final RedisTemplate<String, String> redisTemplate;
    private final LoginUtil loginUtil;

    @Value("${jwt.accessTime}")
    private long JWT_ACCESSTIME;
    @Value("${jwt.refreshTime}")
    private long JWT_REFRESHTIME;
    @Value("${cookie.time}")
    private int COOKIE_TIME; // 쿠키 유지 시간

    /**
     * @param emailVO - 이메일 정보
     * @return ResponseEntity - 이메일 인증코드 발송 응답 결과
     *
     * 이메일 인증코드 발송
     */
    @PostMapping("/sendEmailCertifyCode.json")
    public ResponseEntity<?> sendEmailCertifyCode(@RequestBody EmailVO emailVO) {

        boolean result = emailService.sendEmailCertifyCode(emailVO);

        return resUtil.successRes(result, MessageCode.CERTIFY_CODE_SEND_SUCCESS);
    }

    /**
     * @param emailVO - 이메일 정보
     * @return ResponseEntity - 이메일 인증코드 확인 응답 결과
     *
     * 이메일 인증코드 확인
     */
    @PostMapping("/checkEmailCertifyCode.json")
    public ResponseEntity<?> checkEmailCertifyCode(@RequestBody EmailVO emailVO) {

        boolean result = emailService.checkEmailCertifyCode(emailVO);

        return resUtil.successRes(result, MessageCode.CERTIFY_SUCCESS);
    }

    /**
     * @param emailVO - 이메일 정보
     * @return ResponseEntity - 이메일 인증코드 확인 응답 결과
     *
     * 2차 인증 이메일 인증코드 확인
     */
    @PostMapping("/check2ndAuthEmailCertifyCode.json")
    public void check2ndAuthEmailCertifyCode(@RequestBody EmailVO emailVO, HttpServletRequest req, HttpServletResponse res) throws IOException {

        boolean authResult = emailService.checkEmailCertifyCode(emailVO); // 이메일 인증코드 확인
        if(authResult) {
            HashMap<String, Object> findMber = new HashMap<>();
            findMber.put("mbrId", emailVO.getMbrId());
            MberVO mber = mberService.findByMbr(findMber);

            loginUtil.successLogin(mber, req, res);
        } else {
            // 인증 실패 시 예외 처리
            Map<String, Object> result = new HashMap<>();
            res.setContentType("application/json;charset=UTF-8");
            res.setStatus(HttpStatus.UNAUTHORIZED.value());
            result.put("message", "인증에 실패했습니다. 올바른 인증코드를 입력해주세요.");
            new ObjectMapper().writeValue(res.getOutputStream(), result);
            return;
        }

//        return resUtil.successRes(authResult, MessageCode.COMMON_SUCCESS);
    }
}
