#!/usr/bin/env node
//
// If you uncomment the line in `zap-generate.js` that looks like this:
//   //  .then(() => scriptUtil.addToJsonFile('/tmp/gen.log', cmdArgs))
// then it will produce gen.log file.
// This script can then be used to take that file and produce a sdk.json out of it.
//
// Note: this was used in Matter SDK migration, but it is useful, yet not without
// some modifications for future cases. That's why this script is commited here.
//
// It is NOT part of zap runtime or anything, it's just a quick hack.

const fs = require('fs')
const fsp = fs.promises
const path = require('path')
const os = require('os')

// This points to the root of the SDK.
const sdkRoot = path.join(os.homedir(), 'git/matter')

async function read() {
  let data = await fsp.readFile('/tmp/gen.log')
  let json = JSON.parse(data)
  let allParsed = []
  for (let one of json) {
    let parsed = {}
    for (let x = 0; x < one.length; x++) {
      if (one[x] == '-z') {
        parsed.zcl = path.relative(sdkRoot, one[x + 1])
      } else if (one[x] == '-g') {
        parsed.gen = path.relative(sdkRoot, one[x + 1])
      } else if (one[x] == '-i') {
        parsed.input = path.relative(sdkRoot, one[x + 1])
      } else if (one[x] == '-o') {
        parsed.output = path.relative(sdkRoot, one[x + 1])
      }
    }
    allParsed.push(parsed)
  }

  let final = {}
  final.zcl = {}
  for (let one of allParsed) {
    if (!Object.values(final.zcl).includes(one.zcl)) {
      let key = 'z' + Object.keys(final.zcl).length
      if (one.zcl.includes('extensions')) {
        key = 'main_ext'
      } else {
        key = 'main'
      }
      final.zcl[key] = one.zcl
    }
  }

  final.templates = {}
  for (let one of allParsed) {
    if (!Object.values(final.templates).includes(one.gen)) {
      let key = 't' + Object.keys(final.templates).length
      if (one.gen.includes('java')) {
        key = 'java'
      } else if (one.gen.includes('python')) {
        key = 'python'
      } else if (one.gen.includes('darwin')) {
        if (one.gen.includes('CHIP')) {
          key = 'darwin-chip'
        } else if (one.gen.includes('test')) {
          key = 'darwin-test'
        } else {
          key = 'darwin'
        }
      } else if (one.gen.includes('chip-tool')) {
        if (one.gen.includes('test')) {
          key = 'chip-tool-test'
        } else {
          key = 'chip-tool'
        }
      } else if (one.gen.includes('app/common')) {
        key = 'app-common'
      } else if (one.gen.includes('app/tests')) {
        key = 'app-test'
      } else if (one.gen.includes('placeholder')) {
        key = 'placeholder'
      } else if (one.gen.includes('app/zap-templates')) {
        key = 'app-zap'
      }
      final.templates[key] = one.gen
    }
  }

  final.zapFiles = {}
  for (let one of allParsed) {
    if (!Object.values(final.zapFiles).includes(one.input)) {
      let key = 'z' + Object.keys(final.zapFiles).length
      if (one.input.includes('controller-clusters.zap')) {
        key = 'controller'
      } else if (one.input.startsWith('examples/placeholder')) {
        if (one.input.includes('app1')) key = 'app1'
        else key = 'app2'
      } else if (one.input.startsWith('examples/chef')) {
        key = path.basename(one.input, '.zap')
        key = 'chef_' + key.substring(9, key.length - 11)
      } else if (one.input.startsWith('examples')) {
        key = path.basename(one.input, '.zap')
      }
      final.zapFiles[key] = one.input
    }
  }

  final.generation = []

  for (let one of allParsed) {
    let out = one.output
    let input = Object.keys(final.zapFiles).find(
      (key) => final.zapFiles[key] === one.input
    )

    let zcl = Object.keys(final.zcl).find((key) => final.zcl[key] === one.zcl)

    let template = Object.keys(final.templates).find(
      (key) => final.templates[key] === one.gen
    )

    let thisOne = {
      zapFile: input,
      output: out,
      zcl: zcl,
      template: template
    }
    // Find existing one with same zapFile and output and zcl
    let existing = final.generation.find((x) => {
      return (
        x.zapFile == thisOne.zapFile &&
        x.output == thisOne.output &&
        x.zcl == thisOne.zcl
      )
    })
    if (existing) {
      let ct = existing.template
      if (Array.isArray(ct)) {
        ct.push(thisOne.template)
      } else {
        existing.template = [existing.template, thisOne.template]
      }
    } else {
      final.generation.push(thisOne)
    }

    final.generation.sort((a, b) => {
      let cmp = a.zapFile.localeCompare(b.zapFile)
      if (cmp != 0) return cmp
      cmp = a.output.localeCompare(b.output)
      if (cmp != 0) return cmp

      cmp = a.zcl.localeCompare(b.zcl)
      if (cmp != 0) return cmp
      return a.template.localeCompare(b.template)
    })
  }

  console.log(JSON.stringify(final, null, 2))
}

read().then(() => {})
