package com.eksad.masterdata.controller;

import com.eksad.ddms.common.uri.apigateway.APIGatewayURI;
import com.eksad.ddms.common.util.StringUtil;
import com.eksad.ddms.common.util.status.DataStatus;
import com.eksad.masterdata.common.dto.ManageWorkOrderHeaderResponseDTO;
import com.eksad.masterdata.common.dto.ManageWorkOrderParamDTO;
import com.eksad.masterdata.common.dto.ManageWorkOrderResponseDTO;
import com.eksad.masterdata.common.listEnum.SourceType;
import com.eksad.masterdata.domain.CreationalSpecification;
import com.eksad.masterdata.domain.Payload;
import com.eksad.masterdata.repository.ParamJsonApiGateway;
import com.eksad.masterdata.repository.ParamJsonApiGatewayRepository;
import com.eksad.masterdata.repository.PayloadRepository;
import com.eksad.masterdata.service.APIManageWorkOrderHystrixService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

@RestController
@Slf4j
public class ApigatewayManageWorkOrderRestController {

    @Autowired
    APIManageWorkOrderHystrixService manageWoService;

    @Autowired
    ParamJsonApiGatewayRepository paramJsonApiGatewayRepository;

    @Autowired
    PayloadRepository payloadRepository;

    @Value("${dam.masterdata.h2}")
    private String md_h2;

    private ManageWorkOrderHeaderResponseDTO manageWorkOrderHeaderResponseDTO;

    @RequestMapping(value = "/dgi-api/v1/pkb/read",
            method = RequestMethod.POST,
            produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Object> ManageWorkOrderAPIGATEWAYV1(@RequestBody ManageWorkOrderParamDTO paramDTO) {
        System.out.println("Data API Gateway WO");
        ParamJsonApiGateway paramJsonApiGateway = new ParamJsonApiGateway();
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date startDate = null;
        Date toDate = null;
        ManageWorkOrderResponseDTO manageWorkOrderResponseDTO;
        manageWorkOrderHeaderResponseDTO = new ManageWorkOrderHeaderResponseDTO();
        try {

            if (StringUtil.hasValue(paramDTO.getFromTime())) {
                startDate = dateFormat.parse(paramDTO.getFromTime());
                if (!StringUtil.hasValue(paramDTO.getToTime())) {
                    paramDTO.setToTime(getCurrentDate());
                }
                if (!checkToTimeIs7Days(paramDTO.getFromTime(), paramDTO.getToTime())) {
                    return new ResponseEntity<>(new ManageWorkOrderHeaderResponseDTO(0, "Rentang waktu melebihi 7 hari.", null), HttpStatus.OK);
                }
            } else {
                return new ResponseEntity<>(new ManageWorkOrderHeaderResponseDTO(0, "Mohon isi fromTime.", null), HttpStatus.OK);
            }
            if (StringUtil.hasValue(paramDTO.getToTime())) {
                toDate = dateFormat.parse(paramDTO.getToTime());
            }
            ResponseEntity<Object> result = manageWoService.getManageWorkOrder(paramDTO.getNoWorkOrder(), paramDTO.getDealerId(), paramDTO.getFromTime(), paramDTO.getToTime());
            paramJsonApiGatewayRepository.save(constructParamDTOTODomain(paramDTO));

            Payload payload = new Payload();
            payload.setSourceId(paramDTO.getNoWorkOrder());
            payload.setSourceType(SourceType.API_GATEWAY);
            payload.setEvent("POST_API_GATEWAY");
            payload.setEventDate(new Date());
            payload.setPayloadStatus(DataStatus.ACTIVE);
            payload.setType("WO");
            payload.setReqPayload(new ObjectMapper().writeValueAsString(paramDTO));
            payload.setResPayload(new ObjectMapper().writeValueAsString(result.getBody()));
            payload.setUrl(md_h2 + APIGatewayURI.PULL_MANAGE_WORKORDER);
            payload.setPayloadCreational(new CreationalSpecification(new Date(), "admin", null, null));
            payloadRepository.save(payload);
            return result;

        } catch (Exception e) {
            e.printStackTrace();

            manageWorkOrderHeaderResponseDTO.setMessage("Terdapat kesalahan");
            manageWorkOrderHeaderResponseDTO.setStatus(0);
            return new ResponseEntity<>(manageWorkOrderHeaderResponseDTO, HttpStatus.OK);

        }
    }

    public static String getCurrentDate() throws ParseException {
        final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return format.format(new Date());
    }

    private Boolean checkToTimeIs7Days(String fromTime, String toTime) throws ParseException {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date from = dateFormat.parse(fromTime);
        Date to = dateFormat.parse(toTime);
        LocalDateTime fromLocal = from.toInstant().atZone(ZoneId.of("Asia/Jakarta")).toLocalDateTime();
        LocalDateTime toLocal = to.toInstant().atZone(ZoneId.of("Asia/Jakarta")).toLocalDateTime();
        Duration durasi = Duration.between(fromLocal, toLocal);
        long dayDifference = Math.abs(durasi.toHours());
        if (dayDifference > (7 * 24) + 1) {  // if duration greater than 24*7 + 1 hours
            return false;
        }
        return true;
    }

    private ParamJsonApiGateway constructParamDTOTODomain(ManageWorkOrderParamDTO dto) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        CreationalSpecification creationalSpecification = new CreationalSpecification();
        creationalSpecification.setCreatedAt(new Date());
        creationalSpecification.setCreatedBy("APIGATEWAY_SYSTEM");
        ParamJsonApiGateway paramJsonApiGateway = new ParamJsonApiGateway();
        paramJsonApiGateway.setCategoryJson("ManageWorkOrder");
        paramJsonApiGateway.setJson(mapper.writeValueAsString(dto));
        paramJsonApiGateway.setParamApiGatewayCreational(creationalSpecification);
        return paramJsonApiGateway;
    }
}