#!/bin/bash

# Interactive setup script for Jelly Music App (JMA) server/user onboarding
# This script will prompt for all required info, then generate .env and docker-compose files in setup/

set -e

read -p "Enter a name for this server/user (e.g. girlfriend, friend1): " USERNAME
ENV_FILE="setup/.env.$USERNAME"
COMPOSE_FILE="setup/docker-compose.$USERNAME.yml"

read -p "Spotify Client ID: " SPOTIFY_CLIENT_ID
read -p "Spotify Client Secret: " SPOTIFY_CLIENT_SECRET
read -p "Jellyfin Server URL (e.g. https://your-jellyfin.com): " JELLYFIN_URL
read -p "Jellyfin API Key: " JELLYFIN_API_KEY
read -p "Music output directory (e.g. /app/downloads/$USERNAME): " OUTPUT_DIR
read -p "Playlist name (unique for this user/server): " PLAYLIST_NAME
read -p "M3U playlist path (e.g. $OUTPUT_DIR/playlists): " M3U_PLAYLIST_PATH
read -p "Backend port (default 5145): " BACKEND_PORT
BACKEND_PORT=${BACKEND_PORT:-5145}
read -p "Frontend port (default 5146): " FRONTEND_PORT
FRONTEND_PORT=${FRONTEND_PORT:-5146}

# Generate .env
cat > "$ENV_FILE" <<EOF
VITE_SERVER_URL=http://localhost:$FRONTEND_PORT
VITE_BACKEND_URL=http://localhost:$BACKEND_PORT
VITE_BACKEND_URL_PROD=https://music.samcloud.ca
VITE_FRONTEND_URL_PROD=https://music.samcloud.ca
SPOTIFY_CLIENT_ID=$SPOTIFY_CLIENT_ID
SPOTIFY_CLIENT_SECRET=$SPOTIFY_CLIENT_SECRET
JELLYFIN_URL=$JELLYFIN_URL
JELLYFIN_API_KEY=$JELLYFIN_API_KEY
OUTPUT_FORMAT=mp3
OUTPUT_DIR=$OUTPUT_DIR
LOG_LEVEL=INFO
WEBSOCKET_PORT=5144
NODE_ENV=production
PLAYLIST_NAME=$PLAYLIST_NAME
M3U_PLAYLIST_PATH=$M3U_PLAYLIST_PATH
EOF

echo ".env file created at $ENV_FILE"

# Generate docker-compose
cat > "$COMPOSE_FILE" <<EOF
version: "3.9"
services:
  backend-$USERNAME:
    build:
      context: ./server
    environment:
      - SPOTIFY_CLIENT_ID=$SPOTIFY_CLIENT_ID
      - SPOTIFY_CLIENT_SECRET=$SPOTIFY_CLIENT_SECRET
      - JELLYFIN_URL=$JELLYFIN_URL
      - JELLYFIN_API_KEY=$JELLYFIN_API_KEY
      - CLIENT_ID=$SPOTIFY_CLIENT_ID
      - CLIENT_SECRET=$SPOTIFY_CLIENT_SECRET
      - PORT=$BACKEND_PORT
      - HOST=0.0.0.0
      - PYTHONUNBUFFERED=1
      - FLASK_ENV=production
      - TRACK_OUTPUT='$OUTPUT_DIR/{artist}/{album} - ({year})/{artist} - {title}.{output-ext}'
      - ALBUM_OUTPUT='$OUTPUT_DIR/{artist}/{album} - ({year})/{artist} - {title}.{output-ext}'
      - PLAYLIST_OUTPUT='$OUTPUT_DIR/{list-name}/{artist}/{title}.{output-ext}'
      - ARTIST_OUTPUT='$OUTPUT_DIR/{artist}/{album} - ({year})/{artist} - {title}.{output-ext}'
      - TRIGGER_JELLYFIN_SCAN=True
      - GENERATE_M3U_PLAYLIST=True
      - M3U_PLAYLIST_NAME=$PLAYLIST_NAME
      - M3U_PLAYLIST_PATH=$M3U_PLAYLIST_PATH
      - ABSOLUTE_SERVER_PATH=$OUTPUT_DIR
      - EXTRA_LOGGING=True
    volumes:
      - ./music:/music
      - ./temp:/temp
      - ./server:/app
      - ./data:/data
      - ./logs:/app/logs
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "$BACKEND_PORT:$BACKEND_PORT"
    restart: unless-stopped
    networks:
      - app-network
    mem_limit: 1g
    cpus: 1.0
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:$BACKEND_PORT/status"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s

  ui-$USERNAME:
    build:
      context: .
      dockerfile: Dockerfile.ui
    environment:
      - VITE_SERVER_URL=http://localhost:$FRONTEND_PORT
      - VITE_BACKEND_URL=http://localhost:$BACKEND_PORT
      - VITE_BACKEND_URL_PROD=https://music.samcloud.ca
      - VITE_FRONTEND_URL_PROD=https://music.samcloud.ca
      - NODE_ENV=production
    volumes:
      - ./dist:/app/dist
    ports:
      - "$FRONTEND_PORT:$FRONTEND_PORT"
    command: sh -c "yarn build && serve -s dist -l $FRONTEND_PORT"
    restart: unless-stopped
    depends_on:
      - backend-$USERNAME
    networks:
      - app-network

networks:
  app-network:
    driver: bridge
EOF

echo "Docker Compose file created at $COMPOSE_FILE"

echo "\nSetup complete! Review your files in setup/, then run:"
echo "  docker-compose -f $COMPOSE_FILE up -d"
echo "\nYour app will be available at http://localhost:$FRONTEND_PORT"
