#include "config.h"
#include "ethernet_interface.hpp"
#include "vlan_interface.hpp"
#include "network_manager.hpp"

#include <phosphor-logging/log.hpp>
#include "xyz/openbmc_project/Common/error.hpp"
#include <phosphor-logging/elog-errors.hpp>

#include <string>
#include <algorithm>
#include <fstream>
#include <experimental/filesystem>

namespace phosphor
{
namespace network
{

using namespace phosphor::logging;
using namespace sdbusplus::xyz::openbmc_project::Common::Error;

VlanInterface::VlanInterface(sdbusplus::bus::bus& bus,
                             const std::string& objPath,
                             bool dhcpEnabled,
                             uint32_t vlanID,
                             EthernetInterface& intf,
                             Manager& parent ) :
        VlanIface(bus,objPath.c_str()),
        DeleteIface(bus,objPath.c_str()),
        EthernetInterface(bus, objPath, dhcpEnabled, parent, false),
        parentInterface(intf)
{
    id(vlanID);
    VlanIface::interfaceName(EthernetInterface::interfaceName());
    mACAddress(parentInterface.mACAddress());

    emit_object_added();
}

void VlanInterface::writeDeviceFile()
{
    using namespace std::string_literals;
    fs::path confPath = manager.getConfDir();
    std::string fileName = EthernetInterface::interfaceName() + ".netdev"s;
    confPath /= fileName;
    std::fstream stream;
    try
    {
        stream.open(confPath.c_str(), std::fstream::out);
    }
    catch (std::ios_base::failure& e)
    {
        log<level::ERR>("Unable to open the VLAN device file",
                         entry("FILE=%s", confPath.c_str()),
                         entry("ERROR=%s", e.what()));
        elog<InternalFailure>();

    }

    stream << "[" << "NetDev" << "]\n";
    stream << "Name=" << EthernetInterface::interfaceName() << "\n";
    stream << "Kind=vlan" << "\n";
    stream << "[VLAN]" << "\n";
    stream << "Id=" << id() << "\n";
    stream.close();
}

void VlanInterface::delete_()
{
    parentInterface.deleteVLANObject(EthernetInterface::interfaceName());
}

}//namespace network
}//namespace phosphor
