#!/bin/bash
# Install script for amazon-q module

set -o errexit
set -o pipefail

command_exists() {
  command -v "$1" > /dev/null 2>&1
}

# Inputs
ARG_INSTALL=${ARG_INSTALL:-true}
ARG_VERSION=${ARG_VERSION:-latest}
ARG_Q_INSTALL_URL=${ARG_Q_INSTALL_URL:-https://desktop-release.q.us-east-1.amazonaws.com}
ARG_AUTH_TARBALL=${ARG_AUTH_TARBALL:-}
ARG_AGENT_CONFIG=${ARG_AGENT_CONFIG:-}
ARG_AGENT_NAME=${ARG_AGENT_NAME:-default-agent}
ARG_MODULE_DIR_NAME=${ARG_MODULE_DIR_NAME:-.aws/.amazonq}
ARG_CODER_MCP_APP_STATUS_SLUG=${ARG_CODER_MCP_APP_STATUS_SLUG:-}
ARG_CODER_MCP_INSTRUCTIONS=${ARG_CODER_MCP_INSTRUCTIONS:-}
ARG_REPORT_TASKS=${ARG_REPORT_TASKS:-true}

mkdir -p "$HOME/$ARG_MODULE_DIR_NAME"

# Decode base64 inputs
ARG_AGENT_CONFIG_DECODED=""
if [ -n "$ARG_AGENT_CONFIG" ]; then
  ARG_AGENT_CONFIG_DECODED=$(echo -n "$ARG_AGENT_CONFIG" | base64 -d)
fi

ARG_CODER_MCP_INSTRUCTIONS_DECODED=""
if [ -n "$ARG_CODER_MCP_INSTRUCTIONS" ]; then
  ARG_CODER_MCP_INSTRUCTIONS_DECODED=$(echo -n "$ARG_CODER_MCP_INSTRUCTIONS" | base64 -d)
fi

echo "--------------------------------"
echo "install: $ARG_INSTALL"
echo "version: $ARG_VERSION"
echo "q_install_url: $ARG_Q_INSTALL_URL"
echo "agent_name: $ARG_AGENT_NAME"
echo "coder_mcp_app_status_slug: $ARG_CODER_MCP_APP_STATUS_SLUG"
echo "module_dir_name: $ARG_MODULE_DIR_NAME"
echo "auth_tarball_provided: ${ARG_AUTH_TARBALL}"
echo "report_tasks: ${ARG_REPORT_TASKS}"
echo "--------------------------------"

# Install Amazon Q if requested
function install_amazon_q() {
  if [ "$ARG_INSTALL" = "true" ]; then
    echo "Installing Amazon Q..."
    PREV_DIR="$PWD"
    TMP_DIR="$(mktemp -d)"
    cd "$TMP_DIR"

    ARCH="$(uname -m)"
    case "$ARCH" in
      "x86_64")
        Q_URL="${ARG_Q_INSTALL_URL}/${ARG_VERSION}/q-x86_64-linux.zip"
        ;;
      "aarch64" | "arm64")
        Q_URL="${ARG_Q_INSTALL_URL}/${ARG_VERSION}/q-aarch64-linux.zip"
        ;;
      *)
        echo "Error: Unsupported architecture: $ARCH. Amazon Q only supports x86_64 and arm64."
        exit 1
        ;;
    esac

    echo "Downloading Amazon Q for $ARCH from $Q_URL..."
    curl --proto '=https' --tlsv1.2 -sSf "$Q_URL" -o "q.zip"
    unzip q.zip
    ./q/install.sh --no-confirm
    cd "$PREV_DIR"
    rm -rf "$TMP_DIR"

    # Ensure binaries are discoverable; create stable symlink to q
    CANDIDATES=(
      "$(command -v q || true)"
      "$HOME/.local/bin/q"
    )
    FOUND_BIN=""
    for c in "${CANDIDATES[@]}"; do
      if [ -n "$c" ] && [ -x "$c" ]; then
        FOUND_BIN="$c"
        break
      fi
    done
    export PATH="$PATH:$HOME/.local/bin"
    echo "Installed Amazon Q at: $(command -v q || true) (resolved: $FOUND_BIN)"
  fi
}

# Extract authentication tarball
function extract_auth_tarball() {
  if [ -n "$ARG_AUTH_TARBALL" ]; then
    echo "Extracting auth tarball..."

    if ! command_exists zstd; then
      echo "Error: zstd is required to extract the authentication tarball but is not installed."
      echo "Please install zstd using the pre_install_script parameter."
      exit 1
    fi

    PREV_DIR="$PWD"
    echo "$ARG_AUTH_TARBALL" | base64 -d > /tmp/auth.tar.zst
    rm -rf ~/.local/share/amazon-q
    mkdir -p ~/.local/share/amazon-q
    cd ~/.local/share/amazon-q
    tar -I zstd -xf /tmp/auth.tar.zst
    rm /tmp/auth.tar.zst
    cd "$PREV_DIR"
    echo "Extracted auth tarball to ~/.local/share/amazon-q"
  else
    echo "Warning: No auth tarball provided. Amazon Q may require manual authentication."
  fi
}

# Configure MCP integration and create agent
function configure_agent() {
  # Create Amazon Q agent configuration directory
  AGENT_CONFIG_DIR="$HOME/.aws/amazonq/cli-agents"
  mkdir -p "$AGENT_CONFIG_DIR"
  ALLOWED_TOOLS="coder_get_workspace\,coder_create_workspace\,coder_list_workspaces\,coder_list_templates\,coder_template_version_parameters\,coder_get_authenticated_user\,coder_create_workspace_build\,coder_create_template_version\,coder_get_workspace_agent_logs\,coder_get_workspace_build_logs\,coder_get_template_version_logs\,coder_update_template_active_version\,coder_upload_tar_file\,coder_create_template\,coder_delete_template\,coder_workspace_bash"
  if [ -n "$ARG_AGENT_CONFIG_DECODED" ]; then
    echo "Applying custom MCP configuration..."
    # Use agent name as filename for the configuration
    echo "$ARG_AGENT_CONFIG_DECODED" > "$AGENT_CONFIG_DIR/${ARG_AGENT_NAME}.json"
    echo "Custom configuration saved to $AGENT_CONFIG_DIR/${ARG_AGENT_NAME}.json"
  fi
  if [ "$ARG_REPORT_TASKS" = "true" ]; then
    echo "Configuring Amazon Q to report tasks via Coder MCP..."
    q mcp add --name coder \
      --command "coder" \
      --agent "$ARG_AGENT_NAME" \
      --args "exp,mcp,server,--allowed-tools,coder_report_task,--instructions,'$ARG_CODER_MCP_INSTRUCTIONS_DECODED'" \
      --env "CODER_MCP_APP_STATUS_SLUG=${ARG_CODER_MCP_APP_STATUS_SLUG}" \
      --env "CODER_MCP_AI_AGENTAPI_URL=http://localhost:3284" \
      --env "CODER_AGENT_URL=${CODER_AGENT_URL}" \
      --env "CODER_AGENT_TOKEN=${CODER_AGENT_TOKEN}" \
      --force || echo "Warning: Failed to add Coder MCP server"
  else
    q mcp add --name coder \
      --command "coder" \
      --agent "$ARG_AGENT_NAME" \
      --args "exp,mcp,server,--allowed-tools,coder_report_task" \
      --env "CODER_AGENT_URL=${CODER_AGENT_URL}" \
      --env "CODER_AGENT_TOKEN=${CODER_AGENT_TOKEN}" \
      --force || echo "Warning: Failed to add Coder MCP server"
  fi
  echo "Added Coder MCP server into $ARG_AGENT_NAME in Amazon Q configuration"
  q settings chat.defaultAgent "$ARG_AGENT_NAME"
}

# Main execution
install_amazon_q
extract_auth_tarball
configure_agent

echo "Amazon Q installation and configuration complete!"
