/* SPDX-License-Identifier: Apache-2.0 */
/* Copyright (C) 2018 IBM Corp. */
#pragma once

#include "mboxd_pnor_partition_table.h"
#include <fcntl.h>
#include <string>
#include <unistd.h>
#include <experimental/filesystem>

namespace openpower
{
namespace file
{

class Descriptor
{
  private:
    /** default value */
    int fd = -1;

  public:
    Descriptor() = default;
    Descriptor(const Descriptor&) = delete;
    Descriptor& operator=(const Descriptor&) = delete;
    Descriptor(Descriptor&&) = delete;
    Descriptor& operator=(Descriptor&&) = delete;

    Descriptor(int fd) : fd(fd)
    {
    }

    ~Descriptor()
    {
        if (fd >= 0)
        {
            close(fd);
        }
    }

    int operator()() const
    {
        return fd;
    }

    void set(int descriptor)
    {
        fd = descriptor;
    }
};

} // namespace file

namespace virtual_pnor
{

namespace fs = std::experimental::filesystem;

enum class ReturnCode : uint8_t
{
    FILE_NOT_FOUND = 0,
    PARTITION_NOT_FOUND = 1,
    PARTITION_READ_ONLY = 2,
    FILE_OPEN_FAILURE = 3,
    SUCCESS = 4,
};

class Request
{
  public:
    Request() = default;
    Request(const Request&) = delete;
    Request& operator=(const Request&) = delete;
    Request(Request&&) = default;
    Request& operator=(Request&&) = default;
    ~Request() = default;

    openpower::file::Descriptor fd;

  protected:
    /** @brief opens the partition file
     *
     *  @param[in] filePath - Absolute file path.
     *  @param[in] mode - File open mode.
     */
    ReturnCode open(const std::string& filePath, int mode);

    /** @brief returns the partition file path associated with the offset.
     *
     *  @param[in] context - The mbox context pointer.
     *  @param[in] offset - The pnor offset(bytes).
     */

    std::string getPartitionFilePath(struct mbox_context* context,
                                     uint32_t offset);

    const pnor_partition* partition = nullptr;
};

/** @class RORequest
 *  @brief Represent the read request of the partition.
 *         Stores the partition meta data.
 */
class RORequest : public Request
{
  public:
    RORequest() = default;
    RORequest(const RORequest&) = delete;
    RORequest& operator=(const RORequest&) = delete;
    RORequest(RORequest&&) = default;
    RORequest& operator=(RORequest&&) = default;
    ~RORequest(){};

    /** @brief opens the partition file associated with the offset
     *         in read only mode and gets the partition details.
     *
     *  1.  Depending on the partition type,tries to open the file
     *      from the associated partition(RW/PRSV/RO).
     *  1a. if file not found in the corresponding
     *      partition(RW/PRSV/RO) then tries to read the file from
     *      the read only partition.
     *  1b. if the file not found in the read only partition then
     *      throw exception.
     *
     *  @param[in] context - The mbox context pointer.
     *  @param[in] offset - The pnor offset(bytes).
     */
    const pnor_partition* getPartitionInfo(struct mbox_context* context,
                                           uint32_t offset);
};

/** @class RWRequest
 *  @brief Represent the write request of the partition.
 *         Stores the partition meta data.
 */
class RWRequest : public Request
{
  public:
    RWRequest() = default;
    RWRequest(const RWRequest&) = delete;
    RWRequest& operator=(const RWRequest&) = delete;
    RWRequest(RWRequest&&) = default;
    RWRequest& operator=(RWRequest&&) = default;
    ~RWRequest(){};

    /** @brief opens the partition file associated with the offset
     *         in write mode and gets the parttition details.
     *
     *  1.  Depending on the partition type tries to open the file
     *      from the associated partition.
     *  1a. if file not found in the corresponding partition(RW/PRSV)
     *      then copy the file from the read only partition to the (RW/PRSV)
     *      partition depending on the partition type.
     *  1b. if the file not found in the read only partition then throw
     * exception.
     *
     *  @param[in] context - The mbox context pointer.
     *  @param[in] offset - The pnor offset(bytes).
     */
    const pnor_partition* getPartitionInfo(struct mbox_context* context,
                                           uint32_t offset);
};

} // namespace virtual_pnor
} // namespace openpower
