// Copyright 2024 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#pragma once

#include "google3/host_commands.h"

#include <string>

namespace google
{
namespace hoth
{
namespace internal
{

std::string payloadVersionString(const payload_region_state& state);

class EcUtil
{
  public:
    // Make the obscure 0 passed to every invocation of RunEcCommand more
    // obvious.
    static constexpr uint8_t kVersionZero = 0;

    virtual ~EcUtil() = default;

    // Check wether a command is supported (and authorized).
    virtual bool isHostCommandSupported(uint16_t cmd) const = 0;

    // Get the Hoth statistics by issuing an EC_PRV_CMD_HOTH_GET_STATISTICS
    // Command.
    virtual ec_response_statistics getHothStatistics() const = 0;

    // Get the hardware information from Hoth chip by issuing an
    // EC_PRV_CMD_HOTH_CHIP_INFO command.
    virtual ec_response_chip_info getHothChipInfo() const = 0;

    // Check the presence of Hoth persistent panic info by issuing a single
    // EC_PRV_CMD_HOTH_PERSISTENT_PANIC_INFO command.
    virtual bool checkHothPersistentPanicInfo() const = 0;

    // Get Hoth Authorization record metrics
    virtual ec_authz_record_get_response getHothAuthRecord() const = 0;

    // Get Hoth KeyRotation metrics
    virtual ec_response_key_rotation_status getHothKeyRotationStatus()
        const = 0;

    // Get Hoth Secure Boot Enforcement status
    virtual secure_boot_enforcement_state getSecureBootEnforcementState()
        const = 0;

    // Sets the TPM locality to `locality` via EC_PRV_CMD_HOTH_TPM_CONTROL.
    virtual void setTpmLocality(uint8_t locality) const = 0;

    // Gets the TPM locality via EC_PRV_CMD_HOTH_TPM_CONTROL.
    virtual uint8_t getTpmLocality() const = 0;

    // Get Hoth Payload status
    virtual payload_status_response getPayloadStatus() const = 0;
};

} // namespace internal

} // namespace hoth

} // namespace google
