package com.its.api.its.controller.vms;

import com.its.api.its.model.dto.vms.TbVmsFormDto;
import com.its.api.its.model.dto.vms.TbVmsMsgDsplSchDto;
import com.its.api.its.model.dto.vms.TbVmsMsgDsplSchVmsListDto;
import com.its.api.its.service.vms.TbVmsFormService;
import com.its.api.its.service.vms.TbVmsMsgDsplSchService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

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

@Api(tags = "12.VMS-3.스케줄관리-0.공통")
@Validated
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/vms/schedule/common")
public class TbVmsMsgDsplSchController {

    private final TbVmsMsgDsplSchService service;
    private final TbVmsFormService formService;

    /*
      스케쥴 관리에서 VMS 크기 유형이 변경될때 등록되어 있는 폼 을 조회한다.
      자동, 고정, 기본 스케쥴에 따라 등록되어 있는 폼 유형을 조회한다.(고정, 기본 스케줄은 홍보 폼 만 등록 가능하다)
     */

    /**
     * VMS 크기유형에 따른 모든 폼을 조회(조회 속도 때문에 사용하지 말자)
     * @param type
     * @return
     */
    @ApiOperation(value = "VMS 폼 정보 조회(TB_VMS_FORM)", response = TbVmsFormDto.class, responseContainer = "ArrayList")
    @GetMapping(value = "/form/{type}", produces = {"application/json; charset=utf8"})
    public List<TbVmsFormDto> findAllByVmsType(
            @ApiParam(name = "type", value = "VMS 유형(크기) 코드", example = "VMP2", required = true)
            @PathVariable final String type
    ) {
        return this.formService.findAllByVmsType(type);
    }

    /**
     * 자동스케줄: 교통정보, 정체, 돌발, 공사/행사, 홍보, 우회도로, 재난안전
     * 고정스케줄: 홍보
     * 기본스케줄: 홍보
     */
    // 교통정보
    @ApiOperation(value = "VMS 폼 정보 조회-교통정보(TB_VMS_FORM)", response = TbVmsFormDto.class, responseContainer = "ArrayList")
    @GetMapping(value = "/form/traffic/{type}", produces = {"application/json; charset=utf8"})
    public List<TbVmsFormDto> findAllTrafficByVmsType(
            @ApiParam(name = "type", value = "VMS 유형(크기) 코드", example = "VMP2", required = true)
            @PathVariable final String type
    ) {
        return this.formService.findAllTraffic(type);
    }

    // 정체
    @ApiOperation(value = "VMS 폼 정보 조회-정체(TB_VMS_FORM)", response = TbVmsFormDto.class, responseContainer = "ArrayList")
    @GetMapping(value = "/form/congest/{type}", produces = {"application/json; charset=utf8"})
    public List<TbVmsFormDto> findAllCongestByVmsType(
            @ApiParam(name = "type", value = "VMS 유형(크기) 코드", example = "VMP2", required = true)
            @PathVariable final String type
    ) {
        return this.formService.findAllCongest(type);
    }

    // 돌발
    @ApiOperation(value = "VMS 폼 정보 조회-돌발(TB_VMS_FORM)", response = TbVmsFormDto.class, responseContainer = "ArrayList")
    @GetMapping(value = "/form/incident/{type}", produces = {"application/json; charset=utf8"})
    public List<TbVmsFormDto> findAllIncidentByVmsType(
            @ApiParam(name = "type", value = "VMS 유형(크기) 코드", example = "VMP2", required = true)
            @PathVariable final String type
    ) {
        return this.formService.findAllIncident(type);
    }

    // 공사/행사
    @ApiOperation(value = "VMS 폼 정보 조회-공사/행사(TB_VMS_FORM)", response = TbVmsFormDto.class, responseContainer = "ArrayList")
    @GetMapping(value = "/form/event/{type}", produces = {"application/json; charset=utf8"})
    public List<TbVmsFormDto> findAllEventByVmsType(
            @ApiParam(name = "type", value = "VMS 유형(크기) 코드", example = "VMP2", required = true)
            @PathVariable final String type
    ) {
        return this.formService.findAllEvent(type);
    }

    // 홍보
    @ApiOperation(value = "VMS 폼 정보 조회-홍보(TB_VMS_FORM)", response = TbVmsFormDto.class, responseContainer = "ArrayList")
    @GetMapping(value = "/form/notice/{type}", produces = {"application/json; charset=utf8"})
    public List<TbVmsFormDto> findAllHongboByVmsType(
            @ApiParam(name = "type", value = "VMS 유형(크기) 코드", example = "VMP2", required = true)
            @PathVariable final String type
    ) {
        return this.formService.findAllHongbo(type);
    }

    // 우회도로
    @ApiOperation(value = "VMS 폼 정보 조회-우회도로(TB_VMS_FORM)", response = TbVmsFormDto.class, responseContainer = "ArrayList")
    @GetMapping(value = "/form/detour/{type}", produces = {"application/json; charset=utf8"})
    public List<TbVmsFormDto> findAllDetourByVmsType(
            @ApiParam(name = "type", value = "VMS 유형(크기) 코드", example = "VMP2", required = true)
            @PathVariable final String type
    ) {
        return this.formService.findAllDetour(type);
    }

    // 재난안전
    @ApiOperation(value = "VMS 폼 정보 조회-재난안전(TB_VMS_FORM)", response = TbVmsFormDto.class, responseContainer = "ArrayList")
    @GetMapping(value = "/form/safety/{type}", produces = {"application/json; charset=utf8"})
    public List<TbVmsFormDto> findAllSafetyByVmsType(
            @ApiParam(name = "type", value = "VMS 유형(크기) 코드", example = "VMP2", required = true)
            @PathVariable final String type
    ) {
        return this.formService.findAllSafety(type);
    }


    /**
     * VMS 폼 표출 스케줄 저장
     * @param listReq
     * @return
     */
    @ApiOperation(value = "VMS 교통 정보 표출 일정 정보변경/생성-목록(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
    @PostMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
    public List<TbVmsMsgDsplSchDto> mergeInfoList(
            @ApiParam(name = "id", value = "VMS 제어기 관리번호", example = "10005", required = true)
            @PathVariable final Long id,
            @RequestBody @Valid final List<TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq> listReq) {
        return this.service.mergeInfoList(id, listReq);
    }

    /**
     * [전체 VMS 편집 - VMS 목록]
     * @param type
     * @param kind
     * @param form
     * @return
     */
    @ApiOperation(value = "VMS 스케줄 VMS 목록 조회[전체 VMS 편집](TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchVmsListDto.class, responseContainer = "ArrayList")
    @GetMapping(value = "/vms-list/edit/{type}/{kind}/{form}", produces = {"application/json; charset=utf8"})
    public List<TbVmsMsgDsplSchVmsListDto> findAllByEditVmsList(
            @ApiParam(name = "type", value = "VMS 유형(크기) 코드", example = "VMP2", required = true)
            @PathVariable final String type,
            @ApiParam(name = "kind", value = "VMS 스케줄 종류(0:교통정보,1:돌발,2:공사/행사문안,3:홍보문안,4:우회도로,5:고정스케줄, 6:기본스케줄,...)", example = "3", required = true)
            @PathVariable final String kind,
            @ApiParam(name = "form", value = "VMS 폼 번호", example = "10404", required = true)
            @PathVariable final Integer form
            ) {
        return this.service.findAllByAllEditVmsList(type, kind, form, true);
    }

    /**
     * [전체 VMS 등록 - VMS 목록]
     * @param type
     * @param kind
     * @param form
     * @return
     */
    @ApiOperation(value = "VMS 스케줄 VMS 목록 조회[전체 VMS 등록](TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchVmsListDto.class, responseContainer = "ArrayList")
    @GetMapping(value = "/vms-list/add/{type}/{kind}/{form}", produces = {"application/json; charset=utf8"})
    public List<TbVmsMsgDsplSchVmsListDto> findAllByAddVmsList(
            @ApiParam(name = "type", value = "VMS 유형(크기) 코드", example = "VMP2", required = true)
            @PathVariable final String type,
            @ApiParam(name = "kind", value = "VMS 스케줄 종류(0:교통정보,1:돌발,2:공사/행사문안,3:홍보문안,4:우회도로,5:고정스케줄, 6:기본스케줄,...)", example = "3", required = true)
            @PathVariable final String kind,
            @ApiParam(name = "form", value = "VMS 폼 번호", example = "10065", required = true)
            @PathVariable final Integer form
    ) {
        return this.service.findAllByAllEditVmsList(type, kind, form, false);
    }

    /**
     * VMS 폼 표출 스케줄 일괄 등록[전체 VMS 등록 - 저장]
     * @param listReq
     * @return
     */
    @ApiOperation(value = "VMS 교통 정보 표출 일정 정보변경/생성-목록[전체 VMS 등록 - 저장](TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
    @PostMapping(value = "/batch", produces = {"application/json; charset=utf8"})
    public List<TbVmsMsgDsplSchDto> batchCreateInfoList(@RequestBody @Valid final List<TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq> listReq) {
        return this.service.batchCreateInfoList(listReq);
    }

    /**
     * VMS 폼 표출 스케줄 일괄 저장[전체 VMS 편집 - 저장]
     * @param listReq
     * @return
     */
    @ApiOperation(value = "VMS 교통 정보 표출 일정 정보변경/생성-목록[전체 VMS 편집 - 저장](TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
    @PutMapping(value = "/batch", produces = {"application/json; charset=utf8"})
    public List<TbVmsMsgDsplSchDto> batchMergeInfoList(@RequestBody @Valid final List<TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq> listReq) {
        return this.service.batchMergeInfoList(listReq);
    }

    /**
     * VMS 폼 표출 스케줄 일괄 삭제[전체 VMS 편집 - 삭제]
     * @param ids
     * @return
     */
    @ApiOperation(value = "VMS 교통 정보 표출 일정 정보삭제-목록-[전체 VMS 편집 - 삭제](TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchDelReq.class, responseContainer = "ArrayList")
    @DeleteMapping(value = "/batch", produces = {"application/json; charset=utf8"})
    public List<TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchDelReq> batchDeleteDataByIds(
            @RequestBody @Valid final List<TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchDelReq> ids) {
        return this.service.batchDeleteByIds(ids);
    }

    //TODO: 스케줄에서 VMS 객체 선택 시 폼 이미지 다시 그리는 것 추가해야함.

}
