#!/bin/bash

# Script para ejecutar los tests de MangaReader
# Usage: ./run_tests.sh [options]
#
# Options:
#   --all           Ejecutar todos los tests (default)
#   --unit          Solo tests unitarios
#   --integration   Solo tests de integración
#   --coverage      Ejecutar con cobertura de código
#   --verbose       Salida detallada
#   --clean         Limpiar build antes de testear

set -e

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

# Variables
PROJECT_DIR="/home/ren/ios/MangaReader/ios-app"
SCHEME="MangaReader"
DESTINATION="platform=iOS Simulator,name=iPhone 15"
TEST_TYPE="all"
COVERAGE="NO"
VERBOSE=""

# Funciones de logging
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# Banner
print_banner() {
    echo -e "${BLUE}"
    echo "╔════════════════════════════════════════╗"
    echo "║   MangaReader Test Suite Runner       ║"
    echo "╚════════════════════════════════════════╝"
    echo -e "${NC}"
}

# Parsear argumentos
parse_args() {
    while [[ $# -gt 0 ]]; do
        case $1 in
            --all)
                TEST_TYPE="all"
                shift
                ;;
            --unit)
                TEST_TYPE="unit"
                shift
                ;;
            --integration)
                TEST_TYPE="integration"
                shift
                ;;
            --coverage)
                COVERAGE="YES"
                shift
                ;;
            --verbose)
                VERBOSE="-verbose"
                shift
                ;;
            --clean)
                log_info "Limpiando build..."
                clean_build
                shift
                ;;
            --help)
                show_help
                exit 0
                ;;
            *)
                log_error "Opción desconocida: $1"
                show_help
                exit 1
                ;;
        esac
    done
}

# Mostrar ayuda
show_help() {
    cat << EOF
Usage: ./run_tests.sh [options]

Options:
    --all           Ejecutar todos los tests (default)
    --unit          Solo tests unitarios
    --integration   Solo tests de integración
    --coverage      Ejecutar con cobertura de código
    --verbose       Salida detallada
    --clean         Limpiar build antes de testear
    --help          Mostrar esta ayuda

Examples:
    ./run_tests.sh --all --coverage
    ./run_tests.sh --unit --verbose
    ./run_tests.sh --clean --coverage

EOF
}

# Limpiar build
clean_build() {
    cd "$PROJECT_DIR"
    xcodebuild clean -scheme "$SCHEME" 2>&1 | grep -E "error|warning|clean"
}

# Ejecutar todos los tests
run_all_tests() {
    log_info "Ejecutando todos los tests..."

    xcodebuild test \
        -scheme "$SCHEME" \
        -destination "$DESTINATION" \
        -enableCodeCoverage "$COVERAGE" \
        $VERBOSE
}

# Ejecutar solo tests unitarios
run_unit_tests() {
    log_info "Ejecutando tests unitarios..."

    xcodebuild test \
        -scheme "$SCHEME" \
        -destination "$DESTINATION" \
        -only-testing:MangaReaderTests/ModelTests \
        -only-testing:MangaReaderTests/StorageServiceTests \
        -only-testing:MangaReaderTests/ManhwaWebScraperTests \
        -enableCodeCoverage "$COVERAGE" \
        $VERBOSE
}

# Ejecutar solo tests de integración
run_integration_tests() {
    log_info "Ejecutando tests de integración..."

    xcodebuild test \
        -scheme "$SCHEME" \
        -destination "$DESTINATION" \
        -only-testing:MangaReaderTests/IntegrationTests \
        -enableCodeCoverage "$COVERAGE" \
        $VERBOSE
}

# Generar reporte de cobertura
generate_coverage_report() {
    if [ "$COVERAGE" = "YES" ]; then
        log_info "Generando reporte de cobertura..."

        # Buscar el archivo de cobertura más reciente
        COVERAGE_FILE=$(find ~/Library/Developer/Xcode/DerivedData -name "*.profdata" -print0 | xargs -0 ls -t | head -n1)

        if [ -n "$COVERAGE_FILE" ]; then
            log_success "Archivo de cobertura: $COVERAGE_FILE"

            # Generar reporte HTML (requiere xcrun)
            # xcrun llvm-cov report "$COVERAGE_FILE" > coverage_report.txt

            log_success "Reporte de cobertura generado"
        else
            log_warning "No se encontró archivo de cobertura"
        fi
    fi
}

# Verificar resultado del test
check_test_result() {
    if [ $? -eq 0 ]; then
        log_success "Todos los tests pasaron ✓"

        if [ "$COVERAGE" = "YES" ]; then
            generate_coverage_report
        fi

        echo ""
        log_info "Resumen:"
        echo "  - Tests ejecutados: $TEST_TYPE"
        echo "  - Cobertura: $COVERAGE"

        return 0
    else
        log_error "Algunos tests fallaron ✗"
        return 1
    fi
}

# Verificar dependencias
check_dependencies() {
    log_info "Verificando dependencias..."

    if ! command -v xcodebuild &> /dev/null; then
        log_error "xcodebuild no encontrado. Asegúrate de tener Xcode instalado."
        exit 1
    fi

    if [ ! -d "$PROJECT_DIR" ]; then
        log_error "Directorio del proyecto no encontrado: $PROJECT_DIR"
        exit 1
    fi

    log_success "Dependencias OK"
}

# Main
main() {
    print_banner
    parse_args "$@"
    check_dependencies

    echo ""
    log_info "Configuración:"
    echo "  - Proyecto: $PROJECT_DIR"
    echo "  - Scheme: $SCHEME"
    echo "  - Destination: $DESTINATION"
    echo "  - Test Type: $TEST_TYPE"
    echo "  - Coverage: $COVERAGE"
    echo ""

    # Ejecutar tests según tipo
    case $TEST_TYPE in
        all)
            run_all_tests
            ;;
        unit)
            run_unit_tests
            ;;
        integration)
            run_integration_tests
            ;;
    esac

    check_test_result
}

# Ejecutar
main "$@"
