#!/bin/bash

# Configuration
BIND_CONF="/etc/bind/named.conf.local"
ZONES_DIR="/etc/bind/pri"
EXPECTED_NS="ns1.netvibes.ro ns2.netvibes.ro"
NVOSS_IP="185.163.109.101"

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

# Function to validate domain name format
validate_domain() {
    if [[ ! $1 =~ ^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$ ]]; then
        echo -e "${RED}Invalid domain name format.${NC}"
        exit 1
    fi
}

# Function to check if domain already exists in BIND config
domain_exists() {
    if grep -q "zone \"$1\"" "$BIND_CONF"; then
        echo -e "${RED}Domain $1 already exists in BIND configuration.${NC}"
        exit 1
    fi
}

# Function to verify nameservers
verify_nameservers() {
    local domain=$1
    local ns_list=$(whois $domain | grep -i 'name server' | awk '{print $NF}' | tr '[:upper:]' '[:lower:]' | sort | uniq)

    for expected_ns in $EXPECTED_NS; do
        if ! echo "$ns_list" | grep -q "$expected_ns"; then
            echo -e "${RED}Domain $domain does not use $expected_ns as a nameserver.${NC}"
            exit 1
        fi
    done
    echo -e "${GREEN}Nameserver verification passed for $domain.${NC}"
}

# Function to create MySQL database and user
create_database() {
    local domain=$1
    local db_name=$(echo $domain | cut -d. -f1)
    local password=$(pwgen -s 30 1)

    if [ "$echo_mode" = true ]; then
        echo -e "${YELLOW}[DRY-RUN] Would execute: lxc exec nvdb -- mysql -e \"CREATE DATABASE $db_name;\"${NC}"
        echo -e "${YELLOW}[DRY-RUN] Would execute: lxc exec nvdb -- mysql -e \"CREATE USER '$db_name'@'10.10.10.%' IDENTIFIED BY '$password';\"${NC}"
        echo -e "${YELLOW}[DRY-RUN] Would execute: lxc exec nvdb -- mysql -e \"GRANT ALL PRIVILEGES ON $db_name.* TO '$db_name'@'10.10.10.%';\"${NC}"
        echo -e "${YELLOW}[DRY-RUN] Would execute: lxc exec nvdb -- mysql -e \"FLUSH PRIVILEGES;\"${NC}"
    else
        lxc exec nvdb -- mysql -e "CREATE DATABASE $db_name;"
        lxc exec nvdb -- mysql -e "CREATE USER '$db_name'@'10.10.10.%' IDENTIFIED BY '$password';"
        lxc exec nvdb -- mysql -e "GRANT ALL PRIVILEGES ON $db_name.* TO '$db_name'@'10.10.10.%';"
        lxc exec nvdb -- mysql -e "FLUSH PRIVILEGES;"
    fi

    echo -e "${GREEN}Database $db_name created with user $db_name@10.10.10.%${NC}"
    echo -e "${YELLOW}Password: $password${NC}"
}

# Function to generate serial number
generate_serial() {
    local date_part=$(date +%Y%m%d)
    local increment=01
    local serial="${date_part}${increment}"

    if [ -f "$ZONES_DIR/$1.zone" ]; then
        local current_serial=$(awk '/SOA/ {print $7}' "$ZONES_DIR/$1.zone")
        if [ "${current_serial:0:8}" = "$date_part" ]; then
            increment=$(printf "%02d" $((10#${current_serial:8:2} + 1)))
            serial="${date_part}${increment}"
        fi
    fi

    echo $serial
}

# Function to create zone file
create_zone_file() {
    local domain=$1
    local serial=$2
    local configure_wp=$3

    if [ "$echo_mode" = true ]; then
        echo -e "${YELLOW}[DRY-RUN] Would create $ZONES_DIR/$domain.zone with content:${NC}"
        echo "\$TTL    86400"
        echo "@    IN    SOA    ns1.netvibes.ro. postmaster.$domain. ("
        echo "                  $serial    ; Serial"
        echo "                  43200      ; Refresh (12 hours)"
        echo "                  3600       ; Retry (1 hour)"
        echo "                  1209600    ; Expire (2 weeks)"
        echo "                  3600 )     ; Minimum (1 hour)"
        echo ""
        for ns in $EXPECTED_NS; do
            echo "@    IN    NS    $ns."
        done
        if [ "$configure_wp" = true ]; then
            echo "@    IN    A     $NVOSS_IP"
            echo "www  IN    CNAME @"
        fi
    else
        cat > "$ZONES_DIR/$domain.zone" << EOF
\$TTL    86400
@    IN    SOA    ns1.netvibes.ro. postmaster.$domain. (
                  $serial    ; Serial
                  43200      ; Refresh (12 hours)
                  3600       ; Retry (1 hour)
                  1209600    ; Expire (2 weeks)
                  3600 )     ; Minimum (1 hour)

EOF
        for ns in $EXPECTED_NS; do
            echo "@    IN    NS    $ns." >> "$ZONES_DIR/$domain.zone"
        done
        if [ "$configure_wp" = true ]; then
            echo "@    IN    A     $NVOSS_IP" >> "$ZONES_DIR/$domain.zone"
            echo "www  IN    CNAME @" >> "$ZONES_DIR/$domain.zone"
        fi
    fi
}

# Function to configure WordPress
configure_wordpress() {
    local domain=$1

    if [ "$echo_mode" = true ]; then
        echo -e "${YELLOW}[DRY-RUN] Would execute: lxc exec nvoss -- mkdir -p /var/www/$domain/{public,logs}/${NC}"
        echo -e "${YELLOW}[DRY-RUN] Would execute: lxc exec nvoss -- chown www-data:www-data -R /var/www/$domain/${NC}"
        echo -e "${YELLOW}[DRY-RUN] Would execute: lxc exec nvoss -- cp template_vhost.conf /etc/apache2/sites-available/$domain.conf${NC}"
        echo -e "${YELLOW}[DRY-RUN] Would execute: lxc exec nvoss -- sed -i \"s/TEMP.TLD/$domain/g\" /etc/apache2/sites-available/$domain.conf${NC}"
        echo -e "${YELLOW}[DRY-RUN] Would execute: lxc exec nvoss -- a2ensite $domain${NC}"
    else
        lxc exec nvoss -- mkdir -p /var/www/$domain/{public,logs}/
        lxc exec nvoss -- chown www-data:www-data -R /var/www/$domain/
        lxc exec nvoss -- cp template_vhost.conf /etc/apache2/sites-available/$domain.conf
        lxc exec nvoss -- sed -i "s/TEMP.TLD/$domain/g" /etc/apache2/sites-available/$domain.conf
        lxc exec nvoss -- a2ensite $domain
    fi

    echo -e "${GREEN}WordPress configuration for $domain completed.${NC}"
}

# Main script
if [ "$#" -lt 1 ]; then
    echo -e "${RED}Usage: $0 <domain> [-db] [-wp] [-echo]${NC}"
    exit 1
fi

domain=$1
shift

create_db=false
configure_wp=false
echo_mode=false

while [ "$#" -gt 0 ]; do
    case "$1" in
        -db) create_db=true ;;
        -wp) configure_wp=true ;;
        -echo) echo_mode=true ;;
        *) echo -e "${RED}Unknown option: $1${NC}"; exit 1 ;;
    esac
    shift
done

validate_domain "$domain"
domain_exists "$domain"
verify_nameservers "$domain"

serial=$(generate_serial "$domain")

# Add domain to BIND configuration
if [ "$echo_mode" = true ]; then
    echo -e "${YELLOW}[DRY-RUN] Would add to $BIND_CONF:${NC}"
    echo "zone \"$domain\" {"
    echo "    type master;"
    echo "    file \"$ZONES_DIR/$domain.zone\";"
    echo "};"
else
    echo "
zone \"$domain\" {
    type master;
    file \"$ZONES_DIR/$domain.zone\";
};" >> "$BIND_CONF"
fi

# Create zone file
create_zone_file "$domain" "$serial" "$configure_wp"

# Reload BIND
if [ "$echo_mode" = true ]; then
    echo -e "${YELLOW}[DRY-RUN] Would execute: systemctl reload bind9${NC}"
else
    if systemctl reload bind9; then
        echo -e "${GREEN}BIND9 configuration updated and reloaded successfully for domain: $domain${NC}"
    else
        echo -e "${RED}Failed to reload BIND9. Please check the configuration.${NC}"
        exit 1
    fi
fi

# Create database if -db flag is present
if $create_db; then
    create_database "$domain"
fi

# Configure WordPress if -wp flag is present
if $configure_wp; then
    configure_wordpress "$domain"
fi

echo -e "${GREEN}Script execution completed.${NC}"
