#!/bin/bash

missing_variable() {
   echo "$0: ERROR: missing variable '$1'!"
   exit 1
}

error_out_maybe() {
   if [ "$wiki_error_on_fetch" = "true" ]; then
      ## error out
      return 1
   else
      ## ignore error
      return 0
   fi
}

echo "$0: START"

set -e

source /usr/share/mediawiki-shell/common

[[ -v multiwiki_category ]] || multiwiki_category='MultiWiki'
#[[ -v wiki_multi_extra_wiki_pages_list ]] || wiki_multi_extra_wiki_pages_list="'MediaWiki:Build.json'"
[[ -v wiki_multi_extra_wiki_pages_list ]] || wiki_multi_extra_wiki_pages_list=""

## example:
[[ -v SOURCE_WIKI_URL ]] || SOURCE_WIKI_URL='https://www.kicksecure.com/w'
[[ -v DESTINATION_WIKI_URL ]] || DESTINATION_WIKI_URL=(
   'https://www.whonix.org/w'
)
[[ -v wiki_backup_folder ]] || wiki_backup_folder=~/mediawiki-shell/mirror-multi-wiki

## These variables should be set by the calling script as environment variables.
[[ -v SOURCE_WIKI_URL ]] || missing_variable SOURCE_WIKI_URL
[[ -v DESTINATION_WIKI_URL ]] || missing_variable DESTINATION_WIKI_URL
[[ -v wiki_backup_folder ]] || missing_variable wiki_backup_folder

[[ -v SOURCE_WIKI_API ]] || SOURCE_WIKI_API="${SOURCE_WIKI_URL}/api.php"

[[ -v continue_from_page ]] || continue_from_page=""

allpages_file="${TMPFOLDER}/allpages.txt"
rm -f "$allpages_file"

temp_article="${TMPFOLDER}/temp_article.txt"

echo "$0: INFO: TMPFOLDER         : $TMPFOLDER"
echo "$0: INFO: SOURCE_WIKI_URL   : $SOURCE_WIKI_URL"
echo "$0: INFO: SOURCE_WIKI_API   : $SOURCE_WIKI_API"
echo "$0: INFO: allpages_file     : $allpages_file"
echo "$0: INFO: multiwiki_category: $multiwiki_category"
echo "$0: INFO: wiki_multi_extra_wiki_pages_list: $wiki_multi_extra_wiki_pages_list"

mkdir --parents "$wiki_backup_folder"

if ! test -d "$wiki_backup_folder" ; then
   echo "$0: ERROR: wiki_backup_folder '$wiki_backup_folder' does not exist! Run...?:"
   echo "mkdir --parents '$wiki_backup_folder'"
   exit 1
fi

if ! test -w "$wiki_backup_folder" ; then
   echo "$0: ERROR: wiki_backup_folder '$wiki_backup_folder' unwriteable! Run...?:"
   echo "chown --recursive '$USER:$USER' '$wiki_backup_folder'"
   exit 1
fi

WIKI_URL="$DESTINATION_WIKI_URL" \
   mw-logout

WIKI_URL="$DESTINATION_WIKI_URL" \
   mw-login

all_pages=$($curl \
   $curl_opts \
   "${SOURCE_WIKI_API}?action=query&format=json&list=categorymembers&cmtitle=Category:$multiwiki_category&cmlimit=500"
)

## TODO: cmcontinue
#https://www.kicksecure.com/w/api.php?action=query&format=json&list=categorymembers&cmtitle=Category:MultiWiki&cmcontinue=page|434f444553454c454354|748

for wiki_multi_extra_wiki_pages_item in $wiki_multi_extra_wiki_pages_list ; do
   echo "$wiki_multi_extra_wiki_pages_item" | tee -a "$allpages_file" >/dev/null
done

echo "$all_pages" | jq -r ".query.categorymembers[] | .title | @sh" | tee -a "$allpages_file" >/dev/null

test -f "$allpages_file"
result_test="$(cat "$allpages_file")"
counter_total="$(awk 'END {print NR}' "$allpages_file")"

if [ "$result_test" = "" ]; then
   echo "$0 ERROR: result_test is empty!"
   exit 1
fi

## continue_from_page="Template:VM" mw-multi-wiki
continue_next=no
if [ "$continue_from_page" = "" ]; then
   continue_next=yes
fi

counter_currently=0
while IFS=$'\n' read -r item_from_all_pages ; do
   counter_currently=$(( $counter_currently + 1 ))

   backup_page_item="$item_from_all_pages"
   ## remove last letter ("'")
   backup_page_item="${backup_page_item::-1}"
   ## remove first letter ("'")
   backup_page_item="${backup_page_item:1}"

   search=" "
   replace="_"
   backup_page_item=$(echo "$backup_page_item" | str_replace "$search" "$replace")

   echo "PAGE | $counter_currently / $counter_total | $item_from_all_pages | $backup_page_item"

   if [ "$backup_page_item" = "$continue_from_page" ]; then
      continue_next=yes
   fi
   if [ "$continue_next" = "no" ]; then
      continue
   fi

   copy_wiki_pages_exit_code=0

   SOURCE_WIKI_URL="$SOURCE_WIKI_URL" \
   DESTINATION_WIKI_URL="$DESTINATION_WIKI_URL" \
   TMPFOLDER="$TMPFOLDER" \
   copy_wiki_pages_item="$backup_page_item" \
   edit_message="mediawiki-shell-bot-mirror-multi-wiki-page-from-kicksecure-to-whonix" \
      mw-copy-wiki-pages \
         || { copy_wiki_pages_exit_code="$?" ; true; }

   if [ "$copy_wiki_pages_exit_code" = "10" ]; then
      echo "$0: WARNING: PAGE - Skipped backup_page_item '$backup_page_item' because of pending edits."
   elif [ "$copy_wiki_pages_exit_code" = "0" ]; then
      echo "$0: INFO: PAGE - backup_page_item '$backup_page_item' mirroring success."
   else
      echo "$0: ERROR: PAGE - backup_page_item '$backup_page_item' mirroring error! copy_wiki_pages_exit_code: '$copy_wiki_pages_exit_code'"
      exit 1
   fi

   if ! echo "$backup_page_item" | grep --quiet --ignore-case "File:" ; then
      echo "FILE | No, not a file, ok."
      continue
   fi

   echo "FILE | $counter_currently / $counter_total | $item_from_all_pages | $backup_page_item"

   copy_wiki_file_exit_code=0

   SOURCE_WIKI_URL="$SOURCE_WIKI_URL" \
   DESTINATION_WIKI_URL="$DESTINATION_WIKI_URL" \
   TMPFOLDER="$TMPFOLDER" \
   wiki_remote_file_name="$backup_page_item" \
   edit_message="mediawiki-shell-bot-mirror-multi-wiki-file-from-kicksecure-to-whonix" \
      mw-copy-wiki-file \
         || { copy_wiki_file_exit_code="$?" ; true; }

   if [ "$copy_wiki_file_exit_code" = "10" ]; then
      echo "$0: WARNING: FILE - Skipped backup_page_item '$backup_page_item' because of pending edits."
   elif [ "$copy_wiki_file_exit_code" = "0" ]; then
      echo "$0: INFO: FILE - backup_page_item '$backup_page_item' mirroring success."
   else
      echo "$0: ERROR: FILE - backup_page_item '$backup_page_item' mirroring error! copy_wiki_pages_exit_code: '$copy_wiki_file_exit_code'"
      exit 1
   fi

   continue

done < "$allpages_file"
