#pragma once

#include "logger.hpp"
#include "parser_interface.hpp"
#include "types.hpp"

#include <fstream>
#include <string_view>

namespace vpd
{
/**
 * @brief Concrete class to implement IPZ VPD parsing.
 *
 * The class inherits ParserInterface interface class and overrides the parser
 * functionality to implement parsing logic for IPZ VPD format.
 */
class IpzVpdParser : public ParserInterface
{
  public:
    // Deleted APIs
    IpzVpdParser() = delete;
    IpzVpdParser(const IpzVpdParser&) = delete;
    IpzVpdParser& operator=(const IpzVpdParser&) = delete;
    IpzVpdParser(IpzVpdParser&&) = delete;
    IpzVpdParser& operator=(IpzVpdParser&&) = delete;

    /**
     * @brief Constructor.
     *
     * @param[in] vpdVector - VPD data.
     * @param[in] vpdFilePath - Path to VPD EEPROM.
     * @param[in] vpdStartOffset - Offset from where VPD starts in the file.
     * Defaulted to 0.
     */
    IpzVpdParser(const types::BinaryVector& vpdVector,
                 const std::string& vpdFilePath, size_t vpdStartOffset = 0) :
        m_vpdVector(vpdVector), m_vpdFilePath(vpdFilePath),
        m_vpdStartOffset(vpdStartOffset)
    {
        try
        {
            m_vpdFileStream.exceptions(
                std::ifstream::badbit | std::ifstream::failbit);
            m_vpdFileStream.open(vpdFilePath, std::ios::in | std::ios::out |
                                                  std::ios::binary);
        }
        catch (const std::fstream::failure& e)
        {
            logging::logMessage(e.what());
        }
    }

    /**
     * @brief Defaul destructor.
     */
    ~IpzVpdParser() = default;

    /**
     * @brief API to parse IPZ VPD file.
     *
     * Note: Caller needs to check validity of the map returned. Throws
     * exception in certain situation, needs to be handled accordingly.
     *
     * @return parsed VPD data.
     */
    virtual types::VPDMapVariant parse() override;

    /**
     * @brief API to check validity of VPD header.
     *
     * Note: The API throws exception in case of any failure or malformed VDP.
     *
     * @param[in] itrToVPD - Iterator to the beginning of VPD file.
     * Don't change the parameter to reference as movement of passsed iterator
     * to an offset is not required after header check.
     */
    void checkHeader(types::BinaryVector::const_iterator itrToVPD);

    /**
     * @brief API to read keyword's value from hardware
     *
     * @param[in] i_paramsToReadData - Data required to perform read
     *
     * @throw
     * sdbusplus::xyz::openbmc_project::Common::Device::Error::ReadFailure.
     *
     * @return On success return the value read. On failure throw exception.
     */
    types::DbusVariantType
        readKeywordFromHardware(const types::ReadVpdParams i_paramsToReadData);

    /**
     * @brief API to write keyword's value on hardware.
     *
     * @param[in] i_paramsToWriteData - Data required to perform write.
     *
     * @throw sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument.
     * @throw sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed.
     * @throw DataException
     * @throw EccException
     *
     *
     * @return On success returns number of bytes written on hardware, On
     * failure throws exception.
     */
    int writeKeywordOnHardware(const types::WriteVpdParams i_paramsToWriteData);

  private:
    /**
     * @brief Check ECC of VPD header.
     *
     * @return true/false based on check result.
     */
    bool vhdrEccCheck();

    /**
     * @brief Check ECC of VTOC.
     *
     * @return true/false based on check result.
     */
    bool vtocEccCheck();

    /**
     * @brief Check ECC of a record.
     *
     * Note: Throws exception in case of failure. Caller need to handle as
     * required.
     *
     * @param[in] iterator - Iterator to the record.
     * @return success/failre
     */
    bool recordEccCheck(types::BinaryVector::const_iterator iterator);

    /**
     * @brief API to read VTOC record.
     *
     * The API reads VTOC record and returns the length of PT keyword.
     *
     * Note: Throws exception in case of any error. Caller need to handle as
     * required.
     *
     * @param[in] itrToVPD - Iterator to begining of VPD data.
     * @return Length of PT keyword.
     */
    auto readTOC(types::BinaryVector::const_iterator& itrToVPD);

    /**
     * @brief API to read PT record.
     *
     * Note: Throws exception in case ECC check fails.
     *
     * @param[in] itrToPT - Iterator to PT record in VPD vector.
     * @param[in] ptLength - length of the PT record.
     * @return List of record's offset.
     */
    types::RecordOffsetList readPT(types::BinaryVector::const_iterator& itrToPT,
                                   auto ptLength);

    /**
     * @brief API to read keyword data based on its encoding type.
     *
     * @param[in] kwdName - Name of the keyword.
     * @param[in] kwdDataLength - Length of keyword data.
     * @param[in] itrToKwdData - Iterator to start of keyword data.
     * @return keyword data, empty otherwise.
     */
    std::string readKwData(std::string_view kwdName, std::size_t kwdDataLength,
                           types::BinaryVector::const_iterator itrToKwdData);

    /**
     * @brief API to read keyword and its value under a record.
     *
     * @param[in] iterator - pointer to the start of keywords under the record.
     * @return keyword-value map of keywords under that record.
     */
    types::IPZVpdMap::mapped_type
        readKeywords(types::BinaryVector::const_iterator& itrToKwds);

    /**
     * @brief API to process a record.
     *
     * @param[in] recordOffset - Offset of the record in VPD.
     */
    void processRecord(auto recordOffset);

    /**
     * @brief Get keyword's value from record
     *
     * @param[in] i_record - Record's name
     * @param[in] i_keyword - Keyword's name
     * @param[in] i_recordDataOffset - Record's offset value
     *
     * @throw std::runtime_error
     *
     * @return On success return bytes read, on failure throws error.
     */
    types::BinaryVector getKeywordValueFromRecord(
        const types::Record& i_recordName, const types::Keyword& i_keywordName,
        const types::RecordOffset& i_recordDataOffset);

    /**
     * @brief Get record's details from VTOC's PT keyword value
     *
     * This API parses through VTOC's PT keyword value and returns the given
     * record's offset, record's length, ECC offset and ECC length.
     *
     * @param[in] i_record - Record's name.
     * @param[in] i_vtocOffset - Offset to VTOC record
     *
     * @return On success return record's details, on failure return empty
     * buffer.
     */
    types::RecordData
        getRecordDetailsFromVTOC(const types::Record& l_recordName,
                                 const types::RecordOffset& i_vtocOffset);

    /**
     * @brief API to update record's ECC
     *
     * This API is required to update the record's ECC based on the record's
     * current data.
     *
     * @param[in] i_recordDataOffset - Record's data offset
     * @param[in] i_recordDataLength - Record's data length
     * @param[in] i_recordECCOffset - Record's ECC offset
     * @param[in] i_recordECCLength - Record's ECC length
     * @param[in,out] io_vpdVector - FRU VPD in vector to update record's ECC.
     *
     * @throw EccException
     */
    void updateRecordECC(const auto& i_recordDataOffset,
                         const auto& i_recordDataLength,
                         const auto& i_recordECCOffset,
                         size_t i_recordECCLength,
                         types::BinaryVector& io_vpdVector);

    /**
     * @brief API to set record's keyword's value on hardware.
     *
     * @param[in] i_recordName - Record name.
     * @param[in] i_keywordName - Keyword name.
     * @param[in] i_keywordData - Keyword data.
     * @param[in] i_recordDataOffset - Offset to record's data.
     * @param[in,out] io_vpdVector - FRU VPD in vector to read and write
     * keyword's value.
     *
     * @throw DataException
     *
     * @return On success returns number of bytes set. On failure returns -1.
     */
    int setKeywordValueInRecord(const types::Record& i_recordName,
                                const types::Keyword& i_keywordName,
                                const types::BinaryVector& i_keywordData,
                                const types::RecordOffset& i_recordDataOffset,
                                types::BinaryVector& io_vpdVector);

    // Holds VPD data.
    const types::BinaryVector& m_vpdVector;

    // stores parsed VPD data.
    types::IPZVpdMap m_parsedVPDMap{};

    // Holds the VPD file path
    const std::string& m_vpdFilePath;

    // Stream to the VPD file. Required to correct ECC
    std::fstream m_vpdFileStream;

    // VPD start offset. Required for ECC correction.
    size_t m_vpdStartOffset = 0;
};
} // namespace vpd
