#!/usr/bin/env bash
# init_go_module
# --------------
# Pipeline que inicializa un módulo Go simple en el directorio actual.
# Crea: go.mod, main.go, .gitignore, build.sh y dev.sh.
#
# USO:
#   bash init_go_module.sh [module_path]
#
# ARGUMENTOS:
#   module_path   Path del módulo Go (opcional; default: github.com/user/<dirname>)

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

init_go_module() {
    local module_path="${1:-}"

    local dir_name
    dir_name="$(basename "$(pwd)")"

    if [[ -z "$module_path" ]]; then
        module_path="github.com/user/${dir_name}"
    fi

    echo "=== Inicializar Módulo Go ==="
    echo "  Módulo:    ${module_path}"
    echo "  Directorio: $(pwd)"
    echo ""

    # Verificar Go
    if ! command -v go &>/dev/null; then
        echo "init_go_module: Go no está instalado" >&2
        return 1
    fi
    echo "Go detectado: $(go version)"
    echo ""

    # Inicializar módulo
    echo "Inicializando go module..."
    if ! go mod init "$module_path"; then
        echo "init_go_module: falló go mod init" >&2
        return 1
    fi
    echo "go.mod creado"
    echo ""

    # Crear main.go
    echo "Creando main.go..."
    cat > main.go << 'GOEOF'
package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hola desde Go!")
	fmt.Println("Modulo inicializado correctamente")
}
GOEOF
    echo "main.go creado"
    echo ""

    # Crear .gitignore
    echo "Creando .gitignore..."
    cat > .gitignore << 'IGNEOF'
# Binarios
*.exe
*.exe~
*.dll
*.so
*.dylib
bin/
build/

# Archivos de test
*.test
*.out
coverage.txt
*.prof

# IDEs
.idea/
.vscode/
*.swp
*.swo
*~

# OS
.DS_Store
Thumbs.db
IGNEOF
    echo ".gitignore creado"
    echo ""

    # Crear build.sh
    echo "Creando build.sh..."
    cat > build.sh << 'BUILDEOF'
#!/bin/bash
set -euo pipefail

TARGET="${1:-linux}"
mkdir -p bin

case "$TARGET" in
    linux)
        GOOS=linux GOARCH=amd64 go build -o bin/app-linux main.go
        chmod +x bin/app-linux
        echo "Compilado: bin/app-linux"
        ;;
    windows)
        GOOS=windows GOARCH=amd64 go build -o bin/app-windows.exe main.go
        echo "Compilado: bin/app-windows.exe"
        ;;
    all)
        GOOS=linux   GOARCH=amd64 go build -o bin/app-linux        main.go && echo "Linux OK"
        GOOS=windows GOARCH=amd64 go build -o bin/app-windows.exe  main.go && echo "Windows OK"
        GOOS=darwin  GOARCH=amd64 go build -o bin/app-macos        main.go && echo "macOS OK"
        ;;
    *)
        echo "Uso: ./build.sh [linux|windows|all]" >&2
        exit 1
        ;;
esac
BUILDEOF
    chmod +x build.sh
    echo "build.sh creado"
    echo ""

    # Crear dev.sh
    echo "Creando dev.sh..."
    cat > dev.sh << 'DEVEOF'
#!/bin/bash
set -euo pipefail

go run main.go "$@"
DEVEOF
    chmod +x dev.sh
    echo "dev.sh creado"
    echo ""

    echo "=== Modulo Go creado exitosamente ==="
    echo ""
    echo "Archivos generados:"
    echo "  main.go     - Codigo del modulo"
    echo "  go.mod      - Modulo Go (${module_path})"
    echo "  .gitignore  - Exclusiones git"
    echo "  build.sh    - Compilar binario"
    echo "  dev.sh      - Ejecutar directamente"
    echo ""
    echo "Proximos pasos:"
    echo "  ./dev.sh           - Ejecutar el modulo"
    echo "  ./build.sh         - Compilar para Linux"
    echo "  ./build.sh windows - Compilar para Windows"
    echo "  ./build.sh all     - Compilar para todo"
}

init_go_module "$@"
