#!/usr/bin/env bash

# Exit immediately if a command exits with a non-zero exit status
set -e

echo -n Hostname :
read -r HOSTNAME

echo -n Domain name :
read -r DOMAIN_NAME

echo -n Username :
read -r USERNAME

echo Password :
read -r -s PASSWORD

echo MYSQL_ROOT_PASSWORD ? :
read -r -s MYSQL_ROOT_PASSWORD

echo MYSQL_PASSWORD ? :
read -r -s MYSQL_PASSWORD

echo Pihole admin password ? :
read -r -s PIHOLE_PASSWORD

# Setup the hostname
hostnamectl hostname "$HOSTNAME"

# Enable pacman's parallels downloads
sed -i 's/^#Para/Para/g' /etc/pacman.conf

# Updating every packages
pacman -Syu --noconfirm
# Removing unwanted packages
pacman -Rc --noconfirm nano vim vim-runtime sudo
# Installing needed packages
pacman -S --noconfirm --needed docker neovim lazygit neofetch git wget unzip openssh bash-completion reflector \
	rsync nodejs npm python python-pip ripgrep htop opendoas which man sed fakeroot gcc flake8 autopep8 \
	python-pynvim

# Installing npm dependencies
npm i -g neovim npm-check-updates

# Enable the wheel group to use doas
echo 'permit persist :wheel' > /etc/doas.conf

# Enabling docker
systemctl enable docker
systemctl start docker

# Setup SSH
echo 'Port 777
AddressFamily inet
ChallengeResponseAuthentication no
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
PermitEmptyPasswords no
PermitRootLogin no
UsePAM no
PrintMotd no
Subsystem sftp /usr/lib/ssh/sftp-server
' > /etc/ssh/sshd_config
systemctl restart sshd

# Disable systemctl resolved
systemctl stop systemd-resolved
systemctl disable systemd-resolved

# Adding personnal account
useradd -m "$USERNAME"
passwd "$USERNAME" << EOF
$PASSWORD
$PASSWORD
EOF
usermod -aG wheel "$USERNAME"
usermod -aG docker "$USERNAME"
usermod -aG wheel root

user_exec(){
	# Adding personnal SSH public key
	mkdir ~/.ssh ~/aur git services
	echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC6nIqEuVlD6ouHf2OmhN5+gP3qP31+Z5x7+2GKLstTzkLo1wFUGQKsAgeAA3r47xXkUznSt0BHi7J6yaAJ7q2oSNxwbH73hemLlbQGAMkjRpvM4wL2jvVVBnILUMqLlzwEqBPlygng3DkT/KGTAcmWrt6kh/TV6npH4bf2LV7Z6g7YB9usmaJPTmw53/lQaDDxkMw7aYgDRc2oQwjZNOZ/uzb3IenvRyXfmegWYLHemiajtuj3e/Z7XRcJLhMp5XYQaPpy7RdkpBNiA7fIrITrXcjK+K71NGXLHRB8Ert5y8SzMs5gu3iOA4JnfcDnpdXyo1USduDDkDjH+N9ggQdaSXUmHCI3P1x1IJN56X0F20u287E/bMGApPiF4mkL5xbJdjZMKDgodm1QNdbBNu4vw4nm13TOM/neqPKcs+gzgPe/50gad2KOGoU+MQwPB2JA/vX9UGHUDTYkn4cmLeDR97OUq94yYZTJX3vMEKMxM9reZ/FR9pcdFvGWme46R1styyZExbPqLPA8b/FjX08USDE4aIDyi0GUHwx+exfdneFWm3yZ/G4XUENlKP3mlzPZql90sJu/ERdUX8fFZfJKdhjH0Q26SYJbD30Oh62IpUEoLFVovbhXO7r8nxgXoAgp7ArwZS2vv5P4xJt4I7gzFxS3cw/K9IOo4TXuXprfmQ== SAUNDERS@DESKTOP-95BAQ8S' > ~/.ssh/authorized_keys

	# Installing lazydocker
	git clone https://aur.archlinux.org/lazydocker.git ~/aur/lazydocker
	cd ~/aur/lazydocker
	makepkg -sri --noconfirm
	rm -rf ~/go

	# Adding dotfiles
	git clone https://github.com/saundersp/dotfiles.git ~/git/dotfiles
	cd ~/git/dotfiles
	./auto.sh server
	sudo bash auto.sh server

	# Adding portfolio
	git clone https://github.com/saundersp/portfolio.git ~/git/portfolio
	cd ~/git/portfolio
	docker pull node:lts-alpine
	docker build -f Dockerfile.no_ssl -t saundersp/portfolio .

	# Setup the services used in the server
	cd ~/services
	echo -e "MYSQL_PASSWORD=$MYSQL_PASSWORD\nMYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD" > .env
	echo 'nextcloud mariadb vaultwarden/server pihole/pihole caddy/caddy:alpine' | xargs -n1 docker pull

	mkdir bitwarden-data caddy mariadb-data nextcloud-data openvpn-etc pihole caddy/config caddy/data caddy/etc

	# Setup caddy
	echo "$DOMAIN_NAME {
	handle_path /bitwarden* {
		reverse_proxy /notifications/hub/negotiate localhost:8080
		reverse_proxy /notifications/hub localhost:3012
		reverse_proxy localhost:8080
	}
	handle_path /pihole* {
		reverse_proxy localhost:8082
		route /* {
			reverse_proxy localhost:8082
		}
	}
	handle_path /nextcloud* {
		rewrite /.well-known/carddav /remote.php/dav
		rewrite /.well-known/caldav /remote.php/dav

		header /* {
			Script-Transport-Security max-age=15552000;
		}

		reverse_proxy localhost:8084
		route /* {
			reverse_proxy localhost:8084
		}
	}
	reverse_proxy localhost:8081
}" > caddy/Caddyfile

	# Getting the docker-compose.yml ready
	echo 'version: "3.9"

services:
  portfolio:
    image: saundersp/portfolio:latest
    restart: unless-stopped
    ports:
      - 8081:80

  pihole:
    image: cbcrowe/pihole-unbound:latest
    restart: unless-stopped
    ports:
      - 53:53/tcp
      - 53:53/udp
      - 8082:80/tcp
    volumes:
      - ./pihole/data:/etc/pihole
      - ./pihole/dnsmasq.d:/etc/dnsmasq.d
    environment:
      - ServerIP=127.0.0.1
      - TZ=Europe/London
      - REV_SERVER=true
      - REV_SERVER_TARGET=192.168.1.1
      - REV_SERVER_DOMAIN=local
      - REV_SERVER_CIDR=192.168.0.0/16
      - DNS1=127.0.0.1#5335
      - DNS2=127.0.0.1#5335
      - DNSSEC="true"

# NOTE Get rid of "reducing DNS packet size for nameserver ..." : echo "edns-packet-max=1232" | sudo tee /etc/dnsmasq.d/99-edns.conf

  bitwarden:
    image: vaultwarden/server:latest
    restart: unless-stopped
    ports:
      - 8080:80
    volumes:
      - ./bitwarden-data:/data

  mariadb:
    image: mariadb:latest
    restart: unless-stopped
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --innodb-file-per-table=1 --skip-innodb-read-only-compressed
    volumes:
      - ./mariadb-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  nextcloud:
    image: nextcloud:latest
    restart: unless-stopped
    ports:
      - 8084:80
    volumes:
      - ./nextcloud-data:/var/www/html
    environment:
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=mariadb
      - APACHE_DISABLE_REWRITE_IP=1
    links:
      - mariadb

# NOTE To setup a primary install :
# add "overwriteprotocol => https" to config/config.php
# add "overwritewebroot => /nextcloud" to config/config.php

  caddy:
    image: caddy/caddy:alpine
    restart: unless-stopped
    network_mode: "host"
    volumes:
      - ./caddy/data:/data
      - ./caddy/config:/config
      - ./caddy/etc:/root/.local/share/caddy
      - ./caddy/Caddyfile:/etc/caddy/Caddyfile
' > docker-compose.yml
	docker-compose up -d
	sleep 15

	# Setup nextcloud web root
	sudo sed -i "3a\ \  'overwriteprotocol' => 'https',\n\ \ 'overwritewebroot' => '/nextcloud'," nextcloud-data/config/config.php
	docker-compose restart nextcloud

	# Setup pihole
	docker-compose exec pihole pihole -a -p "$PIHOLE_PASSWORD"
	docker-compose exec pihole sqlite3 /etc/pihole/gravity.db '
		INSERT INTO "adlist" ("address","enabled","comment") VALUES ("https://raw.githubusercontent.com/jdlingyu/ad-war","1","Advertising Lists 1"),
		("https://adaway.org/hosts.txt","1","Advertising Lists 2"),
		("https://v.firebog.net/hosts/AdguardDNS.txt","1","Advertising Lists 3"),
		("https://v.firebog.net/hosts/Admiral.txt","1","Advertising Lists 4"),
		("https://raw.githubusercontent.com/anudeepND/blacklist/master/adservers.txt","1","Advertising Lists 5"),
		("https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt","1","Advertising Lists 6"),
		("https://v.firebog.net/hosts/Easylist.txt","1","Advertising Lists 7"),
		("https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext","1","Advertising Lists 8"),
		("https://raw.githubusercontent.com/FadeMind/hosts.extras/master/UncheckyAds/hosts","1","Advertising Lists 9"),
		("https://raw.githubusercontent.com/bigdargon/hostsVN/master/hosts","1","Advertising Lists 10");'
	docker-compose exec pihole pihole -g
}
export -f user_exec
su "$USERNAME" -c user_exec

# Removing the nopass option in doas
sed -i '1s/nopass/persist/g' /etc/doas.conf