///<reference path='./../core.d.ts'/>
///<reference path='./../index.d.ts'/>
///<reference path='./filter.d.ts'/>
declare module 'chargebee' {
  export interface LedgerOperation {
    id: string;
    type:
      | 'allocation'
      | 'capture'
      | 'authorize'
      | 'release_authorization'
      | 'capture_authorization'
      | 'expiry'
      | 'void'
      | 'rollover'
      | 'adjustment';
    amount: string;
    start_balance: string;
    end_balance: string;
    provisioned_start_balance: string;
    provisioned_end_balance: string;
    overdraft_start_balance: string;
    overdraft_end_balance: string;
    parent_ledger_operation_id?: string;
    ledger_operation_timestamp?: number;
    auto_release_timestamp?: number;
    metadata?: string;
    created_at?: number;
    modified_at?: number;
    subscription_id?: string;
    unit_id?: string;
    unit_type?: 'credit_unit';
  }

  export namespace LedgerOperation {
    export class LedgerOperationResource {
      retrieveLedgerOperation(
        ledger_operation_id: string,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<RetrieveLedgerOperationResponse>>;

      listLedgerOperations(
        input: ListLedgerOperationsInputParam,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<ListLedgerOperationsResponse>>;

      capture(
        input: CaptureInputParam,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<CaptureResponse>>;

      authorize(
        input: AuthorizeInputParam,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<AuthorizeResponse>>;

      captureAuthorization(
        input: CaptureAuthorizationInputParam,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<CaptureAuthorizationResponse>>;

      releaseAuthorization(
        input: ReleaseAuthorizationInputParam,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<ReleaseAuthorizationResponse>>;
    }

    export interface RetrieveLedgerOperationResponse {
      ledger_operation: LedgerOperation;
    }

    export interface ListLedgerOperationsResponse {
      list: { ledger_operation: LedgerOperation }[];
      next_offset?: string;
    }

    export interface CaptureResponse {
      ledger_operation: LedgerOperation;
      ledger_account_balance: LedgerAccountBalance;
    }

    export interface AuthorizeResponse {
      ledger_operation: LedgerOperation;
      ledger_account_balance: LedgerAccountBalance;
    }

    export interface CaptureAuthorizationResponse {
      ledger_operation: LedgerOperation;
      ledger_account_balance: LedgerAccountBalance;
    }

    export interface ReleaseAuthorizationResponse {
      ledger_operation: LedgerOperation;
      ledger_account_balance: LedgerAccountBalance;
    }

    // REQUEST PARAMS
    //---------------

    export interface ListLedgerOperationsInputParam {
      limit?: number;
      offset?: string;
      subscription_id: filter.String;
      unit_id?: filter.String;
      created_at?: filter.Timestamp;
      type?: filter.Enum;
      'sort_by[asc]'?: string;
      'sort_by[desc]'?: string;
    }
    export interface CaptureInputParam {
      id?: string;
      subscription_id: string;
      unit_id: string;
      amount: string;
      ledger_operation_timestamp: number;
      metadata?: any;
    }
    export interface AuthorizeInputParam {
      id?: string;
      subscription_id: string;
      unit_id: string;
      amount: string;
      ledger_operation_timestamp: number;
      auto_release_timestamp?: number;
      metadata?: any;
    }
    export interface CaptureAuthorizationInputParam {
      authorization_id: string;
      id?: string;
      amount: string;
      ledger_operation_timestamp: number;
      metadata?: any;
    }
    export interface ReleaseAuthorizationInputParam {
      authorization_id: string;
      id?: string;
      ledger_operation_timestamp: number;
      metadata?: any;
    }
  }
}
