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

#pragma once

#include <stdbool.h>
#include <stdint.h>

#include <array>
#include <gpt/gpt.h>
#include <zircon/compiler.h>

namespace gpt {

// Since the human-readable representation of a GUID is the following format,
// ordered little-endian, it is useful to group a GUID into these
// appropriately-sized groups.
struct guid_t {
    uint32_t data1;
    uint16_t data2;
    uint16_t data3;
    uint8_t data4[8];
};
static_assert(sizeof(guid_t) == GPT_GUID_LEN, "unexpected guid_t size");

// Number of GUID_.*[STRING|VALUE|NAME] pairs
constexpr uint8_t kKnownGuidEntries = 22;

class GuidProperties {
public:
    GuidProperties(const char* name, const char* str, const uint8_t guid[GPT_GUID_LEN]) {
        ZX_ASSERT(strlen(name) < sizeof(name_));
        ZX_ASSERT(strlen(str) == sizeof(str_) - 1);
        strncpy(name_, name, sizeof(name_));
        strncpy(str_, str, sizeof(str_) - 1);
        memcpy(guid_, guid, GPT_GUID_LEN);
    }

    const char* name() const { return name_; }

    const char* str() const { return str_; }

    const uint8_t* guid() const { return guid_; }

private:
    char name_[(GPT_NAME_LEN / 2) + 1];
    char str_[kGuidStrLength];
    uint8_t guid_[GPT_GUID_LEN];
};

class KnownGuid {
public:
    using NameTable = std::array<GuidProperties, kKnownGuidEntries>;

    // Given a known guid name, like "fuchsia-blob", converts it
    // it's guid_t equivalent. On failure, returns false.
    static bool NameToGuid(const char* name, uint8_t* out);

    // Converts a known guid_t value to it's name.
    // If there exists no name for the guid, returns nullptr.
    static const char* GuidToName(const uint8_t* guid);

    // Converts a known guid str, like "2967380E-134C-4CBB-B6DA-17E7CE1CA45D",
    // to a name "fuchsia-blob".
    // If there exists no name for the guid, returns nullptr.
    static const char* GuidStrToName(const char* str);

    using const_iterator = NameTable::const_iterator;

    static const_iterator begin() { return nametab_.begin(); }
    static const_iterator end() { return nametab_.end(); }
    static const_iterator cbegin() { return nametab_.cbegin(); }
    static const_iterator cend() { return nametab_.cend(); }

private:
    static const NameTable nametab_;
};

} // namespace gpt
