/*
 *   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.commands.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public final class CommandManager {
  private final ArrayList<Command> mCommandMgr = new ArrayList<Command>();
  private final Map<String, ArrayList<Command>> mClusters =
      new HashMap<String, ArrayList<Command>>();

  public final void register(String clusterName, ArrayList<Command> commandsList) {
    mClusters.put(clusterName, commandsList);
  }

  public final void run(String[] args) {
    Command command;

    if (args.length < 1) {
      System.out.println("Missing cluster name");
      showClusters();
      return;
    }

    ArrayList<Command> commands = mClusters.get(args[0]);
    if (commands == null) {
      System.out.println("Unknown cluster: " + args[0]);
      showClusters();
      return;
    }

    if (args.length < 2) {
      System.out.println("Missing command name");
      showCluster(args[0], commands);
      return;
    }

    if (!isGlobalCommand(args[0])) {
      command = getCommand(commands, args[1]);
      if (command == null) {
        System.out.printf("Unknown command: %s", args[1]);
        showCluster(args[0], commands);
        throw new IllegalArgumentException();
      }
    } else if (isEventCommand(args[1])) {
      if (args.length < 3) {
        System.out.println("Missing event name");
        showClusterEvents(args[0], args[1], commands);
        throw new IllegalArgumentException();
      }

      command = getGlobalCommand(commands, args[1], args[2]);
      if (command == null) {
        System.out.println("Unknown event: " + args[2]);
        showClusterEvents(args[0], args[1], commands);
        throw new IllegalArgumentException();
      }
    } else {
      if (args.length < 3) {
        System.out.println("Missing attribute name");
        showClusterAttributes(args[0], args[1], commands);
        throw new IllegalArgumentException();
      }

      command = getGlobalCommand(commands, args[1], args[2]);
      if (command == null) {
        System.out.println("Unknown attribute: " + args[2]);
        showClusterAttributes(args[0], args[1], commands);
        throw new IllegalArgumentException();
      }
    }

    // need skip over binary and command name and only get arguments
    String[] temp = Arrays.copyOfRange(args, 2, args.length);

    try {
      command.initArguments(temp.length, temp);
      command.run();
    } 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());
    }
  }

  private boolean isAttributeCommand(String commandName) {
    return commandName.equals("read")
        || commandName.equals("write")
        || commandName.equals("subscribe");
  }

  private boolean isEventCommand(String commandName) {
    return commandName.equals("read-event") || commandName.equals("subscribe-event");
  }

  private boolean isGlobalCommand(String commandName) {
    return isAttributeCommand(commandName) || isEventCommand(commandName);
  }

  private Command getCommand(ArrayList<Command> commands, String commandName) {
    for (Command command : commands) {
      if (commandName.equals(command.getName())) {
        return command;
      }
    }

    return null;
  }

  private Command getGlobalCommand(
      ArrayList<Command> commands, String commandName, String attributeName) {
    for (Command command : commands) {
      if (commandName.equals(command.getName()) && attributeName.equals(command.getAttribute())) {
        return command;
      }
    }

    return null;
  }

  private void showClusters() {
    System.out.println("Usage:");
    System.out.println("  java-matter-controller cluster_name command_name [param1 param2 ...]");
    System.out.println("\n");
    System.out.println(
        "  +-------------------------------------------------------------------------------------+");
    System.out.println(
        "  | Clusters:                                                                           |");
    System.out.println(
        "  +-------------------------------------------------------------------------------------+");

    for (String key : mClusters.keySet()) {
      System.out.printf("  | * %-82s|\n", key.toLowerCase());
    }

    System.out.println(
        "  +-------------------------------------------------------------------------------------+");
  }

  private void showCluster(String clusterName, ArrayList<Command> commands) {
    System.out.println("Usage:");
    System.out.println(
        "  java-matter-controller " + clusterName + " command_name [param1 param2 ...]");
    System.out.println("\n");
    System.out.println(
        "  +-------------------------------------------------------------------------------------+");
    System.out.println(
        "  | Commands:                                                                           |");
    System.out.println(
        "  +-------------------------------------------------------------------------------------+");
    boolean readCommand = false;
    boolean writeCommand = false;
    boolean subscribeCommand = false;
    boolean readEventCommand = false;
    boolean subscribeEventCommand = false;

    for (Command command : commands) {
      boolean shouldPrint = true;
      String cmdName = command.getName();
      if (isGlobalCommand(cmdName)) {
        if (cmdName.equals("read") && !readCommand) {
          readCommand = true;
        } else if (cmdName.equals("write") && !writeCommand) {
          writeCommand = true;
        } else if (cmdName.equals("subscribe") && !subscribeCommand) {
          subscribeCommand = true;
        } else if (cmdName.equals("read-event") && !readEventCommand) {
          readEventCommand = true;
        } else if (cmdName.equals("subscribe-event") && !subscribeEventCommand) {
          subscribeEventCommand = true;
        } else {
          shouldPrint = false;
        }
      }

      if (shouldPrint) {
        System.out.printf("  | * %-82s|\n", cmdName);
      }
    }
    System.out.println(
        "  +-------------------------------------------------------------------------------------+\n");
  }

  private void showClusterAttributes(
      String clusterName, String commandName, ArrayList<Command> commands) {
    System.out.println("Usage:");
    System.out.printf(
        "  java-matter-controller %s %s attribute-name [param1 param2 ...]\n",
        clusterName, commandName);
    System.out.println("\n");
    System.out.println(
        "  +-------------------------------------------------------------------------------------+");
    System.out.println(
        "  | Attributes:                                                                         |");
    System.out.println(
        "  +-------------------------------------------------------------------------------------+");
    for (Command command : commands) {
      if (commandName.equals(command.getName())) {
        System.out.printf("  | * %-82s|\n", command.getAttribute().get());
      }
    }
    System.out.println(
        "  +-------------------------------------------------------------------------------------+");
  }

  private void showClusterEvents(
      String clusterName, String commandName, ArrayList<Command> commands) {
    System.out.println("Usage:");
    System.out.printf(
        "  java-matter-controller %s %s event-name [param1 param2 ...]\n",
        clusterName, commandName);
    System.out.println("\n");
    System.out.println(
        "  +-------------------------------------------------------------------------------------+");
    System.out.println(
        "  | Events:                                                                             |");
    System.out.println(
        "  +-------------------------------------------------------------------------------------+");

    for (Command command : commands) {
      if (commandName.equals(command.getName())) {
        System.out.printf("  | * %-82s|\n", command.getAttribute().get());
      }
    }
    System.out.println(
        "  +-------------------------------------------------------------------------------------+");
  }
}
