#!/usr/bin/env bash

set -euo pipefail

usage() {
  cat <<'EOF'
One-click deploy script for tidb-image-api:
  1) ECR login
  2) buildx multi-arch build and push
  3) kubectl apply k8s resources

Required environment variables:
  AWS_REGION          e.g. ap-southeast-1
  AWS_ACCOUNT_ID      e.g. 123456789012

Optional environment variables:
  ECR_REPO            default: tidb-image-api
  IMAGE_TAG           default: latest
  PLATFORMS           default: linux/amd64,linux/arm64
  BUILD_CONTEXT       default: .
  BUILDER_NAME        default: multiarch-builder
  K8S_NAMESPACE       default: pool
  SKIP_BUILD          default: false   (set true to skip build/push)
  SKIP_APPLY          default: false   (set true to skip kubectl apply)

Example:
  AWS_REGION=ap-southeast-1 \
  AWS_ACCOUNT_ID=xxx\
  ECR_REPO=tidb-image-api \
  IMAGE_TAG=v1.0.0 \
  ./scripts/deploy.sh
EOF
}

if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
  usage
  exit 0
fi

require_cmd() {
  local cmd="$1"
  if ! command -v "$cmd" >/dev/null 2>&1; then
    echo "ERROR: required command not found: $cmd" >&2
    exit 1
  fi
}

require_env() {
  local key="$1"
  if [[ -z "${!key:-}" ]]; then
    echo "ERROR: required environment variable is missing: $key" >&2
    exit 1
  fi
}

require_cmd aws
require_cmd docker
require_cmd kubectl

require_env AWS_REGION
require_env AWS_ACCOUNT_ID

ECR_REPO="${ECR_REPO:-tidb-image-api}"
IMAGE_TAG="${IMAGE_TAG:-latest}"
PLATFORMS="${PLATFORMS:-linux/amd64,linux/arm64}"
BUILD_CONTEXT="${BUILD_CONTEXT:-.}"
BUILDER_NAME="${BUILDER_NAME:-multiarch-builder}"
K8S_NAMESPACE="${K8S_NAMESPACE:-pool}"
SKIP_BUILD="${SKIP_BUILD:-false}"
SKIP_APPLY="${SKIP_APPLY:-false}"

ECR_REGISTRY="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com"
IMAGE_URI="${ECR_REGISTRY}/${ECR_REPO}:${IMAGE_TAG}"

echo ">>> Using image: ${IMAGE_URI}"

if [[ "${SKIP_BUILD}" != "true" ]]; then
  echo ">>> Ensuring ECR repository exists: ${ECR_REPO}"
  if ! aws ecr describe-repositories --repository-names "${ECR_REPO}" --region "${AWS_REGION}" >/dev/null 2>&1; then
    aws ecr create-repository --repository-name "${ECR_REPO}" --region "${AWS_REGION}" >/dev/null
  fi

  echo ">>> Logging in to ECR: ${ECR_REGISTRY}"
  aws ecr get-login-password --region "${AWS_REGION}" | docker login --username AWS --password-stdin "${ECR_REGISTRY}"

  echo ">>> Ensuring docker buildx builder exists: ${BUILDER_NAME}"
  if ! docker buildx inspect "${BUILDER_NAME}" >/dev/null 2>&1; then
    docker buildx create --name "${BUILDER_NAME}" --use >/dev/null
  else
    docker buildx use "${BUILDER_NAME}"
  fi
  docker buildx inspect --bootstrap >/dev/null

  echo ">>> Building and pushing multi-arch image: ${PLATFORMS}"
  docker buildx build \
    --platform "${PLATFORMS}" \
    -t "${IMAGE_URI}" \
    --push \
    "${BUILD_CONTEXT}"
else
  echo ">>> SKIP_BUILD=true, skip build and push."
fi

if [[ "${SKIP_APPLY}" != "true" ]]; then
  echo ">>> Applying Kubernetes manifests"
  kubectl apply -f k8s/all.yaml

  echo ">>> Updating deployment image to: ${IMAGE_URI}"
  kubectl -n "${K8S_NAMESPACE}" set image deployment/tidb-image-api api="${IMAGE_URI}" --record=false

  echo ">>> Waiting for deployment rollout"
  kubectl -n "${K8S_NAMESPACE}" rollout status deployment/tidb-image-api
else
  echo ">>> SKIP_APPLY=true, skip kubectl apply."
fi

echo ">>> Done."
