/*
 * Copyright 2017 The Mifos Initiative.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.mifos.portfolio.api.v1.client;

import io.mifos.core.api.annotation.ThrowsException;
import io.mifos.core.api.util.CustomFeignClientsConfiguration;
import io.mifos.portfolio.api.v1.domain.*;
import io.mifos.portfolio.api.v1.validation.ValidSortColumn;
import io.mifos.portfolio.api.v1.validation.ValidSortDirection;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import java.math.BigDecimal;
import java.util.List;
import java.util.Set;

/**
 * @author Myrle Krantz
 */
@SuppressWarnings("unused")
@FeignClient(value = "portfolio-v1", path = "/portfolio/v1", configuration = CustomFeignClientsConfiguration.class)
public interface PortfolioManager {

  @RequestMapping(
      value = "/patterns/",
      method = RequestMethod.GET,
      produces = MediaType.ALL_VALUE,
      consumes = MediaType.APPLICATION_JSON_VALUE
  )
  List<Pattern> getAllPatterns();

  @RequestMapping(
          value = "/patterns/{patternpackage}/charges/",
          method = RequestMethod.GET,
          produces = MediaType.ALL_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  List<ChargeDefinition> getAllDefaultChargeDefinitionsForPattern(@PathVariable("patternpackage") final String patternPackage);

  @RequestMapping(
      value = "/products/",
      method = RequestMethod.GET,
      produces = MediaType.ALL_VALUE,
      consumes = MediaType.APPLICATION_JSON_VALUE
  )
  ProductPage getProducts(@RequestParam(value = "includeDisabled", required = false) final Boolean includeDisabled,
                          @RequestParam(value = "term", required = false) final String term,
                          @RequestParam(value = "pageIndex") final Integer pageIndex,
                          @RequestParam(value = "size") final Integer size,
                          @RequestParam(value = "sortColumn", required = false) @ValidSortColumn(value = {"lastModifiedOn", "identifier", "name"}) final String sortColumn,
                          @RequestParam(value = "sortDirection", required = false) @ValidSortDirection final String sortDirection);

  @RequestMapping(
          value = "/products",
          method = RequestMethod.POST,
          produces = MediaType.APPLICATION_JSON_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  @ThrowsException(status = HttpStatus.CONFLICT, exception = ProductAlreadyExistsException.class)
  void createProduct(final Product product);

  @RequestMapping(
          value = "/products/{productidentifier}",
          method = RequestMethod.GET,
          produces = MediaType.ALL_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE)
  Product getProduct(@PathVariable("productidentifier") final String productIdentifier);

  @RequestMapping(
          value = "/products/{productidentifier}",
          method = RequestMethod.PUT,
          produces = MediaType.ALL_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE)
  @ThrowsException(status = HttpStatus.CONFLICT, exception = ProductInUseException.class)
  void changeProduct(@PathVariable("productidentifier") final String productIdentifier,
                     final Product product);

  @RequestMapping(
          value = "/products/{productidentifier}",
          method = RequestMethod.DELETE,
          produces = MediaType.ALL_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  @ThrowsException(status = HttpStatus.CONFLICT, exception = ProductInUseException.class)
  void deleteProduct(@PathVariable("productidentifier") final String productIdentifier);

  @RequestMapping(
          value = "/products/{productidentifier}/incompleteaccountassignments",
          method = RequestMethod.GET,
          produces = MediaType.APPLICATION_JSON_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE)
  Set<AccountAssignment> getIncompleteAccountAssignments(@PathVariable("productidentifier") final String productIdentifier);

  @RequestMapping(
          value = "/products/{productidentifier}/enabled",
          method = RequestMethod.PUT,
          produces = MediaType.APPLICATION_JSON_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE)
  @ThrowsException(status = HttpStatus.CONFLICT, exception = ProductDefinitionIncomplete.class)
  void enableProduct(@PathVariable("productidentifier") final String productIdentifier,
                     final Boolean enabled);

  @RequestMapping(
          value = "/products/{productidentifier}/enabled",
          method = RequestMethod.GET,
          produces = MediaType.APPLICATION_JSON_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE)
  Boolean getProductEnabled(@PathVariable("productidentifier") final String productIdentifier);

  @RequestMapping(
          value = "/products/{productidentifier}/tasks/",
          method = RequestMethod.GET,
          produces = MediaType.ALL_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  List<TaskDefinition> getAllTaskDefinitionsForProduct(@PathVariable("productidentifier") final String productIdentifier);

  @RequestMapping(
          value = "/products/{productidentifier}/tasks/",
          method = RequestMethod.POST,
          produces = MediaType.APPLICATION_JSON_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  @ThrowsException(status = HttpStatus.CONFLICT, exception = ProductInUseException.class)
  void createTaskDefinition(
          @PathVariable("productidentifier") final String productIdentifier,
          final TaskDefinition taskDefinition);

  @RequestMapping(
          value = "/products/{productidentifier}/tasks/{taskidentifier}",
          method = RequestMethod.GET,
          produces = MediaType.APPLICATION_JSON_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  TaskDefinition getTaskDefinition(
          @PathVariable("productidentifier") final String productIdentifier,
          @PathVariable("taskidentifier") final String taskDefinitionIdentifier);

  @RequestMapping(
      value = "/products/{productidentifier}/tasks/{taskidentifier}",
      method = RequestMethod.PUT,
      produces = MediaType.ALL_VALUE,
      consumes = MediaType.APPLICATION_JSON_VALUE)
  @ThrowsException(status = HttpStatus.CONFLICT, exception = ProductInUseException.class)
  void changeTaskDefinition(
      @PathVariable("productidentifier") final String productIdentifier,
      @PathVariable("taskidentifier") final String taskDefinitionIdentifier,
      final TaskDefinition taskDefinition);

  @RequestMapping(
      value = "/products/{productidentifier}/tasks/{taskidentifier}",
      method = RequestMethod.DELETE,
      produces = MediaType.ALL_VALUE,
      consumes = MediaType.APPLICATION_JSON_VALUE)
  @ThrowsException(status = HttpStatus.CONFLICT, exception = ProductInUseException.class)
  void deleteTaskDefinition(
      @PathVariable("productidentifier") final String productIdentifier,
      @PathVariable("taskidentifier") final String taskDefinitionIdentifier);

  @RequestMapping(
          value = "/products/{productidentifier}/charges/",
          method = RequestMethod.GET,
          produces = MediaType.ALL_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  List<ChargeDefinition> getAllChargeDefinitionsForProduct(@PathVariable("productidentifier") final String productIdentifier);

  @RequestMapping(
          value = "/products/{productidentifier}/charges/",
          method = RequestMethod.POST,
          produces = MediaType.APPLICATION_JSON_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  void createChargeDefinition(
          @PathVariable("productidentifier") final String productIdentifier,
          final ChargeDefinition taskDefinition);

  @RequestMapping(
          value = "/products/{productidentifier}/charges/{chargedefinitionidentifier}",
          method = RequestMethod.GET,
          produces = MediaType.APPLICATION_JSON_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  ChargeDefinition getChargeDefinition(
          @PathVariable("productidentifier") final String productIdentifier,
          @PathVariable("chargedefinitionidentifier") final String chargeDefinitionIdentifier);

  @RequestMapping(
          value = "/products/{productidentifier}/charges/{chargedefinitionidentifier}",
          method = RequestMethod.PUT,
          produces = MediaType.ALL_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  @ThrowsException(status = HttpStatus.CONFLICT, exception = ChargeDefinitionIsReadOnly.class)
  void changeChargeDefinition(
          @PathVariable("productidentifier") final String productIdentifier,
          @PathVariable("chargedefinitionidentifier") final String chargeDefinitionIdentifier,
          final ChargeDefinition chargeDefinition);

  @RequestMapping(
          value = "/products/{productidentifier}/charges/{chargedefinitionidentifier}",
          method = RequestMethod.DELETE,
          produces = MediaType.ALL_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  @ThrowsException(status = HttpStatus.CONFLICT, exception = ChargeDefinitionIsReadOnly.class)
  void deleteChargeDefinition(
          @PathVariable("productidentifier") final String productIdentifier,
          @PathVariable("chargedefinitionidentifier") final String chargeDefinitionIdentifier);

  @RequestMapping(
          value = "/products/{productidentifier}/cases/",
          method = RequestMethod.GET,
          produces = MediaType.ALL_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  CasePage getAllCasesForProduct(@PathVariable("productidentifier") final String productIdentifier,
                                 @RequestParam(value = "includeClosed", required = false) final Boolean includeClosed,
                                 @RequestParam("pageIndex") final Integer pageIndex,
                                 @RequestParam("size") final Integer size);

  @RequestMapping(
          value = "/products/{productidentifier}/cases/",
          method = RequestMethod.POST,
          produces = MediaType.APPLICATION_JSON_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  @ThrowsException(status = HttpStatus.CONFLICT, exception = CaseAlreadyExistsException.class)
  void createCase(@PathVariable("productidentifier") final String productIdentifier,
                  final Case caseInstance);

  @RequestMapping(
          value = "/products/{productidentifier}/cases/{caseidentifier}",
          method = RequestMethod.GET,
          produces = MediaType.ALL_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE)
  Case getCase(@PathVariable("productidentifier") final String productIdentifier,
               @PathVariable("caseidentifier") final String caseIdentifier);

  @RequestMapping(
          value = "/products/{productidentifier}/cases/{caseidentifier}",
          method = RequestMethod.PUT,
          produces = MediaType.APPLICATION_JSON_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  void changeCase(@PathVariable("productidentifier") final String productIdentifier,
                  @PathVariable("caseidentifier") final String caseIdentifier,
                  final Case caseInstance);

  @RequestMapping(
          value = "/products/{productidentifier}/cases/{caseidentifier}/actions/",
          method = RequestMethod.GET,
          produces = MediaType.ALL_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  Set<String> getActionsForCase(@PathVariable("productidentifier") final String productIdentifier,
                                @PathVariable("caseidentifier") final String caseIdentifier);


  @RequestMapping(
      value = "/products/{productidentifier}/cases/{caseidentifier}/actions/{actionidentifier}/costcomponents",
      method = RequestMethod.GET,
      produces = MediaType.ALL_VALUE,
      consumes = MediaType.APPLICATION_JSON_VALUE
  )
  List<CostComponent> getCostComponentsForAction(@PathVariable("productidentifier") final String productIdentifier,
                                                 @PathVariable("caseidentifier") final String caseIdentifier,
                                                 @PathVariable("actionidentifier") final String actionIdentifier,
                                                 @RequestParam(value="touchingaccounts", required = false, defaultValue = "") final Set<String> forAccountDesignators,
                                                 @RequestParam(value="forpaymentsize", required = false, defaultValue = "") final BigDecimal forPaymentSize);


  @RequestMapping(
      value = "/products/{productidentifier}/cases/{caseidentifier}/actions/{actionidentifier}/costcomponents",
      method = RequestMethod.GET,
      produces = MediaType.ALL_VALUE,
      consumes = MediaType.APPLICATION_JSON_VALUE
  )
  List<CostComponent> getCostComponentsForAction(@PathVariable("productidentifier") final String productIdentifier,
                                                 @PathVariable("caseidentifier") final String caseIdentifier,
                                                 @PathVariable("actionidentifier") final String actionIdentifier,
                                                 @RequestParam(value="touchingaccounts", required = false, defaultValue = "") final Set<String> forAccountDesignators);


  @RequestMapping(
      value = "/products/{productidentifier}/cases/{caseidentifier}/actions/{actionidentifier}/costcomponents",
      method = RequestMethod.GET,
      produces = MediaType.ALL_VALUE,
      consumes = MediaType.APPLICATION_JSON_VALUE
  )
  List<CostComponent> getCostComponentsForAction(@PathVariable("productidentifier") final String productIdentifier,
                                                 @PathVariable("caseidentifier") final String caseIdentifier,
                                                 @PathVariable("actionidentifier") final String actionIdentifier);

  @RequestMapping(
          value = "/products/{productidentifier}/cases/{caseidentifier}/commands/{actionidentifier}",
          method = RequestMethod.POST,
          produces = MediaType.APPLICATION_JSON_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  @ThrowsException(status = HttpStatus.CONFLICT, exception = TaskOutstanding.class)
  void executeCaseCommand(@PathVariable("productidentifier") final String productIdentifier,
                          @PathVariable("caseidentifier") final String caseIdentifier,
                          @PathVariable("actionidentifier") final String actionIdentifier,
                          final Command command);

  @RequestMapping(
          value = "/products/{productidentifier}/cases/{caseidentifier}/tasks/",
          method = RequestMethod.GET,
          produces = MediaType.ALL_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  List<TaskInstance> getAllTasksForCase(@PathVariable("productidentifier") final String productIdentifier,
                                        @PathVariable("caseidentifier") final String caseIdentifier,
                                        @RequestParam(value = "includeExecuted", required = false) final Boolean includeExecuted);

  @RequestMapping(
          value = "/products/{productidentifier}/cases/{caseidentifier}/tasks/{taskidentifier}",
          method = RequestMethod.GET,
          produces = MediaType.APPLICATION_JSON_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  TaskInstance getTaskForCase(@PathVariable("productidentifier") final String productIdentifier,
                              @PathVariable("caseidentifier") final String caseIdentifier,
                              @PathVariable("taskidentifier") final String taskIdentifier);

  @RequestMapping(
      value = "/products/{productidentifier}/cases/{caseidentifier}/tasks/{taskidentifier}",
      method = RequestMethod.PUT,
      produces = MediaType.ALL_VALUE,
      consumes = MediaType.APPLICATION_JSON_VALUE
  )
  void changeTaskForCase(@PathVariable("productidentifier") final String productIdentifier,
                         @PathVariable("caseidentifier") final String caseIdentifier,
                         @PathVariable("taskidentifier") final String taskIdentifier,
                         final TaskInstance instance);

  @RequestMapping(
          value = "/products/{productidentifier}/cases/{caseidentifier}/tasks/{taskidentifier}/executed",
          method = RequestMethod.PUT,
          produces = MediaType.ALL_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  @ThrowsException(status = HttpStatus.CONFLICT, exception = TaskExecutionBySameUserAsCaseCreation.class)
  void markTaskExecution(@PathVariable("productidentifier") final String productIdentifier,
                         @PathVariable("caseidentifier") final String caseIdentifier,
                         @PathVariable("taskidentifier") final String taskIdentifier,
                         final Boolean executed);

  @RequestMapping(
          value = "/cases/",
          method = RequestMethod.GET,
          produces = MediaType.ALL_VALUE,
          consumes = MediaType.APPLICATION_JSON_VALUE
  )
  CasePage getAllCases(@RequestParam("pageIndex") final Integer pageIndex,
                        @RequestParam("size") final Integer size);

  //TODO: find a way to list cases by customer even though the portfolio contains products which may be associated with groups instead of customers.
}
