// 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_UIM_CMD_H_
#define HERMES_UIM_CMD_H_

#include <cstdint>

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

#include "hermes/qmi_cmd_interface.h"

class UimCmd : public QmiCmdInterface {
 public:
  enum QmiType : uint16_t {
    kReset = 0x00,
    kSendApdu = 0x3B,
    kOpenLogicalChannel = 0x42,
    kSwitchSlot = 0x46,
    kGetSlots = 0x47,
  };

  explicit UimCmd(QmiType qmi_type)
      : service_(Service::kUim), qmi_type_(qmi_type) {}

  uint16_t qmi_type() const override {
    return static_cast<uint16_t>(qmi_type_);
  }

  Service service() const override { return service_; }

  const char* ToString() {
    switch (qmi_type_) {
      case QmiType::kReset:
        return "Reset";
      case QmiType::kSendApdu:
        return "SendApdu";
      case QmiType::kOpenLogicalChannel:
        return "OpenLogicalChannel";
      case QmiType::kSwitchSlot:
        return "SwitchSlot";
      case QmiType::kGetSlots:
        return "GetSlots";
      default:
        CHECK(false) << "Unrecognized value: "
                     << static_cast<uint16_t>(qmi_type_);
        return "";
    }
  }

 private:
  Service service_;
  QmiType qmi_type_;
};

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;
  bool procedure_bytes_valid;
  uint8_t procedure_bytes;
};

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];
};

struct uim_switch_slot_req {
  uint8_t logical_slot;
  uint32_t physical_slot;
};

struct uim_switch_slot_resp {
  uim_qmi_result result;
};

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[];
extern struct qmi_elem_info uim_switch_slot_req_ei[];
extern struct qmi_elem_info uim_switch_slot_resp_ei[];

#endif  // HERMES_UIM_CMD_H_
