#!/bin/bash

# Caddy Reverse Proxy Installation Script for LXC Container on Proxmox
# Based on instructions from greenhome.stream documentation
# Author: Assistant
# Version: 1.3 - Added checks for existing GPG key and repository

# Color codes for output
RED='\033[0;31m'
GREEN='\033[0;32m'
ORANGE='\033[0;33m'
CYAN='\033[0;36m'    # Changed from BLUE to CYAN for better readability
YELLOW='\033[1;33m'  # For skip messages
NC='\033[0m' # No Color

# Function to display colored messages
print_message() {
    local color=$1
    local message=$2
    echo -e "${color}${message}${NC}"
}

# Function to display step status
print_step() {
    local step_num=$1
    local description=$2
    print_message $ORANGE "Βήμα ${step_num}: ${description}..."
    sleep 2
}

# Function to display success message
print_success() {
    local message=$1
    print_message $GREEN "✓ ${message} - Επιτυχής ολοκλήρωση!"
    sleep 2
}

# Function to display skip message
print_skip() {
    local message=$1
    print_message $YELLOW "⚠ ${message} - Παράλειψη βήματος!"
    sleep 2
}

# Function to display error message and exit
print_error() {
    local message=$1
    print_message $RED "✗ Σφάλμα: ${message}"
    exit 1
}

# Function to check if command was successful
check_command() {
    if [ $? -eq 0 ]; then
        print_success "$1"
    else
        print_error "$1 απέτυχε"
    fi
}

# Clear screen and show header
clear
print_message $CYAN "======================================"
print_message $CYAN "Caddy Reverse Proxy Installation Script"
print_message $CYAN "LXC Container on Proxmox"
print_message $CYAN "======================================"
echo
sleep 2

# Step 1: Update package repositories
print_step "1" "Ενημέρωση αποθετηρίων πακέτων"
apt update
check_command "Ενημέρωση αποθετηρίων"

# Step 2: Upgrade existing packages
print_step "2" "Αναβάθμιση υπαρχόντων πακέτων"
apt upgrade -y
check_command "Αναβάθμιση πακέτων"

# Step 3: Install required dependencies
print_step "3" "Εγκατάσταση απαραίτητων εξαρτήσεων"
apt install -y debian-keyring debian-archive-keyring curl
check_command "Εγκατάσταση εξαρτήσεων"

# Step 4: Check if Caddy GPG key already exists, then add if needed
print_step "4" "Έλεγχος και προσθήκη επίσημου GPG κλειδιού του Caddy"
GPG_KEY_PATH="/usr/share/keyrings/caddy-archive-keyring.gpg"

if [ -f "$GPG_KEY_PATH" ]; then
    print_skip "Το GPG κλειδί του Caddy υπάρχει ήδη στο σύστημα"
else
    print_message $ORANGE "Προσθήκη νέου GPG κλειδιού του Caddy..."
    curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-archive-keyring.gpg
    check_command "Προσθήκη GPG κλειδιού"
fi

# Step 5: Check if Caddy repository already exists, then add if needed
print_step "5" "Έλεγχος και προσθήκη αποθετηρίου Caddy"
REPO_FILE="/etc/apt/sources.list.d/caddy-stable.list"

if [ -f "$REPO_FILE" ]; then
    print_skip "Το αποθετήριο Caddy υπάρχει ήδη στο σύστημα"
else
    print_message $ORANGE "Προσθήκη νέου αποθετηρίου Caddy..."
    curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | \
    tee /etc/apt/sources.list.d/caddy-stable.list
    check_command "Προσθήκη αποθετηρίου"
fi

# Step 6: Update package repositories with new Caddy repo
print_step "6" "Ενημέρωση αποθετηρίων με το νέο αποθετήριο Caddy"
apt update
check_command "Ενημέρωση αποθετηρίων"

# Step 7: Install Caddy
print_step "7" "Εγκατάσταση Caddy"
apt install -y caddy
check_command "Εγκατάσταση Caddy"

# Step 8: Enable Caddy service
print_step "8" "Ενεργοποίηση υπηρεσίας Caddy"
systemctl enable caddy
check_command "Ενεργοποίηση υπηρεσίας"

# Step 9: Start Caddy service
print_step "9" "Εκκίνηση υπηρεσίας Caddy"
systemctl start caddy
check_command "Εκκίνηση υπηρεσίας"

# Step 10: Check Caddy service status
print_step "10" "Έλεγχος κατάστασης υπηρεσίας Caddy"
if systemctl is-active --quiet caddy; then
    print_success "Η υπηρεσία Caddy τρέχει κανονικά"
else
    print_error "Η υπηρεσία Caddy δεν τρέχει"
fi

# Step 11: Create basic Caddyfile configuration
print_step "11" "Δημιουργία βασικού αρχείου διαμόρφωσης Caddyfile"
cat > /etc/caddy/Caddyfile << 'EOF'
# The Caddyfile is an easy way to configure your Caddy web server.
#
# Unless the file starts with a global options block, the first
# uncommented line is always the address of your site.
#
# To use your own domain name (with automatic HTTPS), first make
# sure your domain's A/AAAA DNS records are properly pointed to
# this machine's public IP, then replace ":80" below with your
# domain name.

:80 {
    # Set this path to your site's directory.
    root * /usr/share/caddy

    # Enable the static file server.
    file_server

    # Another common task is to set up a reverse proxy:
    # reverse_proxy localhost:8080

    # Or serve a PHP site through php-fpm:
    # php_fastcgi localhost:9000
}

# Refer to the Caddy docs for more information:
# https://caddyserver.com/docs/caddyfile
EOF
check_command "Δημιουργία Caddyfile"

# Step 12: Set proper permissions for Caddyfile
print_step "12" "Ρύθμιση δικαιωμάτων για το Caddyfile"
chown root:root /etc/caddy/Caddyfile
chmod 644 /etc/caddy/Caddyfile
check_command "Ρύθμιση δικαιωμάτων"

# Step 13: Test Caddy configuration
print_step "13" "Έλεγχος διαμόρφωσης Caddy"
caddy validate --config /etc/caddy/Caddyfile
check_command "Έλεγχος διαμόρφωσης"

# Step 14: Reload Caddy with new configuration
print_step "14" "Επαναφόρτωση Caddy με νέα διαμόρφωση"
systemctl reload caddy
check_command "Επαναφόρτωση Caddy"

# Step 15: Display Caddy version
print_step "15" "Εμφάνιση έκδοσης Caddy"
caddy version
check_command "Εμφάνιση έκδοσης"

# Step 16: Display service status
print_step "16" "Εμφάνιση κατάστασης υπηρεσίας"
systemctl status caddy --no-pager -l
check_command "Εμφάνιση κατάστασης"

# Final success message
echo
print_message $GREEN "======================================"
print_message $GREEN "Η εγκατάσταση του Caddy ολοκληρώθηκε επιτυχώς!"
print_message $GREEN "======================================"
echo
print_message $CYAN "Σημαντικές πληροφορίες:"
print_message $CYAN "• Αρχείο διαμόρφωσης: /etc/caddy/Caddyfile"
print_message $CYAN "• Εντολή επαναφόρτωσης: systemctl reload caddy"
print_message $CYAN "• Εντολή επανεκκίνησης: systemctl restart caddy"
print_message $CYAN "• Logs: journalctl -u caddy"
print_message $CYAN "• Το Caddy τρέχει στην πόρτα 80 (HTTP)"
echo
print_message $ORANGE "Για να διαμορφώσετε reverse proxy:"
print_message $ORANGE "1. Επεξεργαστείτε το /etc/caddy/Caddyfile"
print_message $ORANGE "2. Προσθέστε την διαμόρφωση reverse_proxy"
print_message $ORANGE "3. Εκτελέστε: systemctl reload caddy"
echo
print_message $GREEN "Το σύστημα είναι έτοιμο για χρήση!"