/*
 *   Copyright (c) 2022 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.*;
import java.util.ArrayList;

public class Main {
  private static void registerCommandsDiscover(
      ChipDeviceController controller,
      CommandManager commandManager,
      CredentialsIssuer credentialsIssuer) {
    ArrayList<Command> clusterCommands = new ArrayList<Command>();
    DiscoverCommand discoverCommand = new DiscoverCommand(controller, credentialsIssuer);
    DiscoverCommissionablesCommand discoverCommissionablesCommand =
        new DiscoverCommissionablesCommand(controller, credentialsIssuer);
    DiscoverCommissionersCommand discoverCommissionersCommand =
        new DiscoverCommissionersCommand(controller, credentialsIssuer);
    clusterCommands.add(discoverCommand);
    clusterCommands.add(discoverCommissionablesCommand);
    clusterCommands.add(discoverCommissionersCommand);

    commandManager.register("discover", clusterCommands);
  }

  private static void registerCommandsPairing(
      ChipDeviceController controller,
      CommandManager commandManager,
      CredentialsIssuer credentialsIssuer) {
    ArrayList<Command> clusterCommands = new ArrayList<Command>();
    UnpairCommand unpairCommand = new UnpairCommand(controller, credentialsIssuer);
    PairCodeCommand pairCodeCommand = new PairCodeCommand(controller, credentialsIssuer);
    PairCodePaseCommand pairCodePaseCommand =
        new PairCodePaseCommand(controller, credentialsIssuer);
    PairCodeWifiCommand pairCodeWifiCommand =
        new PairCodeWifiCommand(controller, credentialsIssuer);
    PairCodeThreadCommand pairCodeThreadCommand =
        new PairCodeThreadCommand(controller, credentialsIssuer);
    PairEthernetCommand pairEthernetCommand =
        new PairEthernetCommand(controller, credentialsIssuer);
    PairOnNetworkCommand pairOnNetworkCommand =
        new PairOnNetworkCommand(controller, credentialsIssuer);
    PairOnNetworkShortCommand pairOnNetworkShortCommand =
        new PairOnNetworkShortCommand(controller, credentialsIssuer);
    PairOnNetworkLongCommand pairOnNetworkLongCommand =
        new PairOnNetworkLongCommand(controller, credentialsIssuer);
    PairOnNetworkVendorCommand pairOnNetworkVendorCommand =
        new PairOnNetworkVendorCommand(controller, credentialsIssuer);
    PairOnNetworkCommissioningModeCommand pairOnNetworkCommissioningModeCommand =
        new PairOnNetworkCommissioningModeCommand(controller, credentialsIssuer);
    PairOnNetworkCommissionerCommand pairOnNetworkCommissionerCommand =
        new PairOnNetworkCommissionerCommand(controller, credentialsIssuer);
    PairOnNetworkDeviceTypeCommand pairOnNetworkDeviceTypeCommand =
        new PairOnNetworkDeviceTypeCommand(controller, credentialsIssuer);
    PairOnNetworkInstanceNameCommand pairOnNetworkInstanceNameCommand =
        new PairOnNetworkInstanceNameCommand(controller, credentialsIssuer);
    clusterCommands.add(unpairCommand);
    clusterCommands.add(pairCodeCommand);
    clusterCommands.add(pairCodePaseCommand);
    clusterCommands.add(pairCodeWifiCommand);
    clusterCommands.add(pairCodeThreadCommand);
    clusterCommands.add(pairEthernetCommand);
    clusterCommands.add(pairOnNetworkCommand);
    clusterCommands.add(pairOnNetworkShortCommand);
    clusterCommands.add(pairOnNetworkLongCommand);
    clusterCommands.add(pairOnNetworkVendorCommand);
    clusterCommands.add(pairOnNetworkCommissioningModeCommand);
    clusterCommands.add(pairOnNetworkCommissionerCommand);
    clusterCommands.add(pairOnNetworkDeviceTypeCommand);
    clusterCommands.add(pairOnNetworkInstanceNameCommand);

    commandManager.register("pairing", clusterCommands);
  }

  public static void main(String[] args) {
    ChipDeviceController controller =
        new ChipDeviceController(
            ControllerParams.newBuilder()
                .setUdpListenPort(0)
                .setControllerVendorId(0xFFF1)
                .build());

    CredentialsIssuer credentialsIssuer = new CredentialsIssuer();
    CommandManager commandManager = new CommandManager();

    registerCommandsDiscover(controller, commandManager, credentialsIssuer);
    registerCommandsPairing(controller, commandManager, credentialsIssuer);

    try {
      commandManager.run(args);
    } catch (IllegalArgumentException e) {
      System.out.println("Arguments init failed with exception: " + e.getMessage());
    } catch (Exception e) {
      System.out.println("Run command failed with exception: " + e.getMessage());
    }
    controller.shutdownCommissioning();
  }
}
