package go.kr.project.mypage.controller;

import egovframework.constant.TilesConstants;
import egovframework.util.ApiResponseUtil;
import go.kr.project.mypage.service.MypageService;
import go.kr.project.system.user.model.SystemUserVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * packageName    : go.kr.project.mypage.controller
 * fileName       : MypageController
 * author         : 시스템 관리자
 * date           : 2025-05-20
 * description    : 마이페이지 관련 컨트롤러
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2025-05-20        시스템 관리자       최초 생성
 */
@Slf4j
@Controller
@RequiredArgsConstructor
@Tag(name = "마이페이지", description = "마이페이지 관련 API")
public class MypageController {

    private final MypageService mypageService;

    /**
     * 마이페이지 화면
     * @param model 모델
     * @param request HTTP 요청 객체
     * @return 뷰 이름
     */
    @Operation(summary = "마이페이지 화면", description = "마이페이지 화면 조회합니다.")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "마이페이지 화면 성공")
    })
    @GetMapping("/mypage.do")
    public String mypage(Model model, HttpServletRequest request) {
        // 사용자 정보 조회
        SystemUserVO user = mypageService.getUserInfo(request);
        model.addAttribute("user", user);

        return "mypage/mypage"+ TilesConstants.BASE;
    }

    /**
     * 사용자 정보 수정 화면
     * @param model 모델
     * @param request HTTP 요청 객체
     * @return 뷰 이름
     */
    @Operation(summary = "사용자 정보 수정 화면", description = "사용자 정보 수정 화면 페이지를 조회합니다.")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "사용자 정보 수정 화면 성공")
    })
    @GetMapping("/mypage/edit.do")
    public String editUserInfo(Model model, HttpServletRequest request) {
        // 사용자 정보 조회
        SystemUserVO user = mypageService.getUserInfo(request);
        model.addAttribute("user", user);

        return "mypage/edit"+ TilesConstants.BASE;
    }

    /**
     * 사용자 정보 수정 처리 (AJAX)
     * @param user 사용자 정보
     * @param request HTTP 요청 객체
     * @return 응답 엔티티
     */
    @Operation(summary = "사용자 정보 수정 처리 (AJAX)", description = "사용자 정보 수정 처리 (AJAX) 합니다.")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "사용자 정보 수정 처리 (AJAX) 성공")
    })
    @PostMapping("/mypage/edit.ajax")
    public ResponseEntity<?> updateUserInfo(@ModelAttribute SystemUserVO user, HttpServletRequest request) {
        // 사용자 정보 수정
        boolean result = mypageService.updateUserInfo(user, request);

        if (result) {
            return ApiResponseUtil.success("사용자 정보가 성공적으로 수정되었습니다.");
        } else {
            return ApiResponseUtil.error("사용자 정보 수정에 실패했습니다.");
        }
    }

    /**
     * 비밀번호 변경 화면
     * @param model 모델
     * @param request HTTP 요청 객체
     * @return 뷰 이름
     */
    @Operation(summary = "비밀번호 변경 화면", description = "비밀번호 변경 화면 페이지를 조회합니다.")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "비밀번호 변경 화면 성공")
    })
    @GetMapping("/mypage/password.do")
    public String changePassword(Model model, HttpServletRequest request) {
        // 사용자 정보 조회
        SystemUserVO user = mypageService.getUserInfo(request);
        model.addAttribute("user", user);

        return "mypage/password"+ TilesConstants.POPUP;
    }

    /**
     * 비밀번호 초기화 변경 화면
     * @param model 모델
     * @param request HTTP 요청 객체
     * @return 뷰 이름
     */
    @Operation(summary = "비밀번호 초기화 변경 화면", description = "비밀번호 초기화 변경 화면 페이지를 조회합니다.")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "비밀번호 초기화 변경 화면 성공")
    })
    @GetMapping("/mypage/password-reset.do")
    public String changePasswordReset(Model model, HttpServletRequest request) {
        // 사용자 정보 조회
        SystemUserVO user = mypageService.getUserInfo(request);
        model.addAttribute("user", user);

        return "mypage/password_reset"+ TilesConstants.BASE;
    }

    /**
     * 비밀번호 확인 (AJAX)
     * @param user 사용자 정보 (currentPasswd 필요)
     * @param request HTTP 요청 객체
     * @return 응답 엔티티
     */
    @Operation(summary = "비밀번호 확인 (AJAX)", description = "비밀번호 확인 (AJAX) 합니다.")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "비밀번호 확인 (AJAX) 성공")
    })
    @PostMapping("/mypage/check-password.ajax")
    public ResponseEntity<?> checkPassword(@RequestBody SystemUserVO user, HttpServletRequest request) {
        try {
            // 현재 로그인한 사용자 정보 조회
            SystemUserVO currentUser = mypageService.getUserInfo(request);
            user.setUserId(currentUser.getUserId());

            // 비밀번호 확인
            boolean result = mypageService.checkPassword(user);

            Map<String, Object> data = new HashMap<>();
            data.put("valid", result);

            if (result) {
                return ApiResponseUtil.success(data, "비밀번호가 일치합니다.");
            } else {
                return ApiResponseUtil.error("비밀번호가 일치하지 않습니다.");
            }
        } catch (Exception e) {
            log.error("비밀번호 확인 오류: {}", e.getMessage(), e);
            return ApiResponseUtil.error(e.getMessage());
        }
    }

    /**
     * 비밀번호 변경 처리 (AJAX)
     * @param user 사용자 정보 (currentPasswd, newPasswd, confirmPasswd 필요)
     * @param request HTTP 요청 객체
     * @return 응답 엔티티
     */
    @Operation(summary = "비밀번호 변경 처리 (AJAX)", description = "비밀번호 변경 처리 (AJAX) 합니다.")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "비밀번호 변경 처리 (AJAX) 성공")
    })
    @PostMapping("/mypage/password.ajax")
    public ResponseEntity<?> updatePassword(@RequestBody SystemUserVO user, HttpServletRequest request) {
        // 비밀번호 변경
        boolean result = mypageService.updatePassword(user, request);

        if (result) {
            return ApiResponseUtil.success("비밀번호가 성공적으로 변경되었습니다.");
        } else {
            return ApiResponseUtil.error("비밀번호 변경에 실패했습니다.");
        }
    }
}
