#!/bin/bash
# deploy-orders.sh - Safe deploy for order system files
# Pulls production, diffs, deploys, and notifies Slack
#
# Usage:  ./scripts/deploy-orders.sh [file1 file2 ...]
#   No args = deploy all order files (detail.html, index.html, orders-data.js)
#   With args = deploy only specified files
#
# Requires:
#   - SSH alias 'mkl' configured
#   - Run from repo root or a worktree
#   - SLACK_DEPLOY_WEBHOOK in production server's .env (notifications sent via SSH)

set -euo pipefail

# ── Config ───────────────────────────────────────────────
REMOTE="mkl"
REMOTE_DIR="/var/www/html/mkl/orders"
ALL_FILES=("detail.html" "index.html" "orders-data.js")
TMP_DIR="/tmp/mkl-deploy-$$"

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

# ── Find repo root and local orders dir ──────────────────
# Works from worktrees or main repo
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
if [[ "$SCRIPT_DIR" == *".claude/worktrees"* ]]; then
    # Inside a worktree — go up to worktree root
    REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
else
    REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
fi
LOCAL_DIR="$REPO_ROOT/orders"

if [ ! -d "$LOCAL_DIR" ]; then
    echo -e "${RED}ERROR: orders/ directory not found at $LOCAL_DIR${NC}"
    exit 1
fi

# ── Determine files to deploy ────────────────────────────
if [ $# -gt 0 ]; then
    FILES=("$@")
else
    FILES=("${ALL_FILES[@]}")
fi

# ── Get deployer name from git ───────────────────────────
DEPLOYER=$(git config user.name 2>/dev/null || whoami)
BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown")

# ── Step 0: Check git is up to date ──────────────────────
echo -e "\n${CYAN}═══ MKL Order Deploy ═══${NC}\n"
git fetch origin main --quiet 2>/dev/null || true
LOCAL_SHA=$(git rev-parse HEAD 2>/dev/null || echo "unknown")
REMOTE_SHA=$(git rev-parse origin/main 2>/dev/null || echo "unknown")
if [ "$LOCAL_SHA" != "$REMOTE_SHA" ] && [ "$REMOTE_SHA" != "unknown" ]; then
    BEHIND=$(git rev-list HEAD..origin/main --count 2>/dev/null || echo "?")
    echo -e "${RED}WARNING: Your local repo is $BEHIND commit(s) behind origin/main.${NC}"
    echo -e "${RED}Run 'git pull origin main' first to avoid overwriting someone else's work.${NC}\n"
    read -p "$(echo -e ${YELLOW})Continue anyway? (y/N): $(echo -e ${NC})" CONFIRM
    if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
        echo -e "${RED}Aborted. Run 'git pull origin main' and try again.${NC}"
        exit 1
    fi
fi

# ── Step 1: Pull production files and diff ───────────────
echo -e "Deployer:  ${GREEN}$DEPLOYER${NC}"
echo -e "Branch:    ${GREEN}$BRANCH${NC}"
echo -e "Local dir: ${GREEN}$LOCAL_DIR${NC}"
echo -e "Files:     ${GREEN}${FILES[*]}${NC}\n"

mkdir -p "$TMP_DIR"
HAS_DIFF=false
DIFF_SUMMARY=""

for f in "${FILES[@]}"; do
    LOCAL_FILE="$LOCAL_DIR/$f"
    REMOTE_FILE="$TMP_DIR/$f"

    if [ ! -f "$LOCAL_FILE" ]; then
        echo -e "${RED}ERROR: Local file not found: $LOCAL_FILE${NC}"
        rm -rf "$TMP_DIR"
        exit 1
    fi

    echo -e "${CYAN}Pulling production $f ...${NC}"
    scp -q "$REMOTE:$REMOTE_DIR/$f" "$REMOTE_FILE" 2>/dev/null || {
        echo -e "${YELLOW}WARNING: Could not pull $f from server (new file?)${NC}"
        continue
    }

    # Diff
    if ! diff -q "$REMOTE_FILE" "$LOCAL_FILE" > /dev/null 2>&1; then
        CHANGES=$(diff "$REMOTE_FILE" "$LOCAL_FILE" | grep -c '^[<>]' || true)
        echo -e "  ${YELLOW}$f has $CHANGES changed lines${NC}"
        DIFF_SUMMARY="$DIFF_SUMMARY\n  $f: $CHANGES lines changed"
        HAS_DIFF=true

        # Check if server has changes we DON'T have
        # Compare server file against last git-committed version
        GIT_VERSION=$(git show HEAD:"orders/$f" 2>/dev/null || true)
        if [ -n "$GIT_VERSION" ]; then
            SERVER_VS_GIT=$(diff <(echo "$GIT_VERSION") "$REMOTE_FILE" | grep -c '^[<>]' 2>/dev/null || true)
            LOCAL_VS_GIT=$(diff <(echo "$GIT_VERSION") "$LOCAL_FILE" | grep -c '^[<>]' 2>/dev/null || true)

            if [ "$SERVER_VS_GIT" -gt 0 ] && [ "$SERVER_VS_GIT" != "$LOCAL_VS_GIT" ]; then
                echo -e "  ${RED}WARNING: Server $f has changes not in your local copy!${NC}"
                echo -e "  ${RED}Server has $SERVER_VS_GIT lines different from git HEAD${NC}"
                echo ""
                echo -e "  ${YELLOW}Diff (server vs your local):${NC}"
                diff --color=always "$REMOTE_FILE" "$LOCAL_FILE" | head -40 || true
                echo ""
                read -p "  $(echo -e ${RED})CONTINUE and overwrite server version? (y/N): $(echo -e ${NC})" CONFIRM
                if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
                    echo -e "\n${RED}Aborted. Server file saved at: $REMOTE_FILE${NC}"
                    echo -e "Merge manually, then re-run deploy.\n"
                    exit 1
                fi
            fi
        fi
    else
        echo -e "  ${GREEN}$f is identical to production${NC}"
    fi
done

if [ "$HAS_DIFF" = false ]; then
    echo -e "\n${GREEN}All files match production — nothing to deploy.${NC}\n"
    rm -rf "$TMP_DIR"
    exit 0
fi

# ── Step 2: Confirm deploy ───────────────────────────────
echo ""
read -p "$(echo -e ${CYAN})Deploy these files to production? (y/N): $(echo -e ${NC})" CONFIRM
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
    echo -e "${RED}Aborted.${NC}"
    rm -rf "$TMP_DIR"
    exit 1
fi

# ── Step 3: Deploy ───────────────────────────────────────
echo ""
DEPLOYED_FILES=""
for f in "${FILES[@]}"; do
    LOCAL_FILE="$LOCAL_DIR/$f"
    echo -e "${CYAN}Deploying $f ...${NC}"
    scp -q "$LOCAL_FILE" "$REMOTE:$REMOTE_DIR/$f"
    echo -e "  ${GREEN}Done${NC}"
    DEPLOYED_FILES="$DEPLOYED_FILES $f"
done

# ── Step 4: Slack notification (via production server) ────
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S %Z')

# Send notification from production server so every developer gets it
# without needing SLACK_DEPLOY_WEBHOOK in their local .env
SLACK_TEXT="*MKL Deploy — Orders*\n*Who:* $DEPLOYER\n*Branch:* \`$BRANCH\`\n*Files:*$DEPLOYED_FILES\n*Time:* $TIMESTAMP"

ssh -o ConnectTimeout=5 "$REMOTE" "
    WEBHOOK=\$(grep '^SLACK_DEPLOY_WEBHOOK=' /var/www/html/mkl/.env 2>/dev/null | cut -d'=' -f2- | tr -d '\"\\r')
    if [ -n \"\$WEBHOOK\" ]; then
        curl -s -X POST \"\$WEBHOOK\" \
            -H 'Content-Type: application/json' \
            -d '{\"text\": \"$SLACK_TEXT\"}' > /dev/null 2>&1
        echo 'OK'
    else
        echo 'NO_WEBHOOK'
    fi
" 2>/dev/null && SLACK_RESULT=$? || SLACK_RESULT=$?

if [ "${SLACK_RESULT:-1}" -eq 0 ]; then
    echo -e "\n${GREEN}Slack notification sent to #mkl-deploys${NC}"
else
    echo -e "\n${YELLOW}WARNING: Slack notification failed${NC}"
fi

# ── Step 4.5: Post-deploy smoke tests ────────────────────
echo -e "\n${CYAN}Running post-deploy smoke tests...${NC}"
if ssh -o ConnectTimeout=5 "$REMOTE" "cd /var/www/html/mkl && ./scripts/run-smoke-tests.sh --context=deploy" 2>&1; then
    echo -e "${GREEN}Smoke tests passed.${NC}"
else
    echo -e "${RED}WARNING: Smoke tests failed — check Slack #mkl for details.${NC}"
    echo -e "${YELLOW}Files are deployed. If the failure is real, roll back or forward-fix.${NC}"
fi

# ── Step 5: Write deploy SHA to production ─────────────────
DEPLOY_SHA=$(git rev-parse HEAD 2>/dev/null || echo "unknown")
if [ "$DEPLOY_SHA" != "unknown" ]; then
    ssh -o ConnectTimeout=5 "$REMOTE" "echo '$DEPLOY_SHA' > $REMOTE_DIR/.deploy-sha" 2>/dev/null || {
        echo -e "${YELLOW}WARNING: Could not write .deploy-sha to production${NC}"
    }
fi

# ── Cleanup ──────────────────────────────────────────────
rm -rf "$TMP_DIR"
echo -e "\n${GREEN}Deploy complete.${NC}\n"
