#!/usr/bin/sh

#
#   Arquivo Inicial de Backup
#   @version    1.0
#   @since      1.0
#   @author     Marcos de Lima Carlos   <mlimacarlos@gmail.com>
#   @copytight  Model Business
#

#
#
set +x

# Variáveis de desenvolvimento
#DIR_ATUAL="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
#FUNC_FILE="${DIR_ATUAL}/functions-model.sh"
#BACK_FUNC="${DIR_ATUAL}/back-functions.sh"
#DIR_SITES="${DIR_ATUAL}/sites/"
#DIR_MODEL="${DIR_ATUAL}/model-incb.options"

# Variáveis de Produção
FUNC_FILE="/usr/local/bin/functions-model.sh"
BACK_FUNC="/usr/local/bin/back-functions.sh"
DIR_SITES="/etc/model/sites"

# carrega o arquivo padrão de funções
if [ -f "$FUNC_FILE" ]; then
    source "$FUNC_FILE"
else
    echo "Arquivo de funções não encontrado"
    exit 1
fi

# carrega o arquivo de funções específicas de backup
if [ -f "$BACK_FUNC" ]; then
    source "$BACK_FUNC"
else
    echo "Arquivo de funções de backup não encontrado"
    exit 1
fi




# só continua se o usuário tiver permissões de super-usuário
check_root

# ----------------------------------------------------------

#   variáveis de armazenamento de opções
PROFILE_NAME=""
MODO=""
SITE_NAME=""
TIPO_BACKUP=""
TIME_BACKUP=""
# -----------------------------------------------------

# Arquivo de ajuda do comando
showHelp(){
    echo ""
    echo "Uso: $0 [opções]"
    echo ""
    echo "Modo de Operação:"
    echo ""
    echo "  --profile <nome> - adiciona um perfil ao sistema em /etc/model/sites"
    echo ""
    echo "  -f <nome> -t <tipo> <time> - faz o backup do site escolhendo o tipo de backup (full, database ou files)  "
    echo "                time - d(diario), w(week), m(month) -  para backup manual deixar vazio"
    echo ""
    echo "  --list - lista todos os perfis dentro do servidor"
    echo ""
    echo "  --remove-profile <nome> remove o perfil desejado"
    echo ""
    echo "  --cron <profile> <time> (time - d - daily, w - semanal, m - mensal, a - all)"
    echo ""
    echo ""
    exit 1
}

# função que faz o tratamento dos argumentos
parse_args(){
    while [[ $# -gt 0 ]]; do
        case $1 in
            --profile)
                # opção de criar perfil
                [[ -n "$MODO" ]] && showHelp
                MODO="PROFILE"
                PROFILE_NAME="$2"
                shift 2
                # sai do loop pq break é uma opção única
                break
            ;;
            
            --list)
                [[ -n "$MODO" ]] && showHelp
                MODO="LIST"
                break
            ;;
            
            --remove-profile)
                [[ -n "$MODO" ]] && showHelp
                MODO="REMOVE"
                PROFILE_NAME="$2"
                break
            ;;
            
            -f)
                # opção de gerar o backup passando o perfil
                [[ -n "$MODO" ]] && showHelp
                MODO="BACKUP"
                SITE_NAME="$2"
                
                # comparar para ver se o nome não é vazio
                
                
                shift 2
                
            ;;
            
            -t)
                if [[ "$MODO" == "BACKUP" ]]; then
                    # se o modo for backup
                    TIPO_BACKUP=${2^^}
                    
                    TIME_BACKUP=${3^^}
                    
                    if [[ -z "$TIME_BACKUP" ]]; then
                        TIME_BACKUP="MANUAL"
                    fi
                    
                    if [[ "$TIPO_BACKUP" == "FULL" || "$TIPO_BACKUP" == "FILES" || "$TIPO_BACKUP" == "DATABASE" ]]; then
                        if [[ ! "$TIME_BACKUP" =~ ^(MANUAL|D|W|M)$ ]]; then
                            echo -e "\nTempo Inválido: '$TIME_BACKUP'"
                            showHelp
                            exit 1
                        fi
                        
                        if [[ "$TIME_BACKUP" == "MANUAL" ]]; then
                            shift 2
                        else
                            shift 3
                        fi
                        
                    else
                        echo "Erro: Tipo '$TIPO_BACKUP' inválido. Use FULL, FILES ou DATABASE."
                        exit 1
                    fi
                    
                else
                    
                    showHelp
                fi
            ;;
            
            --cron)
                [[ -n "$MODO" ]] && showHelp
                MODO="CRON"
                PROFILE_NAME="$2"
                TIME_BACKUP="$3"
                break
            ;;
            
            --help)
                # mostra ajuda
                showHelp
                break
            ;;
            
            *)
                echo "Opção inválida: $1"
                # mostrar ajuda
                showHelp
                break
            ;;
        esac
    done
    
}

# Função de gerenciamento principal
main(){
    parse_args "$@"
    
    case $MODO in
        
        # função de criação do perfil
        PROFILE)
            #Checar se uma string é vazia
            if [[ -z "$PROFILE_NAME" ]]; then
                echo -e "\nO nome do perfil deve estar preenchido!\n"
                return 1
            fi
            
            #Checar se ela é menor que X caracteres
            if (( ${#PROFILE_NAME} < 3 )); then
                echo -e "\nO nome do perfil é muito curto. Ele deve ser maior que 3 caracteres\n"
                return 1
            fi
            
            # cria o arquivo de perfil
            addProfile $PROFILE_NAME
            
            # cria os diretórios na localização de backup
            createDir $PROFILE_NAME
            return 0
        ;;
        
        # função de remoção
        REMOVE)
            #Checar se uma string é vazia
            if [[ -z "$PROFILE_NAME" ]]; then
                echo -e "\nO nome do perfil deve estar preenchido!\n"
                return 1
            fi
            
            delProfile $PROFILE_NAME
        ;;
        
        # Gera o backup
        BACKUP)
            makeBackup "$SITE_NAME" "$TIPO_BACKUP" "$TIME_BACKUP"
        ;;
        
        # Lista todos os perfis da máquina
        LIST)
            list_profiles $DIR_SITES
        ;;
        
    esac
    
    
    
}

main "$@"