// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// NOTE: THIS FILE IS AUTOMATICALLY GENERATED - DO NOT MODIFY

#ifndef HERMES_QMI_UIM_H_
#define HERMES_QMI_UIM_H_

#include <cstdint>

#include <base/logging.h>
#include <libqrtr.h>

class QmiUimCommand {
 public:
  enum Code : uint16_t {
    kReset = 0x00,
    kSendApdu = 0x3B,
    kOpenLogicalChannel = 0x42,
    kGetSlots = 0x47,
  };

  QmiUimCommand(Code code) : code_(code) {}  // NOLINT(runtime/explicit)
  operator Code() const { return code_; }

  const char* ToString() {
    switch (code_) {
      case kReset:
        return "Reset";
      case kSendApdu:
        return "SendApdu";
      case kOpenLogicalChannel:
        return "OpenLogicalChannel";
      case kGetSlots:
        return "GetSlots";
      default:
        CHECK(false) << "Unrecognized value: " << code_;
        return "";
    }
  }

 private:
  Code code_;
};

constexpr int kBufferDataSize = 260;

constexpr int kIccidMaxSize = 20;

struct uim_qmi_result {
  uint16_t result;
  uint16_t error;
};

struct uim_card_result_t {
  uint8_t sw1;
  uint8_t sw2;
};

struct uim_open_logical_channel_req {
  uint8_t slot;
  bool aid_valid;
  uint8_t aid_len;
  uint8_t aid[kBufferDataSize];
};

struct uim_open_logical_channel_resp {
  uim_qmi_result result;
  bool channel_id_valid;
  uint8_t channel_id;
  bool card_result_valid;
  uim_card_result_t card_result;
  bool select_response_valid;
  uint8_t select_response_len;
  uint8_t select_response[kBufferDataSize];
};

struct uim_reset_req {};

struct uim_reset_resp {
  uim_qmi_result result;
};

struct uim_send_apdu_req {
  uint8_t slot;
  uint16_t apdu_len;
  uint8_t apdu[kBufferDataSize];
  bool channel_id_valid;
  uint8_t channel_id;
};

struct uim_send_apdu_resp {
  uim_qmi_result result;
  bool apdu_response_valid;
  uint16_t apdu_response_len;
  uint8_t apdu_response[kBufferDataSize];
};

struct uim_physical_slot_status {
  enum physical_card_status_t : uint32_t {
    kCardUnknown = 0,
    kCardAbsent = 1,
    kCardPresent = 2,
  } physical_card_status;
  enum physical_slot_state_t : uint32_t {
    kSlotInactive = 0,
    kSlotActive = 1,
  } physical_slot_state;
  uint8_t logical_slot;
  uint8_t iccid_len;
  uint8_t iccid[kIccidMaxSize];
};

struct uim_physical_slot_info {
  uint32_t card_protocol;
  uint8_t num_app;
  uint8_t atr_len;
  uint8_t atr[255];
  uint8_t is_euicc;
};

struct uim_get_slots_req {};

struct uim_get_slots_resp {
  uim_qmi_result result;
  bool status_valid;
  uint8_t status_len;
  uim_physical_slot_status status[10];
  bool info_valid;
  uint8_t info_len;
  uim_physical_slot_info info[10];
};

extern struct qmi_elem_info uim_open_logical_channel_req_ei[];
extern struct qmi_elem_info uim_open_logical_channel_resp_ei[];
extern struct qmi_elem_info uim_reset_req_ei[];
extern struct qmi_elem_info uim_reset_resp_ei[];
extern struct qmi_elem_info uim_send_apdu_req_ei[];
extern struct qmi_elem_info uim_send_apdu_resp_ei[];
extern struct qmi_elem_info uim_get_slots_req_ei[];
extern struct qmi_elem_info uim_get_slots_resp_ei[];

#endif  // HERMES_QMI_UIM_H_
