#!/bin/bash

# 5,20,35,50 * * * * $HOME/userfiles/sql/hpr_db_backup.bash >> $HOME/userfiles/sql/cron.log 2>&1 &

# https://hackerpublicradio.org/hpr.sql.rss

#TODO
#add a rss feed with the latest updates. Linking to the changes on gittea.
# run that every 5 minutes and then if there is a change sleep 5 and confirm there has been no change since.
# Then download the db and regenerate the site.
# While making sure to generate the site at least once a day 
# check the skip-extended-insert export into of the sql into git, so that the small diffs show up.
# generate a rss feed with the latest changes.
# update all the other scripts reserve, stats etc.


sql_save_dir="$HOME/userfiles/sql"
credential_file="${sql_save_dir}/.my-hpr.cnf"
last_update_txt="${sql_save_dir}/last_update.txt"
hpr_full_sql="${sql_save_dir}/hpr_hpr_full.sql"
hpr_site_sql="${sql_save_dir}/hpr.sql"
full_mysqldump_sql="${sql_save_dir}/mysqldump.sql"
hpr_database_file="hackerpublicradio.org/public_html/hpr.sql"

sync_delay_seconds="300" # 5 minutes

last_update_query="SELECT
  update_time
FROM
  information_schema.tables tab
WHERE
  update_time > (current_timestamp() - interval 30 day)
  AND table_type = 'BASE TABLE'
  AND table_name not in ('reservations')
  AND table_schema not in ('information_schema', 'sys', 'performance_schema', 'mysql')
ORDER BY
  update_time DESC
LIMIT 1;"

if [ ! -s "${credential_file}" ]
then
  echo "The file \"${credential_file}\" is missing"
  exit 
fi

local_db_last_update_epoch="0"
if [ -s "${last_update_txt}" ]
then
  echo "Found the last update file \"${last_update_txt}\""
  local_db_last_update_iso8601="$( \date --utc --date="$( cat ${last_update_txt} )" +%Y-%m-%dT%H:%M:%SZ )"
  local_db_last_update_epoch="$( \date --utc --date="$( cat ${last_update_txt} )" +%s )"
  echo -e "Local DB update time is\t${local_db_last_update_iso8601} (${local_db_last_update_epoch})"
fi

live_db_last_update_iso8601="$( mysql --defaults-file="${credential_file}" --disable-column-names --batch --execute="${last_update_query}" | sed -e 's/ /T/g' -e 's/$/Z/g' )"
if [ -z "${live_db_last_update_iso8601}" ]
then
  echo "The live db update time \"live_db_last_update_iso8601\" is missing"
  exit 1
fi

live_db_last_update_epoch="$( \date --utc --date="${live_db_last_update_iso8601}" +%s )"
if [ -z "${live_db_last_update_epoch}" ]
then
  echo "The live db update time \"live_db_last_update_epoch\" is missing"
  exit 2
fi

echo -e "Live DB update time is\t${live_db_last_update_iso8601} (${live_db_last_update_epoch})"

if [ "${local_db_last_update_epoch}" -eq "${live_db_last_update_epoch}" ]
then
  echo "No changes detected. Skipping export."
  exit 0
fi

echo "Starting export full with -complete-insert."
if [ -s "${hpr_full_sql}" ]
then
  hpr_full_sql_write_time_iso8601="$( \date --utc --date="$( ls -al --full-time "${hpr_full_sql}" | awk '{print $6, $7, $8}' )" +%Y-%m-%dT%H:%M:%SZ )"
  hpr_full_sql_write_time_epoch="$( \date --utc --date="${hpr_full_sql_write_time_iso8601}" +%s )"
  if [ -z "${hpr_full_sql_write_time_epoch}" ]
  then
    echo "The live db update time \"hpr_full_sql_write_time_epoch\" is missing"
    exit 3
  fi
  echo -e "Full DB write time is\t${hpr_full_sql_write_time_iso8601} (${hpr_full_sql_write_time_epoch})"

  hpr_full_sql_write_time_with_delay_epoch="$(( ${hpr_full_sql_write_time_epoch} + ${sync_delay_seconds} ))"
  time_now_epoch="$( \date --utc +%s )"

  if [ "${hpr_full_sql_write_time_with_delay_epoch}" -gt "${time_now_epoch}" ]
  then
    echo "Skipping export. The Database has been recently created \"${hpr_full_sql_write_time_iso8601}\". Try again after $( \date --utc --date="@${hpr_full_sql_write_time_with_delay_epoch}" +%Y-%m-%dT%H:%M:%SZ )."
    exit 4
  fi
fi
mysqldump --defaults-file="${credential_file}" --tz-utc --add-drop-database --extended-insert --complete-insert --skip-extended-insert --default-character-set=utf8 --single-transaction --skip-set-charset --databases hpr_hpr > "${hpr_full_sql}"
tail "${hpr_full_sql}" | grep 'Dump completed on'

echo "Starting export full for static site generation."
if [ -s "${hpr_site_sql}" ]
then
  hpr_site_sql_write_time_iso8601="$( \date --utc --date="$( ls -al --full-time "${hpr_site_sql}" | awk '{print $6, $7, $8}' )" +%Y-%m-%dT%H:%M:%SZ )"
  hpr_site_sql_write_time_epoch="$( \date --utc --date="${hpr_site_sql_write_time_iso8601}" +%s )"
  if [ -z "${hpr_site_sql_write_time_epoch}" ]
  then
    echo "The live db update time \"hpr_site_sql_write_time_epoch\" is missing"
    exit 5
  fi
  echo -e "Full DB write time is\t${hpr_site_sql_write_time_iso8601} (${hpr_site_sql_write_time_epoch})"

  hpr_site_sql_write_time_with_delay_epoch="$(( ${hpr_site_sql_write_time_epoch} + ${sync_delay_seconds} ))"
  time_now_epoch="$( \date --utc +%s )"

  if [ "${hpr_site_sql_write_time_with_delay_epoch}" -gt "${time_now_epoch}" ]
  then
    echo "Skipping export. The Database has been recently created \"${hpr_site_sql_write_time_iso8601}\". Try again after $( \date --utc --date="@${hpr_site_sql_write_time_with_delay_epoch}" +%Y-%m-%dT%H:%M:%SZ )."
    exit 6
  fi
fi
mysqldump --defaults-file="${credential_file}" --tz-utc --add-drop-database --complete-insert --extended-insert --default-character-set=utf8 --single-transaction --skip-set-charset --databases hpr_hpr --ignore-table=hpr_hpr.reservations > "${hpr_site_sql}"
tail "${hpr_site_sql}" | grep 'Dump completed on'

echo "Starting export full for data recovery."
if [ -s "${full_mysqldump_sql}" ]
then
  full_mysqldump_sql_write_time_iso8601="$( \date --utc --date="$( ls -al --full-time "${full_mysqldump_sql}" | awk '{print $6, $7, $8}' )" +%Y-%m-%dT%H:%M:%SZ )"
  full_mysqldump_sql_write_time_epoch="$( \date --utc --date="${full_mysqldump_sql_write_time_iso8601}" +%s )"
  if [ -z "${full_mysqldump_sql_write_time_epoch}" ]
  then
    echo "The live db update time \"full_mysqldump_sql_write_time_epoch\" is missing"
    exit 5
  fi
  echo -e "Full DB write time is\t${full_mysqldump_sql_write_time_iso8601} (${full_mysqldump_sql_write_time_epoch})"

  full_mysqldump_sql_write_time_with_delay_epoch="$(( ${full_mysqldump_sql_write_time_epoch} + ${sync_delay_seconds} ))"
  time_now_epoch="$( \date --utc +%s )"

  if [ "${full_mysqldump_sql_write_time_with_delay_epoch}" -gt "${time_now_epoch}" ]
  then
    echo "Skipping export. The Database has been recently created \"${full_mysqldump_sql_write_time_iso8601}\". Try again after $( \date --utc --date="@${full_mysqldump_sql_write_time_with_delay_epoch}" +%Y-%m-%dT%H:%M:%SZ )."
    exit 6
  fi
fi
mysqldump --defaults-file="${credential_file}" --tz-utc --add-drop-database  --databases hpr_hpr> "${full_mysqldump_sql}"
tail "${full_mysqldump_sql}" | grep 'Dump completed on'

echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<rss xmlns:atom=\"https://www.w3.org/2005/Atom\" version=\"2.0\">
  <channel>
    <title>Hacker Public Radio ~ Database Feed</title>
    <link>http://hackerpublicradio.org/about.html</link>
    <description>This Feed provides information the latest version of the HPR database.</description>
    <language>en-us</language>
    <copyright>Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) License</copyright>
    <managingEditor>feedback.nospam@nospam.hackerpublicradio.org (HPR Feedback)</managingEditor>
    <webMaster>admin.nospam@nospam.hackerpublicradio.org (HPR Webmaster)</webMaster>
    <generator>https://repo.anhonesthost.net/HPR/hpr-tools/src/branch/main/workflow/hpr_db_backup.bash</generator>
    <docs>https://www.rssboard.org/rss-specification</docs>
    <ttl>15</ttl>
    <image>
      <url>http://hackerpublicradio.org/images/hpr_feed_small.png</url>
      <title>Hacker Public Radio ~ Database Feed</title>
      <link>http://hackerpublicradio.org/about.html</link>
      <description>The Hacker Public Radio Old Microphone Logo</description>
      <height>164</height>
      <width>144</width>
    </image>
    <atom:link href=\"https://hackerpublicradio.org/hpr.sql.rss\" rel=\"self\" type=\"application/rss+xml\"/>
    <pubDate>$( date --utc --rfc-email )</pubDate>
    <item>
      <title>Export of the Public mariadb SQL for ${live_db_last_update_iso8601}</title>
      <author>admin.nospam@nospam.hackerpublicradio.org (Janitors)</author>
      <link>http://hackerpublicradio.org/hpr.sql#${live_db_last_update_iso8601}</link>
      <description/>
      <pubDate>$( date --utc --rfc-email )</pubDate>
      <enclosure url=\"http://hackerpublicradio.org/hpr.sql#${live_db_last_update_iso8601}\" length=\"$( ls -al "${hpr_site_sql}" | awk '{print $5}' )\" type=\"application/sql\"/>
      <guid isPermaLink=\"false\">sha1sum:$( sha1sum "${hpr_site_sql}" | awk '{print $1}' ),md5sum:$( md5sum "${hpr_site_sql}" | awk '{print $1}' )</guid>      
    </item>
  </channel>
</rss>" > "${hpr_site_sql}.rss"

if [ $HOSTNAME = "whp01.cloud-hosting.io" ]
then
  cp -v "${hpr_site_sql}" "$HOME/${hpr_database_file}"
  cp -v "${hpr_site_sql}.rss" "$HOME/${hpr_database_file}.rss"
else
  rsync -av --partial --progress ${hpr_site_sql} hpr:${hpr_database_file}
  rsync -av --partial --progress ${hpr_site_sql}.rss hpr:${hpr_database_file}.rss
fi

echo "${live_db_last_update_iso8601}" > "${last_update_txt}"

echo "Finished export of \"${live_db_last_update_iso8601}\""

