syntax = "proto3";

import "google/protobuf/struct.proto";
import "google/protobuf/timestamp.proto";

message Credentials {
  int32 int_account = 1;
  string username = 2;
  string password = 3;
  
  oneof oneof_2fa {
    string totp_secret_key = 4;
    int32 one_time_password = 5;
  }
}

/** For the payload from the following URLs :
 * https://trader.degiro.nl/trading/secure/v5/checkOrder
 * https://trader.degiro.nl/trading/secure/v5/order
 * https://trader.degiro.nl/reporting/secure/v4/order-history
 * https://trader.degiro.nl/trading/secure/v5/update
 */
message Order {
  // ENUMS
  enum Action {
    BUY = 0;
    SELL = 1;
  }
  enum OrderType {
    LIMIT = 0;
    STOP_LIMIT = 1;
    MARKET = 2;
    STOP_LOSS = 3;
    /**
    LIMIT_HIT = ?;
    TRAILING_STOP = ?;
    JOIN = ?;
    STANDARD_SIZE = ?;
    STANDARD_AMOUNT = ?;
    TAKE_PROFIT = ?;
    COMBINED = ?;
    OCO = ?;
    */
  }
  enum TimeType {
    UNKNOWN_0  = 0;
    GOOD_TILL_DAY = 1;
    UNKNOWN_2  = 2;
    GOOD_TILL_CANCELED = 3;
  }

  // MESSAGES
  message CheckingResponse {
    string confirmation_id = 1;
    double free_space_new = 2;
    google.protobuf.Timestamp response_datetime = 3;
    repeated google.protobuf.Struct transaction_fees = 4;
    repeated google.protobuf.Struct transaction_opposite_fees = 5;
    repeated google.protobuf.Struct transaction_taxes = 6;
    repeated google.protobuf.Struct transaction_auto_fx_surcharges = 7;
    repeated google.protobuf.Struct transaction_auto_fx_opposite_surcharges = 8;
    double auto_fx_conversion_rate = 9;
  }
  message ConfirmationResponse {
    string orderId = 1;
    google.protobuf.Timestamp response_datetime = 2;
  }

  // USED TO CHECK ORDER
  Action action = 1; // called "buysell" by the API
  string id = 2;
  OrderType order_type = 3; // called "orderTypeId" by the API
  oneof oneof_price {
    double price = 4;
    double stop_price = 5; // called "stopPrice" by the API
  }
  int32 product_id = 6; // called "productId" by the API
  double size = 7;
  TimeType time_type = 8; // called "orderTimeTypeId" by the API

  // USED TO CONFIRM ORDER
  double contract_size = 9; // called "contractSize" by the API
  int32 contract_type = 10; // called "contractType" by the API
  string currency = 11;
  string hour = 12; // called "date" by the API
                    // contains %H:%M if the date was not passed
  bool is_deletable = 13; // called "isDeletable" by the API
  bool is_modifiable = 14; // called "isModifiable" by the API
  string product = 15;
  double quantity = 16;
  double total_order_value = 17; // called "totalOrderValue" by the API

  // USED FOR ORDERS HISTORY
  bool retained_order = 18; // called "retainedOrder" by the API
  bool sent_to_exchange = 19; // called "sentToExchange" by the API
}

/** For the payload from the following URL :
 * https://trader.degiro.nl/trading/secure/v5/update
 */
message Update {
  // ENUMS
  enum Option {
    ALERTS = 0;
    CASHFUNDS = 1;
    HISTORICALORDERS = 2;
    ORDERS = 3;
    PORTFOLIO = 4;
    TOTALPORTFOLIO = 5;
    TRANSACTIONS = 6;
  }

  // MESSAGES
  message Request {
    Option option = 1;
    int32 last_updated = 2;
  }
  message RequestList {
    repeated Request values = 1;
  }

  // MESSAGES FOR PROPERTIES
  message Alerts {
    int32 last_updated = 1;
    google.protobuf.Struct values = 2;
  }
  message CashFunds {
    int32 last_updated = 1;
    google.protobuf.Struct values = 2;
  }
  message HistoricalOrders {
    int32 last_updated = 1;
    repeated Order values = 2;
  }
  message Orders {
    int32 last_updated = 1;
    repeated Order values = 2; // Order
  }
  message Portfolio {
    int32 last_updated = 1;
    repeated google.protobuf.Struct values = 2; // positionrow
  }
  message TotalPortfolio {
    int32 last_updated = 1;
    google.protobuf.Struct values = 2;
  }
  message Transactions {
    int32 last_updated = 1;
    repeated google.protobuf.Struct values = 2; // Transaction
  }

  // PROPERTIES
  google.protobuf.Timestamp response_datetime = 1;
  Alerts alerts = 2;
  CashFunds cash_funds = 3;
  HistoricalOrders historical_orders = 4;
  Orders orders = 5;
  Portfolio portfolio = 6;
  TotalPortfolio total_portfolio = 7;
  Transactions transactions = 8;
}

/** For the payload from the following URL :
 * https://trader.degiro.nl/reporting/secure/v4/order-history
 */
message OrdersHistory {
  // MESSAGES
  message Request {
    // MESSAGES
    message Date {
      int32 year = 1;
      int32 month = 2;
      int32 day = 3;
    }

    // PROPERTIES
    Date from_date = 1;
    Date to_date = 2;
  }

  // PROPERTIES
  repeated google.protobuf.Struct values = 1;
  google.protobuf.Timestamp response_datetime = 2;
}

/** For the payload from the following URL :
 * https://trader.degiro.nl/reporting/secure/v4/transactions
 */
message TransactionsHistory {
  // MESSAGES
  message Request {
    // MESSAGES
    message Date {
      int32 year = 1;
      int32 month = 2;
      int32 day = 3;
    }

    // PROPERTIES
    Date from_date = 1;
    Date to_date = 2;
    bool group_transactions_by_order= 3;
  }

  // PROPERTIES
  repeated google.protobuf.Struct values = 1;
  google.protobuf.Timestamp response_datetime = 2;
}

/** For the payload from the following URL :
 * https://trader.degiro.nl/reporting/secure/v6/accountoverview
 */
message AccountOverview {
  // MESSAGES
  message Request {
    // MESSAGES
    message Date {
      int32 year = 1;
      int32 month = 2;
      int32 day = 3;
    }

    // PROPERTIES
    Date from_date = 1;
    Date to_date = 2;
  }

  // PROPERTIES
  google.protobuf.Struct values = 1;
  google.protobuf.Timestamp response_datetime = 2;
}

/** For the payload from the following URLs :
 * https://trader.degiro.nl/product_search/secure/v5/bonds
 * https://trader.degiro.nl/product_search/secure/v5/etfs
 * https://trader.degiro.nl/product_search/secure/v5/funds
 * https://trader.degiro.nl/product_search/secure/v5/futures
 * https://trader.degiro.nl/product_search/secure/v5/leverageds
 * https://trader.degiro.nl/product_search/secure/v5/lookup
 * https://trader.degiro.nl/product_search/secure/v5/options
 * https://trader.degiro.nl/product_search/secure/v5/stocks
 * https://trader.degiro.nl/product_search/secure/v5/warrants
 */
message ProductSearch {
  // MESSAGES
  message Config {
    google.protobuf.Struct values = 1;
  }
  message RequestBonds {
    int32 bond_issuer_type_id = 1;
    int32 bond_exchange_id = 2;

    string search_text = 3;
    int32 offset = 4;
    int32 limit = 5;
    bool require_total = 6;
    string sort_columns = 7;
    string sort_types = 8;
  }
  message RequestETFs {
    bool popular_only = 1;
    string input_aggregate_types = 2;
    string input_aggregate_values = 3;

    string search_text = 4;
    int32 offset = 5;
    int32 limit = 6;
    bool require_total = 7;
    string sort_columns = 8;
    string sort_types = 9;
  }
  message RequestFunds {
    string search_text = 1;
    int32 offset = 2;
    int32 limit = 3;
    bool require_total = 4;
    string sort_columns = 5;
    string sort_types = 6;
  }
  message RequestFutures {
    int32 future_exchange_id = 1;
    string underlying_isin = 2;

    string search_text = 3;
    int32 offset = 4;
    int32 limit = 5;
    bool require_total = 6;
    string sort_columns = 7;
    string sort_types = 8;
  }
  message RequestLeverageds {
    bool popular_only = 1;
    string input_aggregate_types = 2;
    string input_aggregate_values = 3;

    string search_text = 4;
    int32 offset = 5;
    int32 limit = 6;
    bool require_total = 7;
    string sort_columns = 8;
    string sort_types = 9;
  }
  message RequestLookup {
    string search_text = 1;
    int32 limit = 2;
    int32 offset = 3;
    int32 product_type_id = 4;
  }
  message RequestOptions {
    string input_aggregate_types = 1;
    string input_aggregate_values = 2;
    int32 option_exchange_id = 3;
    string underlying_isin = 4;

    string search_text = 5;
    int32 offset = 6;
    int32 limit = 7;
    bool require_total = 8;
    string sort_columns = 9;
    string sort_types = 10;
  }
  message RequestStocks {
    bool is_in_us_green_list = 1;
    int32 index_id = 2;
    int32 stock_country_id = 3;

    string search_text = 4;
    int32 offset = 5;
    int32 limit = 6;
    bool require_total = 7;
    string sort_columns = 8;
    string sort_types = 9;
  }
  message RequestWarrants {
    string search_text = 1;
    int32 offset = 2;
    int32 limit = 3;
    bool require_total = 4;
    string sort_columns = 5;
    string sort_types = 6;
  }

  // PROPERTIES
  int32 offset = 1;
  repeated google.protobuf.Struct products = 2;
  google.protobuf.Timestamp response_datetime = 3;
  int32 total = 4;
}

/** For the payload from the following URL :
 * https://trader.degiro.nl/pa/secure/favourites/lists
 */
message Favourites {
  // MESSAGES
  message List {
    // PROPERTIES
    int32 id = 1;
    string name = 2;
    bool is_default = 3;
    repeated int32 product_ids = 4;
  }

  // PROPERTIES
  repeated List values = 1;
  google.protobuf.Timestamp response_datetime = 2;
}

/** For the payload from the following URL :
 * https://trader.degiro.nl/product_search/secure/v5/products/info
 */
message ProductsInfo {
  // MESSAGES
  message Request {
    // PROPERTIES
    repeated int32 products = 1;
  }

  // PROPERTIES
  google.protobuf.Struct values = 1;
}

/** For the payload from the following URL :
 * https://trader.degiro.nl/dgtbxdsservice/company-ratios
 */
message CompanyRatios {
  // PROPERTIES
  google.protobuf.Struct values = 1;
}

/** For the payload from the following URL :
 * https://trader.degiro.nl/dgtbxdsservice/company-profile/v2
 */
message CompanyProfile {
  // PROPERTIES
  google.protobuf.Struct values = 1;
}

/** For the payload from the following URL :
 * https://trader.degiro.nl/dgtbxdsservice/financial-statements
 */
message FinancialStatements {
  // PROPERTIES
  google.protobuf.Struct values = 1;
}

/** For the payload from the following URL :
 * https://trader.degiro.nl/dgtbxdsservice/newsfeed/v2/latest-news
 */
message LatestNews {
  // MESSAGES
  message Request {
    // PROPERTIES
    int32 offset = 1;
    string languages = 2;
    int32 limit = 3;
  }
  // PROPERTIES
  repeated google.protobuf.Struct items = 1;
  int32 offset = 2;
  int32 total = 3;
}

/** For the payload from the following URL :
 * https://trader.degiro.nl/dgtbxdsservice/newsfeed/v2/top-news-preview
 */
message TopNewsPreview {
  // PROPERTIES
  repeated google.protobuf.Struct items = 1;
  int32 offset = 2;
  int32 total = 3;
}

/** For the payload from the following URL :
 * https://trader.degiro.nl/dgtbxdsservice/newsfeed/v2/news-by-company
 */
message NewsByCompany {
  // MESSAGES
  message Request {
    // PROPERTIES
    string isin = 1;
    int32 limit = 2;
    int32 offset = 3;
    string languages = 4;
  }
  // PROPERTIES
  repeated google.protobuf.Struct items = 1;
  int32 offset = 2;
  int32 total = 3;
}

/** For the payload from the following URL :
 * https://trader.degiro.nl/reporting/secure/v3/cashAccountReport
 */
message CashAccountReport {
  // ENUMS
  enum Format {
    CSV = 0;
    HTML = 1;
    PDF = 2;
    XLS = 3;
  }

  // MESSAGES
  message Request {
    // MESSAGES
    message Date {
      int32 year = 1;
      int32 month = 2;
      int32 day = 3;
    }

    // PROPERTIES
    Format format = 1;
    string country = 2;
    string lang = 3;
    Date from_date = 4;
    Date to_date = 5;

  }

  // PROPERTIES
  string content = 1;
  Format format = 2;
  google.protobuf.Timestamp response_datetime = 3;
}


/** For the payload from the following URL :
 * https://trader.degiro.nl/dgtbxdsservice/agenda/v2
 */
message Agenda {
  // ENUMS
  enum CalendarType {
    DIVIDEND_CALENDAR = 0;
    ECONOMIC_CALENDAR = 1;
    EARNINGS_CALENDAR = 2;
    HOLIDAY_CALENDAR = 3;
    IPO_CALENDAR = 4;
    SPLIT_CALENDAR = 5;
  }

  // MESSAGES
  message Request {
    // PROPERTIES
    CalendarType calendar_type = 1;
    int32 offset = 2;
    int32 limit = 3;
    bool order_by_desc = 4;
    google.protobuf.Timestamp start_date = 5;
    google.protobuf.Timestamp end_date = 6;
    string company_name = 7;
    string countries = 8;
    string classifications = 9;
    string units = 10;
  }

  // PROPERTIES
  CalendarType calendar_type = 1;
  repeated google.protobuf.Struct items = 2;
  int32 offset = 3;
  int32 total = 4;
  google.protobuf.Timestamp response_datetime = 5;
}