#!/bin/bash
# Скрипт для работы с проектами
# Автор: Роман Коноплев (korodm@gmail.com)

# Функция вывода справки
function help() {
    echo "Скрипт для работы с проектами"
    echo
    echo "Использование: `basename ${0}` -options project_name"
    echo "Опции:"
    echo " -c       Создать проект"
    echo " -r       Удалить проект"
    echo " -h       Коммит проекта"
    echo " -m       Создание/удаление/коммит вместе с базой данных"
    echo "          (использовать с -c, -r или -h)"
    echo
    echo " -i       Вывод этой справки"
    echo
}

################################################################################
#                          Стандартные переменные
################################################################################

# Рабочий каталог
WORK_DIR="/home/korodm/Documents/sites/"

# Форматирование вывода
END=$(tput hpa $(tput cols))$(tput cub 6)
RED=$(tput setf 4)
GREEN=$(tput setf 2)
RESET=$(tput sgr0)

################################################################################
#                                Проверки
################################################################################

# Проверка на наличие передаваемых параметров
if ! [ -n "${2}" ]
then
    help
    exit 1
else
    SITE=${2}
fi

# Проверка рабочего каталога
while [[ ! -d ${WORK_DIR} ]]
do
    printf "path to work dir: "
    read WORK_DIR
done

# Если рабочий каталог был указан без / вконце, добавим этот слэш
if [[ "${WORK_DIR: -1}" != "/" ]]
then
    WORK_DIR=${WORK_DIR}''"/"
fi

################################################################################
#                               Блок функций
################################################################################

# Функция создания проекта
function create() {    
    # Проверка на существование каталога для сайта в рабочем каталоге
    while [[ -d "${WORK_DIR}${SITE}" ]]
    do
        printf "path to project dir: "
        read SITE
    done
    
    mkdir ${WORK_DIR}${SITE}
    
    # Создание index.php
    printf "<h1>Сайт %s работает!</h1>
<h2>%s%s/index.php</h2>
<?php phpinfo(); ?>" ${SITE} ${WORK_DIR} ${SITE} > ${WORK_DIR}${SITE}/index.php

    echo "Создание сайта ${SITE}${END}${GREEN}[OK]${RESET}"
}

# Функция удаления проекта
function delete() {
    # Проверка на существование каталога для сайта в рабочем каталоге
    while [[ ! -d "${WORK_DIR}${SITE}" ]]
    do
        printf "path to project dir: "
        read SITE
    done
    
    rm -R ${WORK_DIR}${SITE}
    
    echo "Удаление сайта ${SITE}${END}${GREEN}[OK]${RESET}"
}

# Функция коммита
function commit() {
    # Проверка на существование каталога для сайта в рабочем каталоге
    while [[ ! -d "${WORK_DIR}${SITE}/.hg" ]]
    do
        printf "path to project dir: "
        read SITE
    done
    
    cd ${WORK_DIR}${SITE}
    
    for i in $(find . -type f -name "*.php")
    do
        if ! php -l ${i} > /dev/null
        then
            echo "Найдены ошибки ${SITE}${END}${RED}[FAIL]${RESET}"
            exit 1
        fi
    done
    
    hg addremove
    hg commit
    hg push
    
    cd - > /dev/null
    
    echo "Коммит сайта ${SITE}${END}${GREEN}[OK]${RESET}"
}

# Функция создания базы данных
function mysql_create() {
    
    mysql -uroot -p --execute="create database ${SITE};"
    mysql -uroot -p --execute="GRANT ALL PRIVILEGES ON ${SITE}.* TO ${SITE}@localhost IDENTIFIED by '${SITE}' WITH GRANT OPTION;"
    
    echo "Создание базы данных ${SITE}${END}${GREEN}[OK]${RESET}"
}

# Функция удаления базы данных
function mysql_delete() {

    mysql -uroot -p --execute="drop database ${SITE};"
    mysql -uroot -p --execute="USE mysql; DELETE FROM user WHERE User='${SITE}';"
    
    echo "Удаление базы данных ${SITE}${END}${GREEN}[OK]${RESET}"
}

# Функция бэкапа базы данных для последующего коммита
function mysql_backup() {
    
    # Проверка на существование каталога для сайта в рабочем каталоге
    while [[ ! -d "${WORK_DIR}${SITE}/.hg" ]]
    do
        printf "path to project dir: "
        read SITE
    done
    
    cd ${WORK_DIR}${SITE}
    
    mysqldump -uroot -p ${SITE} > mysql-`date +%m%d%y`.sql
    
    echo "Бэкап базы ${SITE}${END}${GREEN}[OK]${RESET}"
}

################################################################################
#                                 Основной скрипт
################################################################################

if [ $# -eq 0 ]  # Сценарий вызван без аргументов?
then
    help
    exit 65
fi

while getopts ":crhi" OPTION
do
    case ${OPTION} in
        
        c ) while getopts ":m" OTHER_OPTION
            do
                case ${OTHER_OPTION} in
                
                    m ) create
                        mysql_create
                        exit 0 ;;
                    
                    * ) echo "Недопустимый сценарий"
                        exit 1 ;;
                
                esac
            done
            
            create
            exit 0 ;;
        
        r ) while getopts ":m" OTHER_OPTION
            do
                case ${OTHER_OPTION} in
                
                    m ) delete
                        mysql_delete
                        exit 0 ;;
                    
                    * ) echo "Недопустимый сценарий"
                        exit 1 ;;
                
                esac
            done
            
            delete
            exit 0 ;;
        
        h ) while getopts ":m" OTHER_OPTION
            do
                case ${OTHER_OPTION} in
                
                    m ) mysql_backup
                        commit
                        exit 0 ;;
                    
                    * ) echo "Недопустимый сценарий"
                        exit 1 ;;
                
                esac
            done
            
            commit
            exit 0 ;;
        
        i ) help
            exit 0 ;;
        
        * ) echo "Недопустимый сценарий"
            exit 1 ;;
        
    esac
done

exit 0;