package com.dbnt.kcgfilemanager.controller;

import com.dbnt.kcgfilemanager.config.LogStatus;
import com.dbnt.kcgfilemanager.model.*;
import com.dbnt.kcgfilemanager.service.BoardCategoryService;
import com.dbnt.kcgfilemanager.service.BoardService;
import com.dbnt.kcgfilemanager.service.CategoryRoleService;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/board")
public class BoardController {

  private final BoardService boardService;
  private final BoardCategoryService boardCategoryService;
  private final CategoryRoleService categoryRoleService;


  @GetMapping("/main")
  public ModelAndView main(Board param) {
    ModelAndView mav = new ModelAndView("board/main");
    param.setStatus("M");
    param.setQueryInfo();
    mav.addObject("contentList", boardService.selectContentList(param));
    param.setContentCnt(boardService.selectContentListCnt(param));
    param.setPaginationInfo();
    mav.addObject("searchParams", param);
    return mav;
  }

  @GetMapping("/contentWrite")
  public ModelAndView contentWrite(@AuthenticationPrincipal UserInfo loginUser, Board content, Integer categorySeq) {
    ModelAndView mav = new ModelAndView("board/contentWrite");
    if(content.getContentSeq() == null) {
      mav.addObject("type", "new");
      mav.addObject("userId", loginUser.getUserId());
      mav.addObject("userName", loginUser.getName());
    }else{
      mav.addObject("type", "modify");
      mav.addObject("content", boardService.selectContentModifyInfo(content.getContentSeq()));
    }
    mav.addObject("categorySeq", categorySeq==null?0:categorySeq);
    mav.addObject("userRole", loginUser.getUserRole());
    CategoryRole categoryRole = new CategoryRole();
    categoryRole.setUserSeq(loginUser.getUserSeq());
    mav.addObject("categoryRole", categoryRoleService.selectCategorySeqListToUser(categoryRole));
    return mav;
  }

  @PostMapping("/saveContent")
  public Integer saveContent(Board content, MultipartHttpServletRequest request){
    content.setFileList(request.getMultiFileMap().get("uploadFiles"));
    return boardService.saveContent(content);
  }

  @PostMapping("/updateContent")
  public Integer updateContent(Board content, @RequestParam(value = "fileSeq", required = false) List<Integer> deleteFileSeq, MultipartHttpServletRequest request, @AuthenticationPrincipal UserInfo loginUser){
    content.setFileList(request.getMultiFileMap().get("uploadFiles"));
    return boardService.updateContent(content, deleteFileSeq, loginUser);
  }

  @GetMapping("/contentList")
  public ModelAndView contentList(Board board, @RequestParam(value = "tagName", required = false) List<String> tagNameList){
    ModelAndView mav = new ModelAndView("board/contentList");
    mav.addObject("pageTitle", boardCategoryService.getDepth4PageTitle(board.getCategorySeq()));
    board.setQueryInfo();
    if(tagNameList != null && tagNameList.size() != 0){
      board = boardService.setHashTagSearch(board, tagNameList);
    }
    mav.addObject("contentList", boardService.selectContentList(board));
    board.setContentCnt(boardService.selectContentListCnt(board));
    board.setPaginationInfo();
    mav.addObject("searchParams", board);
    return mav;
  }

  @PostMapping("/fullSearchBoardContent")
  @ResponseBody
  public ModelAndView fullSearchBoardContent(
      Board board,
     @RequestParam(value = "searchCategorySeq", required = false) List<Integer> categorySeqList,
     @RequestParam(value = "tagName", required = false) List<String> tagNameList
  ){
    ModelAndView mav = new ModelAndView("board/contentSearchResult");
    if(tagNameList != null && tagNameList.size() != 0){
      board = boardService.setHashTagSearch(board, tagNameList);
    }
    mav.addObject("boardList", boardService.fullSearchBoardContent(categorySeqList, board));
    return mav;
  }

  @GetMapping("/selectBoardContent")
  public ModelAndView selectBoardContent(Board content, @AuthenticationPrincipal UserInfo loginUser){
    ModelAndView mav = new ModelAndView("board/contentDetail");
    Board target = boardService.selectContentByContentSeqAndViewCntUp(content.getContentSeq());
    mav.addObject("content", boardService.selectContentForeignAttribute(target));
    mav.addObject("loginUser", loginUser);
    return mav;
  }
  @GetMapping("/selectBoardLog")
  public ModelAndView selectBoardLog(Board content){
    ModelAndView mav = new ModelAndView("board/contentLog");
    mav.addObject("contentSeq", content.getContentSeq());
    mav.addObject("statusMap", LogStatus.getStatusMap());
    mav.addObject("logList", boardService.selectContentLog(content.getContentSeq()));
    return mav;
  }
  @PostMapping("/deleteContent")
  public Integer deleteContent(Board content, @AuthenticationPrincipal UserInfo loginUser){
    return boardService.deleteContent(content, loginUser);
  }

  @GetMapping("/contentSearch")
  public ModelAndView contentSearch(Board content){
    ModelAndView mav = new ModelAndView("board/contentSearch");
    return mav;
  }

}
