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

import egovframework.constant.MessageConstants;
import egovframework.constant.TilesConstants;
import egovframework.util.ApiResponseUtil;
import go.kr.project.system.group.model.GroupModifiedDataVO;
import go.kr.project.system.group.model.GroupSearchVO;
import go.kr.project.system.group.model.GroupVO;
import go.kr.project.system.group.service.GroupService;
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.group.controller
 * fileName       : GroupController
 * author         : 시스템 관리자
 * date           : 2023-06-01
 * description    : 그룹 관리 컨트롤러
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2023-06-01        시스템 관리자       최초 생성
 */
@RequestMapping("/system/group")
@Controller
@RequiredArgsConstructor
@Slf4j
@Tag(name = "시스템: 그룹 관리", description = "그룹 관리 관련 API")
public class GroupController {

    private final GroupService groupService;

    /**
     * 그룹 목록 페이지를 조회합니다.
     *
     * @param model 뷰에 전달할 데이터를 담는 모델 객체
     * @return 그룹 목록 페이지 뷰 이름
     */
    @Operation(summary = "그룹 목록 페이지 조회", description = "그룹 목록 페이지를 조회합니다.")
    @ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "그룹 목록 페이지 조회 성공")
    })
    @GetMapping("/list.do")
    public String groupList(Model model) {
        return "system/group/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<?> getGroupListAjax(@ModelAttribute GroupSearchVO paramVO) {
        // 총 그룹 수 조회
        int totalCount = groupService.selectGroupListTotalCount(paramVO);
        paramVO.setTotalCount(totalCount);

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

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

        // 페이징 처리된 그룹 목록 조회
        List<GroupVO> groupList = groupService.selectGroupList(paramVO);
        return ApiResponseUtil.successWithGrid(groupList, 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 GroupModifiedDataVO modifyData) {
        int result = groupService.saveGroups(modifyData);
        if (result > 0) {
            return ApiResponseUtil.success(MessageConstants.Group.SAVE_SUCCESS);
        } else {
            return ApiResponseUtil.error("그룹 저장에 실패했습니다.");
        }
    }


}
