#include "archinc.h"
#include "board.h"
#include "cli.h"
#include "clichar.h"
#include "bdinfo.h"
#include "zl_cpumac.h"
#include "ip.h"
#include "version.h"
#include "metadata.h"

#include <stdio.h>

static int metadataHandler(int argc, char * argv[], int flags);

#define BUFFER_SIZE (10)
static char buffer[BUFFER_SIZE];

static void clearBuffer(void) {
  int i;
  for(i=0;i<BUFFER_SIZE;i++) {
    buffer[i] = 0x00;
    }
}

void metadataInit(void)
{

  cliRegisterCommand("meta", metadataHandler, "meta - show all Medusa platform metadata");
}

static int metadataHandler(int argc, char * argv[], int flags)
{
  int retVal = -1;
  int bufLen;
  char * pOutBuf;

  pOutBuf = clicharGetOutputBuffer(&bufLen);
  
  zarlinkCpuMacAddrGet((unsigned char *)buffer);
  sprintf(pOutBuf, "CPU MAC address: %02x:%02x:%02x:%02x:%02x:%02x\r\n",
  buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
  clicharSendOutputBuffer(pOutBuf, bufLen);

  clearBuffer();

  if (ipCpuAddrGet(buffer) == 0) {
    sprintf(pOutBuf, "CPU IP address: %d.%d.%d.%d\r\n", buffer[0], buffer[1], buffer[2], buffer[3]);
    clicharSendOutputBuffer(pOutBuf, bufLen);
    }

  clearBuffer();

  if (ipCpuNetmaskGet(buffer) == 0) {
    sprintf(pOutBuf, "CPU IP netmask: %d.%d.%d.%d\r\n", buffer[0], buffer[1], buffer[2], buffer[3]);
    clicharSendOutputBuffer(pOutBuf, bufLen);
    }

  clearBuffer();

  if (ipCpuGatewayGet(buffer) == 0) {
    sprintf(pOutBuf, "CPU IP gateway: %d.%d.%d.%d\r\n", buffer[0], buffer[1], buffer[2], buffer[3]);
    clicharSendOutputBuffer(pOutBuf, bufLen);
    }

  clearBuffer();

  if (ipSidearmAddrGet(buffer) == 0) {
    sprintf(pOutBuf, "SideARM IP address: %d.%d.%d.%d\r\n", buffer[0], buffer[1], buffer[2], buffer[3]);
    clicharSendOutputBuffer(pOutBuf, bufLen);
    }

  clearBuffer();

  bdinfoGetSerial(buffer);
  sprintf(pOutBuf, "Medusa serial number: %s\r\n", buffer);
  clicharSendOutputBuffer(pOutBuf, bufLen);

  clearBuffer();

  bdinfoGetEcoLevel(buffer);
  sprintf(pOutBuf, "Medusa ECO level: %s\r\n", buffer);
  clicharSendOutputBuffer(pOutBuf, bufLen);

  clearBuffer();

  sprintf(pOutBuf, "Firmware build: v%s [%s %s]\r\n", appVersion, buildDate, buildTime);
  clicharSendOutputBuffer(pOutBuf, bufLen);

  clearBuffer();

  sprintf(pOutBuf, "Toolchain: %s %s\r\n", toolchain, toolVersion);
  clicharSendOutputBuffer(pOutBuf, bufLen);

  return 0;
}
