/*
 *   Copyright (c) 2023 Project CHIP Authors
 *   All rights reserved.
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 *
 */
package com.matter.controller

import chip.devicecontroller.ChipDeviceController
import chip.devicecontroller.ControllerParams
import com.matter.controller.commands.common.*
import com.matter.controller.commands.discover.*
import com.matter.controller.commands.pairing.*

private fun getDiscoveryCommands(
  controller: ChipDeviceController,
  credentialsIssuer: CredentialsIssuer
): List<Command> {
  return listOf(
    DiscoverCommand(controller, credentialsIssuer),
    DiscoverCommissionablesCommand(controller, credentialsIssuer),
    DiscoverCommissionersCommand(controller, credentialsIssuer),
  )
}

private fun getPairingCommands(
  controller: ChipDeviceController,
  credentialsIssuer: CredentialsIssuer
): List<Command> {
  return listOf(
    UnpairCommand(controller, credentialsIssuer),
    PairCodeCommand(controller, credentialsIssuer),
    PairCodePaseCommand(controller, credentialsIssuer),
    PairCodeWifiCommand(controller, credentialsIssuer),
    PairCodeThreadCommand(controller, credentialsIssuer),
    PairAddressPaseCommand(controller, credentialsIssuer),
    PairAlreadyDiscoveredCommand(controller, credentialsIssuer),
    PairOnNetworkCommand(controller, credentialsIssuer),
    PairOnNetworkShortCommand(controller, credentialsIssuer),
    PairOnNetworkLongCommand(controller, credentialsIssuer),
    PairOnNetworkVendorCommand(controller, credentialsIssuer),
    PairOnNetworkCommissioningModeCommand(controller, credentialsIssuer),
    PairOnNetworkCommissionerCommand(controller, credentialsIssuer),
    PairOnNetworkDeviceTypeCommand(controller, credentialsIssuer),
    PairOnNetworkInstanceNameCommand(controller, credentialsIssuer),
  )
}

private fun getImCommands(
  controller: ChipDeviceController,
  credentialsIssuer: CredentialsIssuer
): List<Command> {
  return listOf(
    PairOnNetworkLongImReadCommand(controller, credentialsIssuer),
    PairOnNetworkLongImSubscribeCommand(controller, credentialsIssuer),
    PairOnNetworkLongImWriteCommand(controller, credentialsIssuer),
    PairOnNetworkLongImInvokeCommand(controller, credentialsIssuer),
  )
}

fun main(args: Array<String>) {
  val controller = ChipDeviceController(
    ControllerParams.newBuilder()
      .setUdpListenPort(0)
      .setControllerVendorId(0xFFF1)
      .setCountryCode("US")
      .build()
  )
  val credentialsIssuer = CredentialsIssuer()
  val commandManager = CommandManager()

  commandManager.register("discover", getDiscoveryCommands(controller, credentialsIssuer))
  commandManager.register("pairing", getPairingCommands(controller, credentialsIssuer))
  commandManager.register("im", getImCommands(controller, credentialsIssuer))

  try {
    commandManager.run(args)
  } catch (e: Exception) {
    println("Run command failed with exception: " + e.message)
    System.exit(1)
  }

  controller.shutdownCommissioning()
}
