#!/bin/bash

set -euo pipefail

cleanup_fail()
{
  rm -rf /tmp/mura || true
}

rm -rf /tmp/mura
mkdir -p /tmp/mura
/usr/bin/galileo-mura-extractor > /tmp/mura/info.txt
display_serial=$(sed -n 's/.*Display Serial: \(.*\)/\1/p' < /tmp/mura/info.txt)
display_serial=${display_serial^^}
deck_serial=$(sed -n 's/.*Deck Serial: \(.*\)/\1/p' < /tmp/mura/info.txt)
deck_serial=${deck_serial^^}
manufacturer=$(sed -n 's/.*Manufacturer: \(.*\)/\1/p' < /tmp/mura/info.txt)

mura_base_path=/home/deck/.config/gamescope/mura
mkdir -p "$mura_base_path"

if [ "$manufacturer" != "SDC" ]; then
  echo "[galileo-mura] Not using mura correction for this unit as it is not SDC."
  cleanup_fail
  exit 1
fi

if galileo-mura-download "$display_serial" "$deck_serial" "$mura_base_path"; then
  rm -rf /tmp/mura
  mura_path="$mura_base_path/$display_serial"
  mkdir -p "$mura_path"
  mura_tar_file="$mura_base_path/$display_serial.tar"
  mura_json_file="$mura_path/$display_serial.json"
  if [ ! -f "$mura_json_file" ]; then
    tar -xf "$mura_tar_file" -C "$mura_path"
  fi
else
  tar -xf /tmp/mura/blob.tar -C /tmp/mura
  rm -rf /tmp/mura/blob.tar
  mura_path="/tmp/mura"
fi

if [ ! -f "$mura_path/$display_serial"_red.png ]; then
  echo "[galileo-mura] Missing mura images from tar, bailing out."
  cleanup_fail
  exit 1
fi

# Make sure that we have all the files.
# This script is pipefail so if these commands fail we will exit out.
ls "$mura_path/$display_serial"_red.png > /dev/null
ls "$mura_path/$display_serial"_green.png > /dev/null
ls "$mura_path/$display_serial".json > /dev/null

json_major_version=$(sed -n 's/.*"version" : "\([0-9]\)\..*"/\1/p' "$mura_path/$display_serial".json)
json_major_version="${json_major_version//[^[:digit:]]/}"

use_mura=0
if [ "$json_major_version" -ge 2 ]; then
  use_mura=1
fi

if [ "$use_mura" -eq 0 ]; then
  echo "[galileo-mura] Not using mura correction for this unit due to the mura version: \"$json_major_version\""
  cleanup_fail
  exit 1
fi

json_serial=$(sed -n 's/.*"serialNumber"\s*:\s*"\([^"]*\)".*/\1/p' "$mura_path/$display_serial".json)
if [[ "$display_serial" != "$json_serial" ]]; then
  echo "[galileo-mura] JSON serial didn't match display serial"
  cleanup_fail
  exit 1
fi

# Grody! No gamescopectl yet kskdsjsadjjksjkjsj
xprop -root -f GAMESCOPE_COLOR_MURA_CORRECTION_IMAGE 8s -set GAMESCOPE_COLOR_MURA_CORRECTION_IMAGE "$mura_path/$display_serial"

echo "[galileo-mura] Success! All good. Using mura at: $mura_path"

exit 0

