#!/usr/bin/env bash
set -e

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Default values
REGISTRY="ghcr.io/dkam"
IMAGE_NAME="shelflife"
PUSH=false
VERSION=""

# Help function
show_help() {
    cat << EOF
Usage: bin/build [OPTIONS]

Build multi-architecture Docker images for ShelfLife

OPTIONS:
    -v, --version VERSION    Tag with specific version (e.g., v1.0.0)
    -p, --push              Push images to registry after building
    -r, --registry REGISTRY Registry (default: ghcr.io/dkam, or use 'dockerhub' for shelflife/shelflife)
    -h, --help              Show this help message

EXAMPLES:
    bin/build                           # Build latest only
    bin/build -v v1.0.0                # Build latest + v1.0.0 tags
    bin/build -v v1.0.0 -p             # Build and push both tags
    bin/build -p                       # Build and push latest
    bin/build -r dockerhub -p          # Push to Docker Hub instead of GitHub

REGISTRIES:
    GitHub Container Registry (default): ghcr.io/dkam/shelflife
    Docker Hub: shelflife/shelflife (use -r dockerhub)

VERSION DETECTION:
    If no version is specified, the script will:
    1. Check for VERSION environment variable
    2. Check for git tag on current commit
    3. Use branch name if not on main/master
    4. Default to 'latest' only

AUTHENTICATION:
    GitHub: docker login ghcr.io -u USERNAME -p GITHUB_TOKEN
    Docker Hub: docker login

EOF
}

# Parse command line arguments
while [[ $# -gt 0 ]]; do
    case $1 in
        -v|--version)
            VERSION="$2"
            shift 2
            ;;
        -p|--push)
            PUSH=true
            shift
            ;;
        -r|--registry)
            if [[ "$2" == "dockerhub" ]]; then
                REGISTRY="shelflife"
            else
                REGISTRY="$2"
            fi
            shift 2
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        *)
            echo -e "${RED}Unknown option: $1${NC}"
            show_help
            exit 1
            ;;
    esac
done

# Auto-detect version if not specified
if [[ -z "$VERSION" ]]; then
    # Check environment variable
    if [[ -n "$BUILD_VERSION" ]]; then
        VERSION="$BUILD_VERSION"
    # Check for git tag on current commit
    elif git describe --exact-match --tags HEAD 2>/dev/null; then
        VERSION=$(git describe --exact-match --tags HEAD)
    # Use branch name if not on main/master
    elif [[ $(git branch --show-current) != "main" && $(git branch --show-current) != "master" ]]; then
        BRANCH=$(git branch --show-current)
        VERSION="branch-$BRANCH"
    fi
fi

# Full image name
FULL_IMAGE="$REGISTRY/$IMAGE_NAME"

echo -e "${GREEN}Building ShelfLife Docker images...${NC}"
echo "Registry: $REGISTRY"
echo "Image: $IMAGE_NAME"
echo "Full name: $FULL_IMAGE"
echo "Git hash: $GIT_HASH"

if [[ -n "$VERSION" ]]; then
    echo "Version: $VERSION"
fi

echo "Push: $PUSH"
echo ""

# Create buildx builder if it doesn't exist
if ! docker buildx ls | grep -q "shelflife-builder"; then
    echo -e "${YELLOW}Creating buildx builder...${NC}"
    docker buildx create --name shelflife-builder --platform linux/amd64,linux/arm64
fi

# Use the builder
docker buildx use shelflife-builder

# Get git hash for additional tagging
GIT_HASH=$(git rev-parse --short HEAD)

# Build arguments
BUILD_ARGS=(
    "--platform" "linux/amd64,linux/arm64"
    "--tag" "$FULL_IMAGE:latest"
    "--tag" "$FULL_IMAGE:$GIT_HASH"
)

# Add version tag if specified
if [[ -n "$VERSION" ]]; then
    BUILD_ARGS+=("--tag" "$FULL_IMAGE:$VERSION")
fi

# Add push flag if requested
if [[ "$PUSH" == "true" ]]; then
    BUILD_ARGS+=("--push")
else
    BUILD_ARGS+=("--load")
fi

# Build the image
echo -e "${GREEN}Building image(s)...${NC}"
echo "Command: docker buildx build ${BUILD_ARGS[*]} ."
echo ""

docker buildx build "${BUILD_ARGS[@]}" .

echo ""
if [[ "$PUSH" == "true" ]]; then
    echo -e "${GREEN}✅ Images built and pushed successfully!${NC}"
    echo "Available tags:"
    echo "  - $FULL_IMAGE:latest"
    echo "  - $FULL_IMAGE:$GIT_HASH"
    if [[ -n "$VERSION" ]]; then
        echo "  - $FULL_IMAGE:$VERSION"
    fi
else
    echo -e "${GREEN}✅ Images built successfully!${NC}"
    echo "To push to registry, run:"
    echo "  bin/build --push"
    if [[ -n "$VERSION" ]]; then
        echo "  # or with version:"
        echo "  bin/build -v $VERSION --push"
    fi
fi

echo ""
echo -e "${YELLOW}To run the image:${NC}"
echo "  docker run -d -p 3000:80 -v shelflife_data:/rails/storage -e RAILS_MASTER_KEY=\$(cat config/master.key) --name shelflife $FULL_IMAGE:latest"