#!/bin/bash
# Reference Deployment Script Template
# Based on tbi-acc-hotel-mapping-service with all critical fixes

set -e

SERVICE_NAME="SERVICE_NAME"
NAMESPACE="NAMESPACE"
ENVIRONMENT="${DEPLOY_ENV:-dev}"
AWS_REGION="${AWS_REGION:-ca-central-1}"
TBI_ENVIRONMENTS_BRANCH="${TBI_ENVIRONMENTS_BRANCH:-master}"
HELM_S3_BUCKET="${HELM_S3_BUCKET:-tbi-charts}"

# Validate required environment variables
if [ -z "${CLUSTER_NAME}" ]; then
    echo "ERROR: CLUSTER_NAME environment variable is not set!"
    exit 1
fi

if [ -z "${AWS_ACCOUNT_ID}" ]; then
    echo "ERROR: AWS_ACCOUNT_ID environment variable is not set!"
    exit 1
fi

if [ -z "${GITHUB_TOKEN}" ]; then
    echo "ERROR: GITHUB_TOKEN environment variable is not set!"
    exit 1
fi

TBI_ENVIRONMENTS_REPO="https://github.com/redlabelvacations/tbi-environments.git"

# Read image tag from workspace
if [ -f "IMAGE_TAG" ]; then
    CHART_VERSION=$(cat IMAGE_TAG | tr -d '[:space:]')
else
    BASE_VERSION=$(cat VERSION | tr -d '[:space:]')
    CHART_VERSION="${BASE_VERSION}-${CIRCLE_BRANCH}-${CIRCLE_BUILD_NUM}"
fi

echo "=== Deployment Configuration ==="
echo "Service: ${SERVICE_NAME}"
echo "Namespace: ${NAMESPACE}"
echo "Environment: ${ENVIRONMENT}"
echo "Version: ${CHART_VERSION}"

# Package Helm chart
package_helm_chart() {
    echo "=== Packaging Helm chart ==="
    local chart_path="tbi-devops-environments/dev/${SERVICE_NAME}/charts/${SERVICE_NAME}"
    
    sed -i.bak "s|version:.*|version: ${CHART_VERSION}|g" ${chart_path}/Chart.yaml
    sed -i.bak "s|appVersion:.*|appVersion: \"${CHART_VERSION}\"|g" ${chart_path}/Chart.yaml
    rm -f ${chart_path}/Chart.yaml.bak
    
    mkdir -p /tmp/helm-charts
    helm package ${chart_path} -d /tmp/helm-charts
}

# Push chart to S3
push_chart_to_s3_repo() {
    echo "=== Pushing chart to S3 ==="
    local chart_file="/tmp/helm-charts/${SERVICE_NAME}-${CHART_VERSION}.tgz"
    helm s3 push ${chart_file} tbi-charts --force
}

# Clone tbi-environments
clone_tbi_environments() {
    echo "=== Cloning tbi-environments ==="
    if [ -d "/tmp/tbi-environments" ]; then
        rm -rf /tmp/tbi-environments
    fi
    # Authenticate via a credential helper (survives GitHub's redirect, unlike an
    # inline token in the URL), and persist it on the clone so the later push works.
    git -c credential.helper= \
        -c credential.helper='!f() { echo "username=x-access-token"; echo "password=${GITHUB_TOKEN}"; }; f' \
        clone "${TBI_ENVIRONMENTS_REPO}" /tmp/tbi-environments
    git -C /tmp/tbi-environments config credential.helper '!f() { echo "username=x-access-token"; echo "password=${GITHUB_TOKEN}"; }; f'
    cd /tmp/tbi-environments
    git checkout ${TBI_ENVIRONMENTS_BRANCH}
}

# Update requirements.yaml - CRITICAL
update_requirements() {
    echo "=== Updating requirements.yaml ==="
    local req_file="/tmp/tbi-environments/${ENVIRONMENT}/requirements.yaml"
    sed -i.bak "/name: ${SERVICE_NAME}/,/version:/ s|version:.*|version: ${CHART_VERSION}|" ${req_file}
    rm -f ${req_file}.bak
}

# Update values file
update_values_file() {
    echo "=== Updating values file ==="
    local values_file="/tmp/tbi-environments/${ENVIRONMENT}/values/${SERVICE_NAME}.yaml"
    local image_url="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${SERVICE_NAME}:${CHART_VERSION}"
    
    if grep -q "^image:" "${values_file}"; then
        sed -i.bak "s|^image:.*|image: ${image_url}|" ${values_file}
    else
        sed -i.bak "1 a\\
image: ${image_url}" ${values_file}
    fi
    rm -f ${values_file}.bak
}

# Commit and push - CRITICAL: Check for changes first
push_values_update() {
    echo "=== Pushing values update ==="
    cd /tmp/tbi-environments
    
    git config user.name "CircleCI Bot"
    git config user.email "circleci@tbidevelopment.ca"
    
    # Stage both files - CRITICAL
    git add ${ENVIRONMENT}/values/${SERVICE_NAME}.yaml
    git add ${ENVIRONMENT}/requirements.yaml
    
    # ✅ CHECK IF THERE ARE ANY CHANGES BEFORE COMMITTING
    if git diff --cached --quiet; then
        echo "ℹ️  No changes detected - values already up to date"
        echo "Skipping commit and continuing with deployment..."
    else
        git commit -m "Update ${SERVICE_NAME} to ${CHART_VERSION}

Deployed by CircleCI build #${CIRCLE_BUILD_NUM}
Branch: ${CIRCLE_BRANCH}
"
        git push origin ${TBI_ENVIRONMENTS_BRANCH}
        echo "✅ Values and requirements updated"
    fi
}

# Deploy service
deploy_service() {
    echo "=== Deploying ${SERVICE_NAME} ==="
    cd /tmp/tbi-environments
    
    helm secrets upgrade --install \
        --namespace ${NAMESPACE} ${SERVICE_NAME} \
        tbi-charts/${SERVICE_NAME} \
        --set cluster="${CLUSTER_NAME}" \
        --version ${CHART_VERSION} \
        --reset-values \
        -f ./${ENVIRONMENT}/common.yaml \
        -f ./${ENVIRONMENT}/secrets.common.yaml \
        -f ./${ENVIRONMENT}/values/${SERVICE_NAME}.yaml \
        -f ./${ENVIRONMENT}/secrets/secrets.${SERVICE_NAME}.yaml
    
    kubectl rollout status deployment/${SERVICE_NAME} -n ${NAMESPACE} --timeout=5m
}

# Main execution
package_helm_chart
helm repo add tbi-charts s3://${HELM_S3_BUCKET}/
push_chart_to_s3_repo
clone_tbi_environments
update_values_file
update_requirements
push_values_update
helm repo update
deploy_service

echo "=== Deployment Complete ==="
kubectl get deployment ${SERVICE_NAME} -n ${NAMESPACE}
kubectl get pods -n ${NAMESPACE} -l app=${SERVICE_NAME}
