/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */
import {Action} from '@ngrx/store';
import {Error} from '../../../services/domain/error.model';
import {type} from '../../../store/util';
import {RoutePayload} from '../../../common/store/route-payload';
import {FetchRequest} from '../../../services/domain/paging/fetch-request.model';
import {Product} from '../../../services/portfolio/domain/product.model';
import {SearchResult} from '../../../common/store/search.reducer';
import {
  CreateResourceSuccessPayload,
  LoadResourcePayload,
  SelectResourcePayload,
  UpdateResourceSuccessPayload
} from '../../../common/store/resource.reducer';
import {CaseCommand} from '../../../services/portfolio/domain/case-command.model';
import {WorkflowAction} from '../../../services/portfolio/domain/individuallending/workflow-action.model';
import {FimsCase} from '../../../services/portfolio/domain/fims-case.model';

export const SEARCH = type('[Case] Search');
export const SEARCH_COMPLETE = type('[Case] Search Complete');

export const LOAD = type('[Case] Load');
export const SELECT = type('[Case] Select');

export const CREATE = type('[Case] Create');
export const CREATE_SUCCESS = type('[Case] Create Success');
export const CREATE_FAIL = type('[Case] Create Fail');

export const UPDATE = type('[Case] Update');
export const UPDATE_SUCCESS = type('[Case] Update Success');
export const UPDATE_FAIL = type('[Case] Update Fail');

export const LOAD_PRODUCT = type('[Case] Form Load Product');
export const LOAD_PRODUCT_SUCCESS = type('[Case] Form Load Product Success');
export const LOAD_PRODUCT_FAIL = type('[Case] Form Load Product Fail');

export const UNLOAD_PRODUCT = type('[Case] Form Unload Product');
export const RESET_FORM = type('[Case] Reset Form');

export const EXECUTE_COMMAND = type('[Case] Execute Command');
export const EXECUTE_COMMAND_SUCCESS = type('[Case] Execute Command Success');
export const EXECUTE_COMMAND_FAIL = type('[Case] Execute Command Fail');

export const LOAD_ALL_COST_COMPONENTS = type('[Case] Load All Cost Components');
export const LOAD_ALL_COST_COMPONENTS_SUCCESS = type('[Case] Load All Cost Components Success');
export const LOAD_ALL_COST_COMPONENTS_FAIL = type('[Case] Load All Cost Components Fail');

export interface SearchCasePayload {
  customerId: string;
  fetchRequest: FetchRequest;
}

export interface CaseRoutePayload extends RoutePayload {
  productId: string;
  caseInstance: FimsCase;
}

export interface ExecuteCommandPayload extends RoutePayload {
  productId: string;
  caseId: string;
  action: WorkflowAction;
  command: CaseCommand;
}

export interface LoadAllCostComponentsPayload {
  productId: string;
  caseId: string;
  action: WorkflowAction;
}

export class SearchAction implements Action {
  readonly type = SEARCH;

  constructor(public payload: SearchCasePayload) { }
}

export class SearchCompleteAction implements Action {
  readonly type = SEARCH_COMPLETE;

  constructor(public payload: SearchResult) { }
}

export class LoadAction implements Action {
  readonly type = LOAD;

  constructor(public payload: LoadResourcePayload) { }
}

export class SelectAction implements Action {
  readonly type = SELECT;

  constructor(public payload: SelectResourcePayload) { }
}

export class CreateCaseAction implements Action {
  readonly type = CREATE;

  constructor(public payload: CaseRoutePayload) { }
}

export class CreateCaseSuccessAction implements Action {
  readonly type = CREATE_SUCCESS;

  constructor(public payload: CreateResourceSuccessPayload) { }
}

export class CreateCaseFailAction implements Action {
  readonly type = CREATE_FAIL;

  constructor(public payload: Error) { }
}

export class UpdateCaseAction implements Action {
  readonly type = UPDATE;

  constructor(public payload: CaseRoutePayload) { }
}

export class UpdateCaseSuccessAction implements Action {
  readonly type = UPDATE_SUCCESS;

  constructor(public payload: UpdateResourceSuccessPayload) { }
}

export class UpdateCaseFailAction implements Action {
  readonly type = UPDATE_FAIL;

  constructor(public payload: Error) { }
}

export class LoadProductAction implements Action {
  readonly type = LOAD_PRODUCT;

  constructor(public payload: string) { }
}

export class LoadProductSuccessAction implements Action {
  readonly type = LOAD_PRODUCT_SUCCESS;

  constructor(public payload: Product) { }
}

export class LoadProductFailAction implements Action {
  readonly type = LOAD_PRODUCT_FAIL;

  constructor(public payload: Error) { }
}

export class UnloadProductAction implements Action {
  readonly type = UNLOAD_PRODUCT;

  constructor() { }
}

export class ResetCaseFormAction implements Action {
  readonly type = RESET_FORM;

  constructor() {}
}

export class ExecuteCommandAction implements Action {
  readonly type = EXECUTE_COMMAND;

  constructor(public payload: ExecuteCommandPayload) { }
}

export class ExecuteCommandSuccessAction implements Action {
  readonly type = EXECUTE_COMMAND_SUCCESS;

  constructor(public payload: ExecuteCommandPayload) { }
}

export class ExecuteCommandFailAction implements Action {
  readonly type = EXECUTE_COMMAND_FAIL;

  constructor(public payload: Error) { }
}

export type Actions
  = SearchAction
  | SearchCompleteAction
  | LoadAction
  | SelectAction
  | CreateCaseAction
  | CreateCaseSuccessAction
  | CreateCaseFailAction
  | UpdateCaseAction
  | UpdateCaseSuccessAction
  | UpdateCaseFailAction
  | LoadProductAction
  | LoadProductSuccessAction
  | LoadProductFailAction
  | UnloadProductAction
  | ResetCaseFormAction
  | ExecuteCommandAction
  | ExecuteCommandSuccessAction
  | ExecuteCommandFailAction;
