/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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
 *
 *      https://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 org.apache.nlpcraft.model.tools.cmdline

import org.apache.commons.lang3.SystemUtils
import org.apache.nlpcraft.common.version.NCVersion
import org.apache.nlpcraft.common._
import java.lang.{IllegalStateException => ISE}

import java.io.File
import java.lang.management.ManagementFactory
import java.util.regex.Pattern

/**
 *
 */
class NCCliBase extends App {
    final val NAME = "NLPCraft CLI"

    protected final val NLPCRAFT_LOC_DIR = ".nlpcraft"

    /*
     * Disable warnings from Ignite on JDK 11.
     */
    final val JVM_OPTS_RT_WARNS = Seq (
        "-Dsun.stdout.encoding=UTF-8", // Fix for NLPCRAFT-343.
        "-Dsun.stderr.encoding=UTF-8", // Fix for NLPCRAFT-343.
        "-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2", // Fix for https://bugs.openjdk.java.net/browse/JDK-8213202
        "--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED",
        "--add-opens=java.base/sun.nio.ch=ALL-UNNAMED",
        "--add-opens=java.base/java.nio=ALL-UNNAMED",
        "--add-opens=java.base/java.io=ALL-UNNAMED",
        "--add-opens=java.base/java.util=ALL-UNNAMED",
        "--add-opens=java.base/java.lang=ALL-UNNAMED",
        "--add-opens=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED",
        "--add-opens=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED",
        "--add-opens=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED",
        "--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED",
        "--illegal-access=permit"
    )

    //noinspection RegExpRedundantEscape
    final val TAILER_PTRN = Pattern.compile("^.*\\[(\\s)*[\\d]+ms\\]\\s*NC[a-zA-Z0-9]+(\\s*)started\\.$")
    final val CMD_NAME = Pattern.compile("(^\\s*[\\w-]+)(\\s)")
    final val CMD_PARAM = Pattern.compile("(\\s)(--?[\\w-]+)")

    // Number of server and probe services that need to be started + 1 progress start.
    // Used for progress bar functionality.
    // +==================================================================+
    // | MAKE SURE TO UPDATE THIS VAR WHEN NUMBER OF SERVICES IS CHANGED. |
    // +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+
    final val NUM_SRV_SERVICES = 31 /*services*/ + 1 /*progress start*/
    final val NUM_PRB_SERVICES = 23 /*services*/ + 1 /*progress start*/
    // +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+
    // | MAKE SURE TO UPDATE THIS VAR WHEN NUMBER OF SERVICES IS CHANGED. |
    // +==================================================================+

    final val SRV_BEACON_PATH = s"$NLPCRAFT_LOC_DIR/server_beacon"
    final val PRB_BEACON_PATH = s"$NLPCRAFT_LOC_DIR/probe_beacon"
    final val HIST_PATH = s"$NLPCRAFT_LOC_DIR/.cli_history"

    final val DFLT_USER_EMAIL = "admin@admin.com"
    final val DFLT_USER_PASSWD = "admin"

    final val VER = NCVersion.getCurrent
    final val CP_WIN_NIX_SEPS_REGEX = "[:;]"
    final val CP_SEP = File.pathSeparator
    final val CP_SEP_CHAR = File.pathSeparatorChar
    final val PATH_SEP_CH = File.separatorChar
    final val PATH_SEP_STR = File.separator
    final val JAVA = U.sysEnv("NLPCRAFT_CLI_JAVA").getOrElse(new File(SystemUtils.getJavaHome, s"bin/java${if (SystemUtils.IS_OS_UNIX) "" else ".exe"}").getAbsolutePath)
    final val USR_WORK_DIR = U.notNull(SystemUtils.USER_DIR, "")
    final val USR_HOME_DIR = U.notNull(SystemUtils.USER_HOME, "")
    final val INSTALL_HOME = U.sysEnv("NLPCRAFT_CLI_INSTALL_HOME").getOrElse(USR_WORK_DIR)
    final val JAVA_CP = U.sysEnv("NLPCRAFT_CLI_CP").getOrElse(ManagementFactory.getRuntimeMXBean.getClassPath)
    final val SCRIPT_NAME = U.sysEnv("NLPCRAFT_CLI_SCRIPT").getOrElse(s"nlpcraft.${if (SystemUtils.IS_OS_UNIX) "sh" else "cmd"}")
    final val PROMPT = if (SCRIPT_NAME.endsWith("cmd")) ">" else "$"
    final val IS_SCRIPT = U.sysEnv("NLPCRAFT_CLI").isDefined
    final val T___ = "    "
    final val OPEN_BRK = Seq('[', '{', '(')
    final val CLOSE_BRK = Seq(']', '}', ')')
    final val BRK_PAIR = OPEN_BRK.zip(CLOSE_BRK).toMap ++ CLOSE_BRK.zip(OPEN_BRK).toMap // Pair for each open or close bracket.

    // See NCProbeMdo.
    case class Probe(
        probeToken: String,
        probeId: String,
        probeGuid: String,
        probeApiVersion: String,
        probeApiDate: String,
        osVersion: String,
        osName: String,
        osArch: String,
        startTstamp: Long,
        tmzId: String,
        tmzAbbr: String,
        tmzName: String,
        userName: String,
        javaVersion: String,
        javaVendor: String,
        hostName: String,
        hostAddr: String,
        macAddr: String,
        models: Array[ProbeModel]
    )

    // See NCProbeModelMdo.
    case class ProbeModel(
        id: String,
        name: String,
        version: String,
        elementIds: Array[String],
        enabledBuiltInTokens: Array[String]
    )

    case class ProbeAllResponse(
       probes: Array[Probe],
       status: String
    )

    private def help(cmd: Command): String = s"type $C'help --cmd=${cmd.name}'$RST to get help."

    case class SplitError(index: Int) extends Exception
    case class UnknownCommand(cmd: String) extends ISE(s"Unknown command ${c("'" + cmd + "'")}, type ${c("'help'")} to get help.")
    case class NoLocalServer() extends ISE(s"Local server not found, use $C'start-server'$RST command to start one.")
    case class NotSignedIn() extends ISE(s"Not signed in. Use ${c("'signin'")} command to sign in first.")
    case class NoLocalProbe() extends ISE(s"Local probe not found, use $C'start-probe'$RST command to start one.")
    case class HttpError(httpCode: Int) extends ISE(s"REST error (HTTP ${c(httpCode)}).")
    case class MalformedJson() extends ISE(s"Malformed JSON. ${c("Tip:")} on Windows make sure to escape double quotes.")
    case class TooManyArguments(cmd: Command) extends ISE(s"Too many arguments, ${help(cmd)}")
    case class NotEnoughArguments(cmd: Command) extends ISE(s"Not enough arguments, ${help(cmd)}")
    case class MissingParameter(cmd: Command, paramId: String) extends ISE( s"Missing mandatory parameter $C${"'" + cmd.params.find(_.id == paramId).get.names.head + "'"}$RST, ${help(cmd)}")
    case class MissingOptionalParameter(cmd: Command, paramId: String) extends ISE( s"Missing optional but required in this context parameter $C${"'" + cmd.params.find(_.id == paramId).get.names.head + "'"}$RST, ${help(cmd)}")
    case class MissingMandatoryJsonParameters(cmd: Command, missingParams: Seq[RestSpecParameter], path: String) extends ISE(s"Missing mandatory JSON parameters (${missingParams.map(s => y(s.name)).mkString(",")}) for $C${"'" + cmd.name + s" --path=$path'"}$RST, ${help(cmd)}")
    case class InvalidParameter(cmd: Command, paramId: String) extends ISE(s"Invalid parameter $C${"'" + cmd.params.find(_.id == paramId).get.names.head + "'"}$RST, ${help(cmd)}")
    case class InvalidJsonParameter(cmd: Command, param: String) extends ISE(s"Invalid JSON parameter $C${"'" + param + "'"}$RST, ${help(cmd)}")
}
