#!/bin/bash

# rioCata - Script de ayuda para gestión de la base de datos

set -e

COMPOSE="docker-compose"
DB_USER="riocata_user"
DB_NAME="riocata"

# Colores
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

function show_help() {
    echo "rioCata - Sistema de Catación de Café"
    echo ""
    echo "Uso: ./riocata.sh [comando]"
    echo ""
    echo "Comandos disponibles:"
    echo "  start         - Iniciar servicios"
    echo "  stop          - Detener servicios"
    echo "  restart       - Reiniciar servicios"
    echo "  reset         - Reiniciar servicios y borrar datos (¡CUIDADO!)"
    echo "  psql          - Conectarse a PostgreSQL con psql"
    echo "  test          - Ejecutar tests de validación"
    echo "  queries       - Ejecutar queries de ejemplo"
    echo "  logs          - Ver logs de PostgreSQL"
    echo "  status        - Ver estado de servicios"
    echo "  backup        - Crear backup de la base de datos"
    echo "  restore FILE  - Restaurar backup desde archivo"
    echo "  help          - Mostrar esta ayuda"
    echo ""
}

function start_services() {
    echo -e "${GREEN}Iniciando servicios...${NC}"
    $COMPOSE up -d
    echo -e "${GREEN}Esperando que PostgreSQL esté listo...${NC}"
    sleep 3
    $COMPOSE ps
}

function stop_services() {
    echo -e "${YELLOW}Deteniendo servicios...${NC}"
    $COMPOSE down
}

function restart_services() {
    echo -e "${YELLOW}Reiniciando servicios...${NC}"
    $COMPOSE restart
    sleep 3
    $COMPOSE ps
}

function reset_all() {
    echo -e "${RED}¡ADVERTENCIA! Esto borrará TODOS los datos.${NC}"
    read -p "¿Estás seguro? (escribe 'SI' para confirmar): " confirm
    if [ "$confirm" = "SI" ]; then
        echo -e "${RED}Eliminando servicios y datos...${NC}"
        $COMPOSE down -v
        echo -e "${GREEN}Reiniciando servicios...${NC}"
        $COMPOSE up -d
        sleep 5
        echo -e "${GREEN}Base de datos reinicializada con datos de prueba.${NC}"
    else
        echo -e "${YELLOW}Operación cancelada.${NC}"
    fi
}

function connect_psql() {
    echo -e "${GREEN}Conectando a PostgreSQL...${NC}"
    echo -e "${YELLOW}Tip: usa \\q para salir${NC}"
    $COMPOSE exec postgres psql -U $DB_USER -d $DB_NAME
}

function run_tests() {
    echo -e "${GREEN}Ejecutando tests de validación...${NC}"
    $COMPOSE exec -T postgres psql -U $DB_USER -d $DB_NAME < postgres/tests/test_all.sql
}

function run_queries() {
    echo -e "${GREEN}Ejecutando queries de ejemplo...${NC}"
    $COMPOSE exec -T postgres psql -U $DB_USER -d $DB_NAME < postgres/tests/example_queries.sql
}

function show_logs() {
    echo -e "${GREEN}Mostrando logs de PostgreSQL...${NC}"
    $COMPOSE logs -f postgres
}

function show_status() {
    echo -e "${GREEN}Estado de servicios:${NC}"
    $COMPOSE ps
}

function create_backup() {
    BACKUP_FILE="backup_$(date +%Y%m%d_%H%M%S).sql"
    echo -e "${GREEN}Creando backup en $BACKUP_FILE...${NC}"
    $COMPOSE exec -T postgres pg_dump -U $DB_USER $DB_NAME > $BACKUP_FILE
    echo -e "${GREEN}Backup creado exitosamente: $BACKUP_FILE${NC}"
}

function restore_backup() {
    if [ -z "$1" ]; then
        echo -e "${RED}Error: Debes especificar el archivo de backup${NC}"
        echo "Uso: ./riocata.sh restore <archivo.sql>"
        exit 1
    fi

    if [ ! -f "$1" ]; then
        echo -e "${RED}Error: El archivo $1 no existe${NC}"
        exit 1
    fi

    echo -e "${YELLOW}Restaurando backup desde $1...${NC}"
    $COMPOSE exec -T postgres psql -U $DB_USER -d $DB_NAME < "$1"
    echo -e "${GREEN}Backup restaurado exitosamente${NC}"
}

# Main
case "${1:-help}" in
    start)
        start_services
        ;;
    stop)
        stop_services
        ;;
    restart)
        restart_services
        ;;
    reset)
        reset_all
        ;;
    psql)
        connect_psql
        ;;
    test)
        run_tests
        ;;
    queries)
        run_queries
        ;;
    logs)
        show_logs
        ;;
    status)
        show_status
        ;;
    backup)
        create_backup
        ;;
    restore)
        restore_backup "$2"
        ;;
    help|--help|-h)
        show_help
        ;;
    *)
        echo -e "${RED}Comando desconocido: $1${NC}"
        echo ""
        show_help
        exit 1
        ;;
esac
