#!/bin/sh -e

# Load common script functions
. ../common-script.sh  
. ../common-service-script.sh

# Function to install packages based on the package manager
install_package() {
    PACKAGE=$1
    if ! command_exists "$PACKAGE"; then
        case "$PACKAGER" in
            pacman)
                "$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm "$PACKAGE"
                ;;
            apk)
                "$ESCALATION_TOOL" "$PACKAGER" add "$PACKAGE"
                ;;
            xbps-install)
                "$ESCALATION_TOOL" "$PACKAGER" -Sy "$PACKAGE"
                ;;
            *)
                "$ESCALATION_TOOL" "$PACKAGER" install -y "$PACKAGE"
                ;;
        esac
    else
        echo "$PACKAGE is already installed."
    fi
}       

# Function to setup and configure SSH
setup_ssh() {
    printf "%b\n" "${YELLOW}Setting up SSH...${RC}"

    # Detect package manager and install appropriate SSH package
    case "$PACKAGER" in
    apt-get|nala)
        install_package openssh-server
        SSH_SERVICE="ssh"
        ;;
    pacman)
        install_package openssh
        SSH_SERVICE="sshd"
        ;;
    apk)
        install_package openssh
        SSH_SERVICE="sshd"
        ;;
    xbps-install)
        install_package openssh
        SSH_SERVICE="sshd"
        ;;
    *)
        install_package openssh-server
        SSH_SERVICE="sshd"
        ;;
    esac

    startAndEnableService "$SSH_SERVICE"

    LOCAL_IP=$(ip -4 addr show | awk '/inet / {print $2}' | tail -n 1)

    printf "%b\n" "${GREEN}Your local IP address is: $LOCAL_IP${RC}"

    if isServiceActive "$SSH_SERVICE"; then
        printf "%b\n" "${GREEN}SSH is up and running.${RC}"
    else
        printf "%b\n" "${RED}Failed to start SSH.${RC}"
    fi
}

# Function to setup and configure Samba
setup_samba() {
    printf "%b\n" "${YELLOW}Setting up Samba...${RC}"
    
    # Install Samba if not installed
    install_package samba

    SAMBA_CONFIG="/etc/samba/smb.conf"

    if [ -f "$SAMBA_CONFIG" ]; then
        printf "%b\n" "${YELLOW}Samba configuration file already exists in $SAMBA_CONFIG.${RC}"
        printf "%b" "Do you want to modify the existing Samba configuration? (Y/n): "
        read -r MODIFY_SAMBA
        if [ "$MODIFY_SAMBA" = "Y" ] || [ "$MODIFY_SAMBA" = "y" ]; then
            "$ESCALATION_TOOL" "$EDITOR" "$SAMBA_CONFIG"
        fi
    else
        printf "%b\n" "${YELLOW}No existing Samba configuration found. Setting up a new one...${RC}"

        # Prompt user for shared directory path
        printf "%b" "Enter the path for the Samba share (default: /srv/samba/share): "
        read -r SHARED_DIR
        SHARED_DIR=${SHARED_DIR:-/srv/samba/share}

        # Create the shared directory if it doesn't exist
        "$ESCALATION_TOOL" mkdir -p "$SHARED_DIR"
        "$ESCALATION_TOOL" chmod -R 0777 "$SHARED_DIR"

        # Add a new Samba user
        printf "%b" "Enter Samba username: "
        read -r SAMBA_USER

        # Loop until the passwords match
        while true; do
            printf "Enter Samba password: "
            stty -echo
            read -r SAMBA_PASSWORD
            stty echo
            printf "Confirm Samba password: "
            stty -echo
            read -r SAMBA_PASSWORD_CONFIRM
            stty echo
            printf "\n"
            if [ "$SAMBA_PASSWORD" = "$SAMBA_PASSWORD_CONFIRM" ]; then
                printf "%b\n" "${GREEN}Passwords match.${RC}"
                break
            else
                printf "%b\n" "${RED}Passwords do not match. Please try again.${RC}"
            fi
        done

        # Add the user and set the password
        "$ESCALATION_TOOL" smbpasswd -a "$SAMBA_USER"

        # Configure Samba settings
        "$ESCALATION_TOOL" tee "$SAMBA_CONFIG" > /dev/null <<EOL
[global]
   workgroup = WORKGROUP
   server string = Samba Server
   security = user
   map to guest = bad user
   dns proxy = no

[Share]
   path = $SHARED_DIR
   browsable = yes
   writable = yes
   guest ok = no
   read only = no
   valid users = $SAMBA_USER
EOL
    fi

    for service in smb nmb; do
        startAndEnableService "$service"
    done

    if isServiceActive smb && isServiceActive nmb; then
        printf "%b\n" "${GREEN}Samba is up and running.${RC}"
        printf "%b\n" "${YELLOW}Samba share available at: $SHARED_DIR${RC}"
    else
        printf "%b\n" "${RED}Failed to start Samba.${RC}"
    fi
}

# Function to configure firewall (optional)
configure_firewall() {
    printf "%b\n" "${BLUE}Configuring firewall...${RC}"

    if command_exists ufw; then
        "$ESCALATION_TOOL" ufw allow OpenSSH
        "$ESCALATION_TOOL" ufw allow Samba
        "$ESCALATION_TOOL" ufw enable
        printf "%b\n" "${GREEN}Firewall configured for SSH and Samba.${RC}"
    else
        printf "%b\n" "${YELLOW}UFW is not installed. Skipping firewall configuration.${RC}"
    fi
}

setup_ssh_samba(){
    printf "%b\n" "Samba and SSH Setup Script"
    printf "%b\n" "--------------------------"
    clear

    # Display menu
    printf "%b\n" "Select an option:"
    printf "%b\n" "1. Setup SSH"
    printf "%b\n" "2. Setup Samba"
    printf "%b\n" "3. Configure Firewall"
    printf "%b\n" "4. Setup All"
    printf "%b\n" "5. Exit"

    printf "%b" "Enter your choice (1-5): "
    read -r CHOICE

    case "$CHOICE" in
        1)
            setup_ssh
            ;;
        2)
            setup_samba
            ;;
        3)
            configure_firewall
            ;;
        4)
            setup_ssh
            setup_samba
            configure_firewall
            ;;
        5)
            printf "%b\n" "${GREEN}Exiting.${RC}"
            exit 0
            ;;
        *)
            printf "%b\n" "${RED}Invalid choice. Please enter a number between 1 and 5.${RC}"
            exit 1
            ;;
    esac

    printf "%b\n" "${GREEN}Setup completed.${RC}"
}

checkEnv
checkEscalationTool
setup_ssh_samba
