/*
 * Copyright (c) 2017, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above
 *       copyright notice, this list of conditions and the following
 *       disclaimer in the documentation and/or other materials provided
 *       with the distribution.
 *     * Neither the name of The Linux Foundation nor the names of its
 *       contributors may be used to endorse or promote products derived
 *       from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "WlctPciAcssHelper.h"
#include "PciDeviceAccess.h"
#include <iostream>
#include <fstream>
#include <string>

#ifdef _WINDOWS
#include "JtagDeviceAccess.h"
#endif

#include <sys/time.h>

#define WLCT_MS_PER_S  1000
#define WLCT_US_PER_MS 1000
#define PROC_MODULES_PATH "/proc/modules"
#define DRIVER_KEYWORD "wil6210"

#define END_POINT_RESULT_MAX_SIZE 1000

using namespace std;

void CreatePciInterface(const char* interfaceName, DType devType, INTERFACE_LIST* ifList, int* ReturnItems);
void CreateMultipleInterfaces(const char* interfaceName, DType devType, INTERFACE_LIST* ifList, int* ReturnItems);
bool GetInterfaceNameFromEP(const char* pciEndPoint, char* interfaceName);
int GetNumberOfInterfaces();

int GetSimulatorInterfaces(INTERFACE_LIST* ifList, int* ReturnItems)
{
    // Not supported in Linux
    WLCT_UNREFERENCED_PARAM(ifList);

    return *ReturnItems;
}
bool WilDriverExist()
{
    ifstream ifs(PROC_MODULES_PATH);
    string DriverKey = DRIVER_KEYWORD;
    string line;
    while(getline(ifs, line)) {
        if (line.find(DriverKey, 0) != string::npos) {
            LOG_MESSAGE_INFO(_T("Found WIGIG interface [wEP0!MARLON]"));
            return true;
        }
    }

    return false;
}

int GetPciInterfaces(INTERFACE_LIST* ifList, int* ReturnItems)
{
    CreateMultipleInterfaces("wEP0L!SPARROW", MST_SPARROW, ifList, ReturnItems);

    return *ReturnItems;
}

void CreateMultipleInterfaces(const char* interfaceName, DType devType, INTERFACE_LIST* ifList, int* ReturnItems)
{
    //do something with params
    (void)devType;
    // Holds the console ouput containing the current End Point
    char pciEndPoints[END_POINT_RESULT_MAX_SIZE];

    // This command retrieves the PCI endpoints enumerated
    const char* szCmdPattern = "ls /sys/module/wil6210/drivers/pci\\:wil6210 | grep :";

    FILE* pIoStream = popen(szCmdPattern, "r");
    if (!pIoStream)
    {
        LOG_MESSAGE_ERROR("Failed to run command to detect End Points\n" );
        return;
    }

    LOG_MESSAGE_DEBUG("Searching for PCI end points: %s", szCmdPattern);

    while (fgets(pciEndPoints, END_POINT_RESULT_MAX_SIZE, pIoStream) != NULL)
    {
        // The command output contains a newline character that should be removed
        pciEndPoints[strcspn(pciEndPoints, "\r\n")] = '\0';
        LOG_MESSAGE_DEBUG("PCI End Point Found: %s", pciEndPoints);

        // Get interface name from End Point
        char networkInterfaceName[IFNAMSIZ] = {0};
        GetInterfaceNameFromEP(pciEndPoints, networkInterfaceName);

        // Append driver interface name
        std::string ifName = interfaceName;
        ifName += "!";
        ifName += networkInterfaceName;

        LOG_MESSAGE_DEBUG("Attempting to create interface named: %s", ifName.c_str());

        CreatePciInterface(ifName.c_str(), MST_SPARROW, ifList, ReturnItems);
    }

    pclose(pIoStream);
}


bool GetInterfaceNameFromEP(const char* pciEndPoint, char* interfaceName)
{
    char szInterfaceCmdPattern[END_POINT_RESULT_MAX_SIZE];

    // This command translates the End Point to the interface name
    snprintf(szInterfaceCmdPattern, END_POINT_RESULT_MAX_SIZE, "ls /sys/module/wil6210/drivers/pci:wil6210/%s/net", pciEndPoint);

    LOG_MESSAGE_DEBUG("Running command: %s", szInterfaceCmdPattern);

    FILE* pIoStream = popen(szInterfaceCmdPattern, "r");
    if (!pIoStream)
    {
        LOG_MESSAGE_ERROR("Failed to run command to detect End Points\n" );
        return false;
    }

    while (fgets(interfaceName, IFNAMSIZ, pIoStream) != NULL)
    {
        // The command output contains a newline character that should be removed
        interfaceName[strcspn(interfaceName, "\r\n")] = '\0';
        LOG_MESSAGE_DEBUG("PCI interface found: %s", interfaceName);

        return true;
    }

    pclose(pIoStream);
    return false;
}


void CreatePciInterface(const char* interfaceName, DType devType, INTERFACE_LIST* ifList, int* ReturnItems)
{
    void* res = NULL;
    void** tempAccess = &res;

    if(!CreateDeviceAccessHandler(interfaceName, devType, tempAccess))
    {
        snprintf(ifList->list[(*ReturnItems)].ifName, MAX_IF_NAME_LENGTH, "%s", interfaceName);
        (*ReturnItems) += 1;
        LOG_MESSAGE_INFO(_T("Found WIGIG interface"));
        if(res)
        {
            CloseDeviceAccessHandler(*tempAccess);
        }
    }
}

int GetSerialInterfaces(INTERFACE_LIST* ifList, int* ReturnItems)
{
    // Not supported in Linux
    WLCT_UNREFERENCED_PARAM(ifList);

    return *ReturnItems;
}

int GetJtagInterfaces(INTERFACE_LIST* ifList, int* ReturnItems)
{

#ifdef _WINDOWS
    DType devType;
    void* handler = NULL;
    DWORD err;
    uint32_t addr;
    uint32_t val;
    int ret = 0;

    char ifName[MAX_IF_NAME_LENGTH];

    //////////////////////////////////////////////////////////////////////////
    // find all jtag channels that connect to a WIGIG card
    //////////////////////////////////////////////////////////////////////////
    devType = MST_MARLON;
    addr = BAUD_RATE_REGISTER;

    int cdvc = 0;
    DVC dvc;
    char infoSet[28];

    LOG_MESSAGE_INFO(_T("scan jtag devices"));

    if (!funcDmgrEnumDevices(&cdvc)) {
        LOG_MESSAGE_INFO(_T("Error enumerating JTAG devices"));
        cdvc = 0;
    }

    for (int idvc = 0; idvc < cdvc; idvc++) {

        // DMGR API Call: funcDmgrGetDvc
        if (!funcDmgrGetDvc(idvc, &dvc)) {
            LOG_MESSAGE_INFO(_T("Error getting device info"));
            break;
        }
        DINFO dinfo = dinfoUsrName;
        BOOL bRes;
        snprintf(infoSet, sizeof(infoSet), "wjtag%d", idvc);
        bRes = funcDmgrSetInfo(&dvc, dinfo, (void*)infoSet);

        WLCT_UNREFERENCED_PARAM(bRes);

        snprintf(ifName, MAX_IF_NAME_LENGTH, "%s!MARLON", infoSet);
        err = CreateDeviceAccessHandler(ifName, devType, &handler);
        if (err == 0 && isInit(handler))
        {
            ret = WlctAccssRead(handler, addr, val);
            if (ret == 0 && val > 0 && val < 0xFFFF)
            {
                snprintf(ifList->list[(*ReturnItems)++].ifName, MAX_IF_NAME_LENGTH, "%s", ifName);
                LOG_MESSAGE_INFO(_T("Found JTAG WIGIG interface [%s]"),
                                 ifName);
            }
            CloseDeviceAccessHandler(handler);
            handler = NULL;
        }
    }

    /* Clean up and get out */
    // DMGR API Call: DmgrFreeDvcEnum
    funcDmgrFreeDvcEnum();

#endif
//do something with params
    WLCT_UNREFERENCED_PARAM(ifList);
    return *ReturnItems;
}

void ComSetParameters(CComPortDeviceAccess* pComDeviceAccss, DType devType)
{
    // Not supported in Linux
    WLCT_UNREFERENCED_PARAM(pComDeviceAccss);
    WLCT_UNREFERENCED_PARAM(devType);
}

int SetMachineSpeed(void* pDeviceAccss, DWORD baud_rate_target)
{
    // Not supported in Linux
    WLCT_UNREFERENCED_PARAM(pDeviceAccss);
    WLCT_UNREFERENCED_PARAM(baud_rate_target);

    return -1;
}

uint64_t GetTimeStampMs()
{
    struct timeval tv = {0,0};
    if (gettimeofday(&tv, NULL) == 0)
    {
        return tv.tv_sec * WLCT_MS_PER_S + tv.tv_usec / WLCT_US_PER_MS;
    }

    return 0;
}

int GetPciAcssVersion(WLCT_DLL_VERSION *pVer)
{
    WLCT_ASSERT(pVer != NULL);
    pVer->major       = 0;
    pVer->minor       = 0;
    pVer->maintenance = 0;
    pVer->build       = 0;
    return 0;
}

