/*
 * Copyright (C) 2020-2021 Aloysius Indrayanto
 *
 * This file is part of the eCxx library, see LICENSE file for the license details.
 */

/*
 * ----------------------------------------------------------------------------------
 * The code in this file is copied (with a few modifications) from:
 *     LwipIntf.h
 * ----------------------------------------------------------------------------------
 * This file is part of the esp8266 core for Arduino environment.
 *
 * This library is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License as published by the Free Software
 * Foundation; either version 2.1 of the License, or (at your option) any later
 * version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License along
 * with this library; if not, write to the Free Software Foundation, Inc., 51
 * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 * ----------------------------------------------------------------------------------
 */


#ifndef ECXX_PLATFORM_NODEMCU_LWIPINTF_H
#define ECXX_PLATFORM_NODEMCU_LWIPINTF_H


#include <lwip/netif.h>

#if 0

    // NOTE : Using eCxx::Ext::function<T> here would produce a larger
    //        and most likely less efficient executable/binary

    #define __ECXX_NODEMCU_LWIPINTF_USE_ECXX_FUNCTION

    #include <eCxx/CTL/Function.h>

#else

    #define __ECXX_NODEMCU_LWIPINTF_USE_STD_FUNCTION

    #include <functional>

#endif

#include "IPAddress.h"


namespace eCxx {

namespace NodeMCU {


class LwipIntf {
    public:
#ifdef __ECXX_NODEMCU_LWIPINTF_USE_ECXX_FUNCTION
        using CBType = eCxx::Ext::function<void(netif*)>;
#else
        using CBType = std::function<void(netif*)>;
#endif

    public:
        static bool stateUpCB(CBType&& cb);
        static void clearAllStateUpCB();

        static bool ipAddressReorder(const IPAddress& local_ip, const IPAddress& arg1, const IPAddress& arg2, const IPAddress& arg3, IPAddress& gateway, IPAddress& netmask, IPAddress& dns1);

        WString hostname();
        bool hostname(const char* aHostname);

        inline bool hostname(const WString& aHostname)
        { return hostname( aHostname.c_str() ); }
};


} // namespace NodeMCU

} // namespace eCxx


//
// For compatibility with the Arduino library part
//
typedef eCxx::NodeMCU::LwipIntf LwipIntf;


#endif
