#!/bin/bash

CONF=/etc/ucs/ucs.conf
CONFIG_ONLY=false
DATA_ONLY=false
DUMP=ucs.sql

set -- $(getopt hc:xd "$@")
while [ $# -gt 0 ]; do
  case "$1" in
    -h) echo "Usage: $0 [-c /etc/ucs/ucs.conf] [-x] [-d] [ucs.sql]"; exit 0 ;;
    -c) CONF=$2; shift ;;
    -x) CONFIG_ONLY=true ;;
    -d) DATA_ONLY=true ;;
    --) ! test -z "$2" && DUMP=$2 ;;
    *) break ;;
  esac
  shift
done

if [ -f $DUMP ]; then
    echo "Dump $DUMP already exists."
    exit 1
fi

source $CONF
export PGPASSWORD=$DB_PASS
pg_dump="pg_dump --dbname=$DB_NAME --host=$DB_HOST --username=$DB_USER --no-password --no-privileges --no-owner"

echo "BEGIN;" > $DUMP

if ! $DATA_ONLY; then
  echo "Dumping structure..."
  $pg_dump -s >> $DUMP

  # To disable constraints so groups which have circular dependecy with settings
  # will be created we don't use "SET session_replication_role = replica;" because
  # in some installations UCS DB user has not enough priviledges.
  echo "ALTER TABLE ONLY public.groups DROP CONSTRAINT groups_settings_id_fk;" >> $DUMP
  # For some reason, trigger can't see device_types table on restore.
  echo "ALTER TABLE ONLY public.lines DISABLE TRIGGER USER;" >> $DUMP
fi

if $CONFIG_ONLY; then
  echo "Dumping configuration only..."
  $pg_dump -a \
    -T agent_logins \
    -T agent_queue_stats \
    -T agent_stats \
    -T ast_cdr \
    -T audit \
    -T blacklist_records \
    -T cdr \
    -T chat \
    -T companies \
    -T chat_messages \
    -T chat_msgs \
    -T contacts \
    -T device_certificates \
    -T directory_records \
    -T email_history \
    -T email_persons \
    -T email_stats \
    -T emails \
    -T fax_journal \
    -T fax_queue \
    -T interactions \
    -T lookup_directory \
    -T outbound_numbers \
    -T outbound_stats \
    -T path \
    -T persons \
    -T private_numbers \
    -T queue_detail_records \
    -T queue_stats \
    -T rating_results \
    -T recording \
    -T rtcp \
    -T sms \
    -T system_certificates \
    -T task_history \
    -T task_persons \
    -T task_stats \
    -T tasks \
    -T trunk_auth \
    -T user_certificates \
    -T users_presence \
    >> $DUMP 2> /dev/null
elif $DATA_ONLY; then
  $pg_dump -a \
    -t agent_logins \
    -t agent_queue_stats \
    -t agent_stats \
    -t ast_cdr \
    -t audit \
    -t blacklist_records \
    -t cdr \
    -t companies \
    -t chat_messages \
    -t chat_msgs \
    -t contacts \
    -t device_certificates \
    -t directory_records \
    -t email_history \
    -t email_persons \
    -t email_stats \
    -t emails \
    -t fax_journal \
    -t fax_queue \
    -t interactions \
    -t lookup_directory \
    -t outbound_numbers \
    -t outbound_stats \
    -t path \
    -t persons \
    -t private_numbers \
    -t queue_detail_records \
    -t queue_stats \
    -t rating_results \
    -t recording \
    -t rtcp \
    -t sms \
    -t system_certificates \
    -t task_history \
    -t task_persons \
    -t task_stats \
    -t tasks \
    -t trunk_auth \
    -t user_certificates \
    >> $DUMP 2> /dev/null
else
  echo "Dumping configuration and data..."
  $pg_dump -a >> $DUMP 2> /dev/null
fi

if ! $DATA_ONLY; then
  cat << EOF >> $DUMP
ALTER TABLE ONLY public.groups
    ADD CONSTRAINT groups_settings_id_fk FOREIGN KEY (settings_id) REFERENCES public.settings(id) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE ONLY public.lines ENABLE TRIGGER USER;
EOF
fi

echo "COMMIT;" >> $DUMP

echo "UCS database dumped to $DUMP"
