/*
   * (non-Javadoc)
   *
   * @see WorkflowStep#invoke(WorkflowContext)
   */
  @Override
  public WorkflowContext invoke(WorkflowContext context) {
    LOGGER.info("AgrFlexOfferStub: started");
    List<FlexOfferDto> outputFlexOffers = new ArrayList<>();

    @SuppressWarnings("unchecked")
    List<FlexRequestDto> inputFlexRequests =
        (List<FlexRequestDto>)
            context.getValue(
                FlexOfferDetermineFlexibilityStepParameter.IN.FLEX_REQUEST_DTO_LIST.name());

    /*
     * For each give flex request, choose to: - create an offer, - do not create offer at all, - do not create offer now.
     */
    int decision;
    for (FlexRequestDto flexRequestDto : inputFlexRequests) {
      decision = 1; // original: RANDOM.nextInt(3); // 0,1 or 2
      FlexOfferDto flexOfferDto = new FlexOfferDto();
      flexOfferDto.setFlexRequestSequenceNumber(flexRequestDto.getSequenceNumber());
      flexOfferDto.setExpirationDateTime(
          now.plusDays(FLEX_OFFER_EXPIRATION_DAYS).withTime(0, 0, 0, 0));
      if (decision == 0) {
        // create a flex offer for the flex request: put a populated flex offer.
        LOGGER.debug(
            "A new FlexOffer will be created for FlexRequest with sequence [{}]",
            flexRequestDto.getSequenceNumber());
        populateFlexOfferDto(flexOfferDto, flexRequestDto, true);
        outputFlexOffers.add(flexOfferDto);
      } else if (decision == 1) {
        // refuse to create an offer for the flex request: put an empty flex offer.
        LOGGER.debug(
            "An empty FlexOffer will be created for FlexRequest with sequence [{}]",
            flexRequestDto.getSequenceNumber());
        populateFlexOfferDto(flexOfferDto, flexRequestDto, false);
        outputFlexOffers.add(flexOfferDto);
      } else {
        // do not create a flex offer now: don't put anything new in the output list.
        LOGGER.debug(
            "No FlexOffer will be created now for FlexRequest with sequence [{}]",
            flexRequestDto.getSequenceNumber());
      }
    }
    context.setValue(
        FlexOfferDetermineFlexibilityStepParameter.OUT.FLEX_OFFER_DTO_LIST.name(),
        outputFlexOffers);
    LOGGER.info("AgrFlexOfferStub: complete");
    return context;
  }