package incheon.ags.mrb.share.web;

import incheon.ags.mrb.share.service.RecipeShrnGroupService;
import incheon.ags.mrb.share.vo.RecipeShrnGroupVO;
import incheon.ags.mrb.share.web.dto.RecipeShrnGroupDTO;
import incheon.com.cmm.api.DefaultApiResponse;
import incheon.com.security.vo.LoginVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * 레시피 공유 그룹 REST API Controller
 * - 레시피 공유 그룹 정보 관리 REST API
 */
@Slf4j
@Tag(name = "Recipe Share Group", description = "레시피 공유 그룹 관리 API")
@RestController
@RequestMapping("/ags/mrb/recipes/share/group")
@RequiredArgsConstructor
@Validated
public class RecipeShrnGroupApiController {

    private final RecipeShrnGroupService recipeShrnGroupService;

    /**
     * 그룹 목록 조회
     *
     * @param loginUser 현재 로그인 사용자
     * @return 그룹 목록 응답
     * @throws Exception 조회 실패 시 예외 발생
     */
    @Operation(summary = "그룹 목록 조회", description = "현재 사용자가 멤버로 속한 그룹 목록을 조회합니다.")
    @GetMapping
    public ResponseEntity<DefaultApiResponse<List<RecipeShrnGroupDTO>>> getGroupList(
            @AuthenticationPrincipal LoginVO loginUser) throws Exception {

        // 검색 조건 설정
        RecipeShrnGroupVO recipeShrnGroupVO = new RecipeShrnGroupVO();
        recipeShrnGroupVO.setUserId(loginUser.getUserId());

        Map<String, Object> result = recipeShrnGroupService.getMyGroupList(recipeShrnGroupVO);

        @SuppressWarnings("unchecked")
        List<RecipeShrnGroupDTO> groupList = (List<RecipeShrnGroupDTO>) result.get("list");

        log.info("그룹 목록 조회 완료 - 총 {}건, userId: {}", result.get("totalCount"), loginUser.getUserId());

        return ResponseEntity.ok(DefaultApiResponse.success(groupList, "그룹 목록 조회 성공"));
    }

    /**
     * 그룹 생성
     *
     * @param recipeShrnGroupDTO 그룹 정보 및 멤버 목록
     * @param loginUser 현재 로그인 사용자
     * @return 생성된 그룹 ID 응답
     * @throws Exception 생성 실패 시 예외 발생
     */
    @Operation(summary = "그룹 생성", description = "새로운 레시피 공유 그룹을 생성합니다. 멤버 목록을 함께 등록할 수 있습니다.")
    @PostMapping
    public ResponseEntity<DefaultApiResponse<Integer>> createGroup(
            @Parameter(description = "그룹 정보 및 멤버 목록", required = true)
            @Valid @RequestBody RecipeShrnGroupDTO recipeShrnGroupDTO,
            @AuthenticationPrincipal LoginVO loginUser) throws Exception {

        Integer groupId = recipeShrnGroupService.createGroup(recipeShrnGroupDTO, loginUser.getUserId());

        log.info("그룹 생성 완료 - groupId: {}, groupName: {}, userId: {}",
                groupId, recipeShrnGroupDTO.getGroupName(), loginUser.getUserId());

        return ResponseEntity
                .status(HttpStatus.CREATED)
                .body(DefaultApiResponse.success(groupId, "그룹 생성 성공"));
    }


    /**
     * 그룹 수정
     *
     * @param groupId 그룹 ID
     * @param recipeShrnGroupDTO 수정할 그룹 정보 및 멤버 목록
     * @param loginUser 현재 로그인 사용자
     * @return 수정 결과 응답
     * @throws Exception 수정 실패 시 예외 발생
     */
    @Operation(summary = "그룹 수정", description = "레시피 공유 그룹의 정보와 멤버를 수정합니다.")
    @PutMapping("/{groupId}")
    public ResponseEntity<DefaultApiResponse<Void>> updateGroup(
            @Parameter(description = "그룹 ID", required = true) @PathVariable Integer groupId,
            @Parameter(description = "수정할 그룹 정보 및 멤버 목록", required = true)
            @Valid @RequestBody RecipeShrnGroupDTO recipeShrnGroupDTO,
            @AuthenticationPrincipal LoginVO loginUser) throws Exception {

        recipeShrnGroupService.updateGroup(groupId, recipeShrnGroupDTO, loginUser.getUserId());

        log.info("그룹 수정 완료 - groupId: {}, groupName: {}, userId: {}",
                groupId, recipeShrnGroupDTO.getGroupName(), loginUser.getUserId());

        return ResponseEntity.ok(DefaultApiResponse.success(null, "그룹 수정 성공"));
    }

    /**
     * 그룹 삭제
     *
     * @param groupId 그룹 ID
     * @param loginUser 현재 로그인 사용자
     * @return 삭제 결과 응답
     * @throws Exception 삭제 실패 시 예외 발생
     */
    @Operation(summary = "그룹 삭제", description = "레시피 공유 그룹을 삭제합니다.")
    @DeleteMapping("/{groupId}")
    public ResponseEntity<DefaultApiResponse<Void>> deleteGroup(
            @Parameter(description = "그룹 ID", required = true) @PathVariable Integer groupId,
            @AuthenticationPrincipal LoginVO loginUser) throws Exception {

        recipeShrnGroupService.deleteGroup(groupId);

        log.info("그룹 삭제 완료 - groupId: {}, userId: {}", groupId, loginUser.getUserId());
        return ResponseEntity.ok(DefaultApiResponse.success(null, "그룹 삭제 성공"));
    }
}
