#!/usr/bin/env bash

shopt -s extglob

prod_web_server=94.247.233.8
prod_engine_server=94.247.233.9

dev_web_server=194.254.167.53
dev_engine_server=194.254.167.54

prod_sync_user=mosatags
dev_sync_user=mosatags

web_location=/srv/www/mosatags
engine_location=/srv/tomcat/mosatags

hg_server=www.iri.centrepompidou.fr/dev/hg/mosatags
hg_server_protocol=https

hg_anonymous_user=anonymous
hg_anonymous_password=Ajee8eev

clone_path=~/tmp/mosatags_clone
export_path_prefix=~/tmp/mosatags_

sync_type='all'
server='dev'
hg_user="$hg_anonymous_user"
hg_operation='update'
debug=false

usage() {
    #-----0123456789012345678901234567890123456789012345678901234567890123456789
    echo "Usage: $0 [option] version"
    echo "  version: mosatags version"
    echo "options:"
    echo "  -h: help"
    echo "  -t <type>: one of web|engine|all"
    echo "  -s <server>: one of dev or prod"
    echo "  -o <hg_operation>: one of update|archive"
    echo "  -l <hg_url>: the url of the hg repository"
    echo "  -u <user>: hg user"
    echo "  -p <password>: hg password"
    echo "  -c <clone_path>: path for cloning the repository"
    echo "  -e <export_path>: path prefix for export. The version will be"
    echo "                    appended. ignored when hg operation is \"update\""
    echo "  -d: debug mode. display only environement"
}

checkout_sources() {
    echo "===============";
    echo "Checkout source";
    
    if [ -d "$clone_path" ]; then
        pushd "$clone_path";

        hg_clone_url=`hg paths|grep "^default"`;
        hg_clone_url=${hg_clone_url##"default = "};
        echo "Repository path = |$hg_clone_url|, must be |$hg_url|.";
        if [[ "$hg_compare_url" =~ "${hg_clone_url}" ]]; then
            echo "Repository already exists pull"
            hg pull -f || { echo "problem when pulling"; exit;}
        else
            echo "Repository bad url, deleting clone."
            popd
            rm -fr $clone_path
         fi
    fi
    if [ ! -d "$clone_path" ]; then
        echo "Clone repository"
        hg clone -U $hg_url "$clone_path" || { echo "problem when cloning"; exit;}
        pushd "$clone_path"
    fi
    
    if [ "$hg_operation" == "archive" ]; then
        if [ -d "$export_path" ]; then
            rm -fr $export_path
        fi
        echo "archive version $version in $export_path"
        hg archive -r $version "$export_path" || { echo "problem when archiving"; exit;}
    else
        echo "force update $version in $export_path"
        hg update -C -r $version
    fi
    
    popd;
    
    echo "checkout done";
}

cleanup() {
    echo "===============";
    echo "cleanup";
    if [ -d "$export_path" -a "$export_path" != "$clone_path" ]; then
        echo "Delete export_path : $export_path"
        rm -fr $export_path;
        echo "ok";
    fi
}

sync_web() {
    echo "===============";
    export_path_web="$export_path"/web/thdProject/;
    server_ip_name=$server"_web_server";
    server_ip=${!server_ip_name};
    sync_user_name=${server}_sync_user;
    sync_user=${!sync_user_name}
    echo "sync web from $export_path_web to $server_ip ($server_ip_name) with user $sync_user ($sync_user_name)";
    if [ -d "$export_path_web" ]; then
        pushd "$export_path_web";
        if [ -d web/sf ]; then
            echo "cleaning symfony folder";
            rm -fr web/sf;
        fi
        php symfony freeze data/;
        popd;
        echo rsync -Cvrlz --delete --filter=". -" "$export_path_web" $sync_user@$server_ip:$web_location
        cat <<EOT | rsync -Cvrlz --delete --filter=". -" "$export_path_web" $sync_user@$server_ip:$web_location
+ core
- .hg
- .hg/***
P .htpasswd
P .htaccess
P plugins/iriSonyenginePlugin/config/sonyengine.yml
P plugins/uvmcSolrSearchPlugin/config/solr.yml
P config/databases.yml
P apps/frontend/config/app.yml
P apps/frontend/config/factories.yml
P robots.txt
P log/***
P data/***
EOT
        if [ "$hg_operation" == "update" ]; then
          pushd "$export_path_web";
          echo "symfony unfreeze"
          php symfony unfreeze ;
          popd;
        fi
    fi
    
}

sync_engine() {
    echo "===============";
    echo "sync engine";
    export_path_engine="$export_path"/engine/;
    server_ip_name=$server"_engine_server";
    server_ip=${!server_ip_name};
    sync_user_name=${server}_sync_user;
    sync_user=${!sync_user_name};
    echo "sync web from $export_path_engine to $server_ip ($server_ip_name) with user $sync_user ($sync_user_name)";
    if [ -d "$export_path_engine" ]; then
        echo rsync -Cvrlz --delete --filter=". -" "$export_path_engine" $sync_user@$server_ip:$engine_location
        cat <<EOT | rsync -Cvrlz --delete --filter=". -" "$export_path_engine" $sync_user@$server_ip:$engine_location
- .hg
- .hg/***
P solr/solr/conf/solrconfig.xml
P solr/solr/data/***
P solr/context.xml
P sonyengine/context.xml
P sonyengine/db/***
EOT
    fi
}

disp_env() {
    echo "version      : $version";
    echo "hg_operation : $hg_operation";
    echo "hg_user      : $hg_user";
    echo "hg_url       : $hg_url";
    echo "sync_type    : $sync_type";
    echo "server       : $server";
    echo "clone_path   : $clone_path";
    echo "export_path  : $export_path";
    echo "debug        : $debug";
}

while [ $# -gt 0 ]
do
  case $1
  in
    -h)
      usage;
      exit;
    ;;

    -t)
      sync_type=$2;
      # check sync type value
      if [[ "$sync_type" == @(web|engine|all) ]]; then
        shift 2
      else
        echo "sync type given : $sync_type, must be one of web|engine|all"
        usage
        exit
      fi  
    ;;

    -s)
      server=$2
      if [[ "$server" == @(prod|dev) ]]; then
        shift 2
      else
        echo "server given : $server, must be one of prod|dev"
        usage
        exit
      fi  
    ;;

    -o)
      hg_operation=$2
      if [[ "$hg_operation" == @(archive|update) ]]; then
        shift 2
      else
        echo "hg operation given : $hg_operation, must be one of archive|update"
        usage
        exit
      fi  
    ;;

    -l)
      hg_url=$2
      if ! { shift 2; }; then
         echo "the -l option need an argument"
         usage
         exit
      fi
    ;;

    -c)
      clone_path=$2
      if ! { shift 2; }; then
         echo "the -c option need an argument"
         usage
         exit
      fi
    ;;

    -e)
      export_path_prefix=$2
      if ! { shift 2; }; then
         echo "the -e option need an argument"
         usage
         exit
      fi
    ;;


    -u)
      hg_user=$2
      if ! { shift 2; }; then
         echo "the -u option need an argument"
         usage
         exit
      fi
    ;;

    -p)
      hg_password=$2
      if ! { shift 2; }; then
         echo "the -p option need an argument"
         usage
         exit
      fi
    ;;

    
    -d)
      debug=true
      shift 1
    ;;

    [0-9V]*|tip)
      version=$1
      shift 1
    ;;

    *)
        echo "Unknown option $1"
        usage
        exit
    ;;
  
  esac
done

if [ -z "$version" ] && ! $debug; then
    echo "No version"
    usage
    exit
fi

if [ "$hg_user" == "anonymous" -o  "$hg_user" == "anon" ]; then
    hg_user="$hg_anonymous_user"
    hg_password="$hg_anonymous_password"
fi

if [ -z "$hg_password" ]; then
  hg_url="$hg_server_protocol://$hg_user@$hg_server"
  hg_compare_url="$hg_server_protocol://$hg_user@$hg_server"
else
  hg_url="$hg_server_protocol://$hg_user:$hg_password@$hg_server"
  hg_compare_url="$hg_server_protocol://$hg_user:***@$hg_server"
fi

if [ "$hg_operation" == "archive" ]; then
    export_path=${export_path_prefix}_$version
else
    export_path="$clone_path"
fi

disp_env
if $debug; then
    exit
fi

checkout_sources

case "$sync_type" in
    
    "web")
    sync_web
    ;;
    
    "engine")
    sync_engine
    ;;
    
    "all")
    sync_web
    sync_engine
    ;;

esac


cleanup
