///<reference path='./../core.d.ts'/>
///<reference path='./../index.d.ts'/>
///<reference path='./filter.d.ts'/>
declare module 'chargebee' {
  export interface Order {
    id: string;
    document_number?: string;
    invoice_id?: string;
    subscription_id?: string;
    customer_id?: string;
    status?:
      | 'new'
      | 'processing'
      | 'complete'
      | 'cancelled'
      | 'voided'
      | 'queued'
      | 'awaiting_shipment'
      | 'on_hold'
      | 'delivered'
      | 'shipped'
      | 'partially_delivered'
      | 'returned';
    cancellation_reason?:
      | 'shipping_cut_off_passed'
      | 'product_unsatisfactory'
      | 'third_party_cancellation'
      | 'product_not_required'
      | 'delivery_date_missed'
      | 'alternative_found'
      | 'invoice_written_off'
      | 'invoice_voided'
      | 'fraudulent_transaction'
      | 'payment_declined'
      | 'subscription_cancelled'
      | 'product_not_available'
      | 'others'
      | 'order_resent';
    payment_status?: 'not_paid' | 'paid';
    order_type?: 'manual' | 'system_generated';
    price_type: PriceTypeEnum;
    reference_id?: string;
    fulfillment_status?: string;
    order_date?: number;
    shipping_date?: number;
    note?: string;
    tracking_id?: string;
    tracking_url?: string;
    batch_id?: string;
    created_by?: string;
    shipment_carrier?: string;
    invoice_round_off_amount?: number;
    tax?: number;
    amount_paid?: number;
    amount_adjusted?: number;
    refundable_credits_issued?: number;
    refundable_credits?: number;
    rounding_adjustement?: number;
    paid_on?: number;
    shipping_cut_off_date?: number;
    created_at: number;
    status_update_at?: number;
    delivered_at?: number;
    shipped_at?: number;
    resource_version?: number;
    updated_at?: number;
    cancelled_at?: number;
    resent_status?: 'fully_resent' | 'partially_resent';
    is_resent: boolean;
    original_order_id?: string;
    order_line_items?: Order.OrderLineItem[];
    shipping_address?: Order.ShippingAddress;
    billing_address?: Order.BillingAddress;
    discount?: number;
    sub_total?: number;
    total?: number;
    line_item_taxes?: Order.LineItemTax[];
    line_item_discounts?: Order.LineItemDiscount[];
    linked_credit_notes?: Order.LinkedCreditNote[];
    deleted: boolean;
    currency_code?: string;
    is_gifted?: boolean;
    gift_note?: string;
    gift_id?: string;
    resend_reason?: string;
    resent_orders?: Order.ResentOrder[];
    business_entity_id?: string;
  }

  export namespace Order {
    export class OrderResource {
      create(
        input: CreateInputParam,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<CreateResponse>>;

      update(
        order_id: string,
        input?: UpdateInputParam,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<UpdateResponse>>;

      importOrder(
        input: ImportOrderInputParam,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<ImportOrderResponse>>;

      assignOrderNumber(
        order_id: string,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<AssignOrderNumberResponse>>;

      cancel(
        order_id: string,
        input: CancelInputParam,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<CancelResponse>>;

      createRefundableCreditNote(
        order_id: string,
        input: CreateRefundableCreditNoteInputParam,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<CreateRefundableCreditNoteResponse>>;

      reopen(
        order_id: string,
        input?: ReopenInputParam,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<ReopenResponse>>;

      retrieve(
        order_id: string,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<RetrieveResponse>>;

      delete(
        order_id: string,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<DeleteResponse>>;

      list(
        input?: ListInputParam,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<ListResponse>>;

      ordersForInvoice(
        invoice_id: string,
        input?: OrdersForInvoiceInputParam,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<OrdersForInvoiceResponse>>;

      resend(
        order_id: string,
        input?: ResendInputParam,
        headers?: ChargebeeRequestHeader,
      ): Promise<ChargebeeResponse<ResendResponse>>;
    }

    export interface CreateResponse {
      order: Order;
    }

    export interface UpdateResponse {
      order: Order;
    }

    export interface ImportOrderResponse {
      order: Order;
    }

    export interface AssignOrderNumberResponse {
      order: Order;
    }

    export interface CancelResponse {
      order: Order;
    }

    export interface CreateRefundableCreditNoteResponse {
      order: Order;
    }

    export interface ReopenResponse {
      order: Order;
    }

    export interface RetrieveResponse {
      order: Order;
    }

    export interface DeleteResponse {
      order: Order;
    }

    export interface ListResponse {
      list: { order: Order }[];
      next_offset?: string;
    }

    export interface OrdersForInvoiceResponse {
      list: { order: Order }[];
      next_offset?: string;
    }

    export interface ResendResponse {
      order: Order;
    }

    export interface OrderLineItem {
      id: string;
      invoice_id: string;
      invoice_line_item_id: string;
      unit_price?: number;
      description?: string;
      amount?: number;
      fulfillment_quantity?: number;
      fulfillment_amount?: number;
      tax_amount?: number;
      amount_paid?: number;
      amount_adjusted?: number;
      refundable_credits_issued?: number;
      refundable_credits?: number;
      is_shippable: boolean;
      sku?: string;
      status?:
        | 'queued'
        | 'awaiting_shipment'
        | 'on_hold'
        | 'delivered'
        | 'shipped'
        | 'partially_delivered'
        | 'returned'
        | 'cancelled';
      entity_type:
        | 'adhoc'
        | 'plan_item_price'
        | 'addon_item_price'
        | 'charge_item_price'
        | 'plan_setup'
        | 'plan'
        | 'addon';
      item_level_discount_amount?: number;
      discount_amount?: number;
      entity_id?: string;
    }
    export interface ShippingAddress {
      first_name?: string;
      last_name?: string;
      email?: string;
      company?: string;
      phone?: string;
      line1?: string;
      line2?: string;
      line3?: string;
      city?: string;
      state_code?: string;
      state?: string;
      country?: string;
      zip?: string;
      validation_status?: ValidationStatusEnum;
      index: number;
    }
    export interface BillingAddress {
      first_name?: string;
      last_name?: string;
      email?: string;
      company?: string;
      phone?: string;
      line1?: string;
      line2?: string;
      line3?: string;
      city?: string;
      state_code?: string;
      state?: string;
      country?: string;
      zip?: string;
      validation_status?: ValidationStatusEnum;
    }
    export interface LineItemTax {
      line_item_id?: string;
      tax_name: string;
      tax_rate: number;
      date_to?: number;
      date_from?: number;
      prorated_taxable_amount?: number;
      is_partial_tax_applied?: boolean;
      is_non_compliance_tax?: boolean;
      taxable_amount: number;
      tax_amount: number;
      tax_juris_type?:
        | 'country'
        | 'federal'
        | 'state'
        | 'county'
        | 'city'
        | 'special'
        | 'unincorporated'
        | 'other';
      tax_juris_name?: string;
      tax_juris_code?: string;
      tax_amount_in_local_currency?: number;
      local_currency_code?: string;
    }
    export interface LineItemDiscount {
      line_item_id: string;
      discount_type:
        | 'item_level_coupon'
        | 'document_level_coupon'
        | 'promotional_credits'
        | 'prorated_credits'
        | 'custom_discount'
        | 'item_level_discount'
        | 'document_level_discount';
      coupon_id?: string;
      entity_id?: string;
      discount_amount: number;
    }
    export interface LinkedCreditNote {
      amount?: number;
      type: 'adjustment' | 'refundable' | 'store';
      id: string;
      status: 'adjusted' | 'refunded' | 'refund_due' | 'voided';
      amount_adjusted?: number;
      amount_refunded?: number;
    }
    export interface ResentOrder {
      order_id: string;
      reason?: string;
      amount?: number;
    }
    // REQUEST PARAMS
    //---------------

    export interface CreateInputParam {
      id?: string;
      invoice_id: string;
      status?: 'new' | 'processing' | 'complete' | 'cancelled' | 'voided';
      reference_id?: string;
      fulfillment_status?: string;
      note?: string;
      tracking_id?: string;
      tracking_url?: string;
      batch_id?: string;
    }
    export interface UpdateInputParam {
      reference_id?: string;
      batch_id?: string;
      note?: string;
      shipping_date?: number;
      order_date?: number;
      cancelled_at?: number;
      cancellation_reason?:
        | 'shipping_cut_off_passed'
        | 'product_unsatisfactory'
        | 'third_party_cancellation'
        | 'product_not_required'
        | 'delivery_date_missed'
        | 'alternative_found'
        | 'invoice_written_off'
        | 'invoice_voided'
        | 'fraudulent_transaction'
        | 'payment_declined'
        | 'subscription_cancelled'
        | 'product_not_available'
        | 'others'
        | 'order_resent';
      shipped_at?: number;
      delivered_at?: number;
      tracking_url?: string;
      tracking_id?: string;
      shipment_carrier?: string;
      fulfillment_status?: string;
      status?:
        | 'new'
        | 'processing'
        | 'complete'
        | 'cancelled'
        | 'voided'
        | 'queued'
        | 'awaiting_shipment'
        | 'on_hold'
        | 'delivered'
        | 'shipped'
        | 'partially_delivered'
        | 'returned';
      shipping_address?: ShippingAddressUpdateInputParam;
      order_line_items?: OrderLineItemsUpdateInputParam[];
    }
    export interface ImportOrderInputParam {
      id?: string;
      document_number?: string;
      invoice_id: string;
      status:
        | 'cancelled'
        | 'queued'
        | 'awaiting_shipment'
        | 'on_hold'
        | 'delivered'
        | 'shipped'
        | 'partially_delivered'
        | 'returned';
      subscription_id?: string;
      customer_id?: string;
      created_at: number;
      order_date: number;
      shipping_date: number;
      reference_id?: string;
      fulfillment_status?: string;
      note?: string;
      tracking_id?: string;
      tracking_url?: string;
      batch_id?: string;
      shipment_carrier?: string;
      shipping_cut_off_date?: number;
      delivered_at?: number;
      shipped_at?: number;
      cancelled_at?: number;
      cancellation_reason?:
        | 'shipping_cut_off_passed'
        | 'product_unsatisfactory'
        | 'third_party_cancellation'
        | 'product_not_required'
        | 'delivery_date_missed'
        | 'alternative_found'
        | 'invoice_written_off'
        | 'invoice_voided'
        | 'fraudulent_transaction'
        | 'payment_declined'
        | 'subscription_cancelled'
        | 'product_not_available'
        | 'others'
        | 'order_resent';
      refundable_credits_issued?: number;
      shipping_address?: ShippingAddressImportOrderInputParam;
      billing_address?: BillingAddressImportOrderInputParam;
    }
    export interface CancelInputParam {
      cancellation_reason:
        | 'shipping_cut_off_passed'
        | 'product_unsatisfactory'
        | 'third_party_cancellation'
        | 'product_not_required'
        | 'delivery_date_missed'
        | 'alternative_found'
        | 'invoice_written_off'
        | 'invoice_voided'
        | 'fraudulent_transaction'
        | 'payment_declined'
        | 'subscription_cancelled'
        | 'product_not_available'
        | 'others'
        | 'order_resent';
      customer_notes?: string;
      comment?: string;
      cancelled_at?: number;
      credit_note?: CreditNoteCancelInputParam;
    }
    export interface CreateRefundableCreditNoteInputParam {
      customer_notes?: string;
      comment?: string;
      credit_note?: CreditNoteCreateRefundableCreditNoteInputParam;
    }
    export interface ReopenInputParam {
      void_cancellation_credit_notes?: boolean;
    }
    export interface ListInputParam {
      limit?: number;
      offset?: string;
      include_deleted?: boolean;
      exclude_deleted_credit_notes?: boolean;
      id?: filter.String;
      invoice_id?: filter.String;
      subscription_id?: filter.String;
      status?: filter.Enum;
      shipping_date?: filter.Timestamp;
      shipped_at?: filter.Timestamp;
      order_type?: filter.Enum;
      order_date?: filter.Timestamp;
      paid_on?: filter.Timestamp;
      updated_at?: filter.Timestamp;
      created_at?: filter.Timestamp;
      resent_status?: filter.Enum;
      is_resent?: filter.Boolean;
      original_order_id?: filter.String;
      'sort_by[asc]'?: string;
      'sort_by[desc]'?: string;
    }
    export interface OrdersForInvoiceInputParam {
      limit?: number;
      offset?: string;
    }
    export interface ResendInputParam {
      shipping_date?: number;
      resend_reason?: string;
      order_line_items?: OrderLineItemsResendInputParam[];
    }
    export interface ShippingAddressUpdateInputParam {
      first_name?: string;
      last_name?: string;
      email?: string;
      company?: string;
      phone?: string;
      line1?: string;
      line2?: string;
      line3?: string;
      city?: string;
      state_code?: string;
      state?: string;
      zip?: string;
      country?: string;
      validation_status?: ValidationStatusEnum;
    }

    export interface OrderLineItemsUpdateInputParam {
      id?: string;
      status?:
        | 'queued'
        | 'awaiting_shipment'
        | 'on_hold'
        | 'delivered'
        | 'shipped'
        | 'partially_delivered'
        | 'returned'
        | 'cancelled';
      sku?: string;
    }
    export interface BillingAddressImportOrderInputParam {
      first_name?: string;
      last_name?: string;
      email?: string;
      company?: string;
      phone?: string;
      line1?: string;
      line2?: string;
      line3?: string;
      city?: string;
      state_code?: string;
      state?: string;
      zip?: string;
      country?: string;
      validation_status?: ValidationStatusEnum;
    }
    export interface ShippingAddressImportOrderInputParam {
      first_name?: string;
      last_name?: string;
      email?: string;
      company?: string;
      phone?: string;
      line1?: string;
      line2?: string;
      line3?: string;
      city?: string;
      state_code?: string;
      state?: string;
      zip?: string;
      country?: string;
      validation_status?: ValidationStatusEnum;
    }

    export interface CreditNoteCancelInputParam {
      total?: number;
    }

    export interface CreditNoteCreateRefundableCreditNoteInputParam {
      reason_code:
        | 'write_off'
        | 'subscription_change'
        | 'subscription_cancellation'
        | 'subscription_pause'
        | 'chargeback'
        | 'product_unsatisfactory'
        | 'service_unsatisfactory'
        | 'order_change'
        | 'order_cancellation'
        | 'waiver'
        | 'other'
        | 'fraudulent';
      total: number;
    }

    export interface OrderLineItemsResendInputParam {
      id?: string;
      fulfillment_quantity?: number;
    }
  }
}
