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

import egovframework.constant.MessageConstants;
import egovframework.constant.TilesConstants;
import egovframework.util.ApiResponseUtil;
import go.kr.project.system.role.model.RoleModifiedDataVO;
import go.kr.project.system.role.model.RoleSearchVO;
import go.kr.project.system.role.model.RoleVO;
import go.kr.project.system.role.service.RoleService;
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.*;

import java.util.List;

/**
 * packageName    : go.kr.project.system.role.controller
 * fileName       : RoleController
 * author         : 시스템 관리자
 * date           : 2023-06-01
 * description    : 역할 관리 컨트롤러
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2023-06-01        시스템 관리자       최초 생성
 */
@RequestMapping("/system/role")
@Controller
@RequiredArgsConstructor
@Slf4j
@Tag(name = "시스템: 역할 관리", description = "역할 관리 관련 API")
public class RoleController {

    private final RoleService roleService;

    /**
     * 역할 목록 페이지를 조회합니다.
     *
     * @param model 뷰에 전달할 데이터를 담는 모델 객체
     * @return 역할 목록 페이지 뷰 이름
     */
    @Operation(summary = "역할 목록 페이지 조회", description = "역할 목록 페이지를 조회합니다.")
    @ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "역할 목록 페이지 조회 성공")
    })
    @GetMapping("/list.do")
    public String roleList(Model model) {
        return "system/role/list"+ TilesConstants.BASE;
    }

    /**
     * 역할 목록을 조회하는 AJAX 메소드
     * 공통 응답 형식(ApiResponse)을 사용하여 응답합니다.
     * 
     * @param paramVO 검색 조건을 담은 VO 객체
     * @return 역할 목록과 성공 상태를 담은 ResponseEntity 객체
     */
    @Operation(summary = "역할 목록 조회 (AJAX)", description = "역할 목록을 조회하고 JSON 형식으로 반환합니다.")
    @ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "역할 목록 조회 성공"),
        @ApiResponse(responseCode = "400", description = "역할 목록 조회 실패"),
        @ApiResponse(description = "오류로 인한 실패")
    })
    @PostMapping("/list.ajax")
    public ResponseEntity<?> getRoleListAjax(@ModelAttribute RoleSearchVO paramVO) {
        // 총 역할 수 조회
        int totalCount = roleService.selectRoleListTotalCount(paramVO);
        paramVO.setTotalCount(totalCount);

        // 페이징 처리를 위한 설정
        paramVO.setPagingYn("Y");

        if( paramVO.getSortColumn() == null && paramVO.getSortAscending() == null ){
            paramVO.setSortColumn("sortOrdr");
            paramVO.setSortAscending(true);
        }

        // 페이징 처리된 역할 목록 조회
        List<RoleVO> roleList = roleService.selectRoleList(paramVO);
        return ApiResponseUtil.successWithGrid(roleList, paramVO);
    }


    /**
     * 역할 정보를 일괄 저장하는 AJAX 메소드
     * 생성, 수정, 삭제된 역할 데이터를 처리합니다.
     * 공통 응답 형식(ApiResponse)을 사용하여 응답합니다.
     *
     * @param modifyData 생성/수정/삭제할 역할 정보를 담은 VO 객체
     * @return 저장 결과 메시지와 성공/실패 상태를 담은 ResponseEntity 객체
     */
    @Operation(summary = "역할 정보 일괄 저장", description = "생성, 수정, 삭제된 역할 데이터를 일괄 처리합니다.")
    @ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "역할 정보 저장 성공"),
        @ApiResponse(responseCode = "400", description = "역할 정보 저장 실패"),
        @ApiResponse(description = "오류로 인한 실패")
    })
    @PostMapping("/saveAll.ajax")
    public ResponseEntity<?> saveAllAjax(@RequestBody RoleModifiedDataVO modifyData) {
        int result = roleService.saveRoles(modifyData);
        if (result > 0) {
            return ApiResponseUtil.success(MessageConstants.Role.SAVE_SUCCESS);
        }else{
            return ApiResponseUtil.error(MessageConstants.Role.SAVE_ERROR);
        }
    }

}
