package incheon.cmm.g2f.poi.web;

import incheon.cmm.g2f.poi.service.G2FPoiService;
import incheon.cmm.g2f.poi.vo.G2FPoiVO;
import incheon.com.cmm.api.DefaultApiResponse;
import incheon.com.security.vo.LoginVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DataAccessException;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;

@Slf4j
@Controller
@RequestMapping("/cmm/g2f/poi")
public class G2FPoiController {

    private final G2FPoiService poiService;

    public G2FPoiController(G2FPoiService poiService) {
        this.poiService = poiService;
    }

    /**
     * POI 목록 조회
     */
    @GetMapping("/poiList.do")
    public String list(Model model,
                      @RequestParam(value = "page", defaultValue = "1") int page,
                      @RequestParam(value = "size", defaultValue = "10") int size,
                      @RequestParam(value = "searchKeyword", required = false) String searchKeyword,
                      @RequestParam(value = "searchType", required = false) String searchType) {


        model.addAttribute("page", page);
        model.addAttribute("size", size);
        model.addAttribute("searchKeyword", searchKeyword);
        model.addAttribute("searchType", searchType);
        
        return "cmm/g2f/basemap/poi/poiList";
    }

    /**
     * POI 등록 폼
     */
    @GetMapping("/create.do")
    public String showCreateForm(Model model) {
        model.addAttribute("poi", new G2FPoiVO());
        return "cmm/g2f/basemap/poi/poiCreate";
    }

    /**
     * POI 등록 처리
     */
    @PostMapping("/create.do")
    public String create(@Valid @ModelAttribute("poi") G2FPoiVO poi,
                        BindingResult bindingResult, 
                        HttpSession session) {
        if (bindingResult.hasErrors()) {
            return "cmm/g2f/basemap/poi/poiCreate";
        }
        
        LoginVO loginVO = (LoginVO) session.getAttribute("loginVO");
        if (loginVO == null) {
            log.warn("로그인되지 않은 사용자의 등록 시도");
            loginVO = new LoginVO();
            loginVO.setUserNm("관리자");
            loginVO.setUserId("admin");
        }
        
        poiService.create(poi);
        
        return "redirect:/cmm/g2f/poi/poiList.do";
    }

    /**
     * POI 수정 폼
     */
    @GetMapping("/edit.do")
    public String editForm(@RequestParam String nfId, Model model) {
        return "cmm/g2f/basemap/poi/poiEdit";
    }

    /**
     * POI 수정 처리
     */
    @PostMapping("/edit.do")
    public String edit(@RequestParam String nfId,
                      @Valid @ModelAttribute("poi") G2FPoiVO poi,
                      BindingResult bindingResult, 
                      HttpSession session) {

        if (bindingResult.hasErrors()) {
            return "cmm/g2f/basemap/poi/poiEdit";
        }
        
        LoginVO loginVO = (LoginVO) session.getAttribute("loginVO");
        if (loginVO == null) {
            log.warn("로그인되지 않은 사용자의 수정 시도");
            loginVO = new LoginVO();
            loginVO.setUserNm("관리자");
            loginVO.setUserId("admin");
        }
        
        poi.setNfId(nfId);
        poiService.update(poi);
        
        return "redirect:/cmm/g2f/poi/poiList.do";
    }

    /**
     * POI 삭제 처리
     */
    @PostMapping("/delete.do")
    public String delete(@RequestParam String nfId) {
        try {
            log.info("삭제 요청 - ID: {}", nfId);
            poiService.delete(nfId);
            return "redirect:/cmm/g2f/poi/poiList.do?success=deleted";  
        } catch (DataAccessException e) {
            log.error("삭제 실패 - ID: {}", nfId, e);
            return "redirect:/cmm/g2f/poi/poiList.do?error=delete_failed";
        }
    }

    /**
     * POI 목록 JSON API
     */
    @GetMapping(value = "/api/v1/poi", produces = "application/json")
    @ResponseBody
    public ResponseEntity<DefaultApiResponse<List<G2FPoiVO>>> pois() throws IOException {
        return ResponseEntity.ok(DefaultApiResponse.success(poiService.getList()));
    }
}