#!/bin/bash
set -e

if ! id classroom >/dev/null 2>&1; then
    adduser \
        --disabled-password \
        --gecos "" \
        classroom
fi

cat > /home/classroom/.bash_profile <<'PROFILE'
if [ -z "$WAYLAND_DISPLAY" ] && [ "${XDG_VTNR:-}" = "1" ]; then
    exec sway -c /etc/ekklesia-classroom/sway/config
fi
PROFILE

chown classroom:classroom /home/classroom/.bash_profile
chmod 0644 /home/classroom/.bash_profile

chmod 0755 /usr/local/bin/classroom-browser
chmod 0755 /usr/local/bin/classroom-window
chmod 0755 /usr/local/bin/classroom-dvd
chmod 0755 /usr/local/bin/classroom-dvd-session
chmod 0755 /usr/local/bin/classroom-dvd-css-setup
chmod 0755 /usr/local/bin/classroom-notify
chmod 0755 /usr/local/bin/classroom-notify-test
chmod 0755 /usr/local/bin/classroom-mqtt
chmod 0755 /usr/local/bin/classroom-notifications
chmod 0755 /usr/local/bin/classroom-scale
chmod 0755 /usr/local/bin/classroom-shutdown
chmod 0755 /usr/local/bin/classroom-chrome-setup
chmod 0755 /usr/local/bin/classroom-provision

# Reading the optical drive needs group cdrom. Takes effect at the next
# login, which the OTA reboot provides.
if getent group cdrom >/dev/null 2>&1; then
    adduser classroom cdrom >/dev/null 2>&1 || true
fi

if [ ! -f /etc/ekklesia-classroom/device.conf ]; then
    cat > /etc/ekklesia-classroom/device.conf <<'CONFIG'
# Ekklesia Classroom device configuration

UPDATE_URL=https://updates.riverofglorymn.org
CHANNEL=stable

# Set to true on classrooms that have a DVD drive.
DVD_ENABLED=false

# Size of the dock, clock and notifications, 0.8 to 1.5.
# Larger rooms and larger TVs want a larger number.
UI_SCALE=1.0

# Church message broker. The room is this machine's hostname unless ROOM
# is set. Leave MQTT_ENABLED=false until a broker exists.
MQTT_ENABLED=false
MQTT_HOST=
MQTT_PORT=1883
MQTT_USERNAME=
MQTT_PASSWORD=
CONFIG
fi

# Make the settings discoverable on classrooms installed before they
# existed. Both defaults are what those rooms already do, so nothing
# about their behaviour changes.
if ! grep -q '^DVD_ENABLED=' /etc/ekklesia-classroom/device.conf; then
    cat >> /etc/ekklesia-classroom/device.conf <<'CONFIG'

# Set to true on classrooms that have a DVD drive.
DVD_ENABLED=false
CONFIG
fi

if ! grep -q '^UI_SCALE=' /etc/ekklesia-classroom/device.conf; then
    cat >> /etc/ekklesia-classroom/device.conf <<'CONFIG'

# Size of the dock, clock and notifications, 0.8 to 1.5.
# Larger rooms and larger TVs want a larger number.
UI_SCALE=1.0
CONFIG
fi

if ! grep -q '^MQTT_ENABLED=' /etc/ekklesia-classroom/device.conf; then
    cat >> /etc/ekklesia-classroom/device.conf <<'CONFIG'

# Church message broker. The room is this machine's hostname unless ROOM
# is set. Leave MQTT_ENABLED=false until a broker exists.
MQTT_ENABLED=false
MQTT_HOST=
MQTT_PORT=1883
MQTT_USERNAME=
MQTT_PASSWORD=
CONFIG
fi

# The broker password lives here, so the file stops being world readable.
# Everything that reads it runs as root or as the classroom user.
chown root:classroom /etc/ekklesia-classroom/device.conf 2>/dev/null || true
chmod 0640 /etc/ekklesia-classroom/device.conf

systemctl daemon-reload || true

systemctl enable ekklesia-classroom-update.timer || true
systemctl start ekklesia-classroom-update.timer || true

# Google Chrome, and the DVD codecs when the room has a drive, are
# fetched by the provisioning service at the next boot.
#
# Deliberately enabled but not started here. It cannot run during this
# script anyway, because dpkg holds the apt lock throughout. Starting it
# straight afterwards would race the reboot that an OTA update performs
# the moment this install finishes, and an apt run killed by that reboot
# leaves dpkg half-configured. Every OTA reboots, so waiting for the next
# boot costs nothing and cannot corrupt anything.
#
# A failure there must never fail this installation.
systemctl enable ekklesia-classroom-provision.service || true

# Gives Chrome a chance to close properly on reboot, so its profile is
# not marked as crashed. Best effort: it must never hold a shutdown up.
systemctl enable ekklesia-classroom-shutdown.service || true

# The room's link to the church broker. Enabled always; it does nothing
# at all until a broker is configured in device.conf.
systemctl enable ekklesia-classroom-mqtt.service || true
systemctl restart ekklesia-classroom-mqtt.service || true
systemctl start ekklesia-classroom-shutdown.service || true

exit 0
