#include <Arduino.h>
#include "OThread.h"

OpenThread threadChildNode;
DataSet dataset;

void setup() {
  Serial.begin(115200);

  // Start OpenThread Stack - false for not using NVS dataset information
  threadChildNode.begin(false);

  // clear dataset
  dataset.clear();
  // Configure the dataset with the same Network Key of the Leader Node
  uint8_t networkKey[OT_NETWORK_KEY_SIZE] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
  dataset.setNetworkKey(networkKey);

  // Apply the dataset and start the network
  threadChildNode.commitDataSet(dataset);
  threadChildNode.networkInterfaceUp();
  threadChildNode.start();
}

void loop() {
  // Get current device role
  ot_device_role_t currentRole = threadChildNode.otGetDeviceRole();

  // Only print detailed network information when node is active
  if (currentRole != OT_ROLE_DETACHED && currentRole != OT_ROLE_DISABLED) {
    Serial.println("==============================================");
    Serial.println("OpenThread Network Information (Active Dataset):");

    // Get and display the current active dataset
    const DataSet &activeDataset = threadChildNode.getCurrentDataSet();

    Serial.printf("Role: %s\r\n", threadChildNode.otGetStringDeviceRole());
    Serial.printf("RLOC16: 0x%04x\r\n", threadChildNode.getRloc16());

    // Dataset information
    Serial.printf("Network Name: %s\r\n", activeDataset.getNetworkName());
    Serial.printf("Channel: %u\r\n", activeDataset.getChannel());
    Serial.printf("PAN ID: 0x%04x\r\n", activeDataset.getPanId());

    // Extended PAN ID from dataset
    const uint8_t *extPanId = activeDataset.getExtendedPanId();
    if (extPanId) {
      Serial.print("Extended PAN ID: ");
      for (int i = 0; i < OT_EXT_PAN_ID_SIZE; i++) {
        Serial.printf("%02x", extPanId[i]);
      }
      Serial.println();
    }

    // Network Key from dataset
    const uint8_t *networkKey = activeDataset.getNetworkKey();
    if (networkKey) {
      Serial.print("Network Key: ");
      for (int i = 0; i < OT_NETWORK_KEY_SIZE; i++) {
        Serial.printf("%02x", networkKey[i]);
      }
      Serial.println();
    }

    // Additional runtime information
    IPAddress meshLocalEid = threadChildNode.getMeshLocalEid();
    Serial.printf("Mesh Local EID: %s\r\n", meshLocalEid.toString().c_str());

    IPAddress nodeRloc = threadChildNode.getRloc();
    Serial.printf("Node RLOC: %s\r\n", nodeRloc.toString().c_str());

    IPAddress leaderRloc = threadChildNode.getLeaderRloc();
    Serial.printf("Leader RLOC: %s\r\n", leaderRloc.toString().c_str());

    Serial.println();

  } else {
    Serial.println("==============================================");
    Serial.printf("Thread Node Status: %s - Waiting for thread network start...\r\n", threadChildNode.otGetStringDeviceRole());

    Serial.println();
  }

  delay(5000);
}
