/*
 *   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(
      CommandManager commandManager, CredentialsIssuer credentialsIssuer) {
    ArrayList<Command> clusterCommands = new ArrayList<Command>();
    DiscoverCommand discoverCommand = new DiscoverCommand(credentialsIssuer);
    DiscoverCommissionablesCommand discoverCommissionablesCommand =
        new DiscoverCommissionablesCommand(credentialsIssuer);
    DiscoverCommissionersCommand discoverCommissionersCommand =
        new DiscoverCommissionersCommand(credentialsIssuer);
    clusterCommands.add(discoverCommand);
    clusterCommands.add(discoverCommissionablesCommand);
    clusterCommands.add(discoverCommissionersCommand);

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

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