package go.kr.project.system.user.controller;

import egovframework.constant.MessageConstants;
import egovframework.constant.TilesConstants;
import egovframework.util.ApiResponseUtil;
import egovframework.util.SessionUtil;
import go.kr.project.system.group.model.GroupVO;
import go.kr.project.system.user.model.UserGroupPopupSearchVO;
import go.kr.project.system.user.service.UserGroupService;
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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 사용자 그룹 관리 컨트롤러
 * 그룹, 역할, 메뉴 관련 API를 제공합니다.
 */
@RequestMapping("/system/user")
@Controller
@RequiredArgsConstructor
@Slf4j
@Tag(name = "시스템: 사용자 그룹", description = "사용자 그룹 관리 관련 API")
public class UserGroupController {

    private final UserGroupService userGroupService;

    /**
     * 사용자 그룹 선택 팝업 페이지를 조회합니다.
     */
    @Operation(summary = "사용자 그룹 선택 팝업", description = "사용자 그룹 선택을 위한 팝업 페이지를 조회합니다.")
    @ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "팝업 페이지 조회 성공")
    })
    @GetMapping("/group_popup.do")
    public String groupPopup() {
        return "system/user/group_popup"+ TilesConstants.POPUP;
    }

    /**
     * 그룹 목록 조회
     * 로그인한 유저의 그룹이 SYSTEM이 아닐경우 GROUP_SYSTEM을 제외하고 조회
     */
    @Operation(summary = "그룹 목록 조회", description = "그룹 목록을 조회합니다. SYSTEM 그룹이 아닌 사용자는 GROUP_SYSTEM을 제외하고 조회됩니다.")
    @ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "그룹 목록 조회 성공"),
        @ApiResponse(responseCode = "400", description = "그룹 목록 조회 실패"),
        @ApiResponse(description = "오류로 인한 실패")
    })
    @PostMapping("/group/list.ajax")
    public ResponseEntity<?> getGroupList(UserGroupPopupSearchVO searchVO) {
        // 로그인한 사용자의 그룹 확인
        GroupVO userGroup = SessionUtil.getUserGroup();
        
        // 로그인한 유저의 그룹이 SYSTEM이 아닐경우 GROUP_SYSTEM을 제외하고 조회
        if (userGroup != null && !"GROUP_SYSTEM".equals(userGroup.getGroupId())) {
            searchVO.setExcludeGroupId("GROUP_SYSTEM");
        }
        
        return ApiResponseUtil.success(userGroupService.selectGroupList(searchVO), MessageConstants.UserGroup.GROUP_LIST_SUCCESS);
    }

    /**
     * 그룹별 역할 목록 조회
     */
    @Operation(summary = "그룹별 역할 목록 조회", description = "특정 그룹에 속한 역할 목록을 조회합니다.")
    @ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "역할 목록 조회 성공"),
        @ApiResponse(responseCode = "400", description = "역할 목록 조회 실패"),
        @ApiResponse(description = "오류로 인한 실패")
    })
    @PostMapping("/groupRole/list.ajax")
    public ResponseEntity<?> getGroupRoleList(UserGroupPopupSearchVO searchVO) {
        return ApiResponseUtil.success(userGroupService.selectGroupRoleList(searchVO), MessageConstants.UserGroup.ROLE_LIST_SUCCESS);
    }

    /**
     * 역할별 메뉴 목록 조회
     */
    @Operation(summary = "역할별 메뉴 목록 조회", description = "특정 역할에 할당된 메뉴 목록을 조회합니다.")
    @ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "메뉴 목록 조회 성공"),
        @ApiResponse(responseCode = "400", description = "메뉴 목록 조회 실패"),
        @ApiResponse(description = "오류로 인한 실패")
    })
    @PostMapping("/roleMenu/list.ajax")
    public ResponseEntity<?> getRoleMenuList(UserGroupPopupSearchVO searchVO) {
        return ApiResponseUtil.success(userGroupService.selectRoleMenuList(searchVO), MessageConstants.UserGroup.MENU_LIST_SUCCESS);
    }
}
