#!/bin/bash
#
# Script migliorato per sincronizzare file .m da server remoto
# e generare richiesta automatica per Claude Code
#
# Basato su: sync_server_file.sh
# Aggiunge: Rilevamento automatico modifiche e generazione richiesta Claude
#

# Configurazione
REMOTE_USER="alex"
REMOTE_HOST="80.211.60.65"
REMOTE_PORT="2022"
REMOTE_SRC="/usr/local/matlab_func"
LOCAL_DST="/home/alex/devel/matlab-ase"
PYTHON_DIR="${LOCAL_DST}/matlab_func"

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

# ================================================
# FUNZIONI UTILITY
# ================================================

print_header() {
    echo -e "\n${BLUE}${BOLD}========================================${NC}"
    echo -e "${BLUE}${BOLD}$1${NC}"
    echo -e "${BLUE}${BOLD}========================================${NC}\n"
}

print_step() {
    echo -e "${YELLOW}[Step $1/$2]${NC} $3"
}

print_success() {
    echo -e "${GREEN}✓${NC} $1"
}

print_error() {
    echo -e "${RED}✗${NC} $1"
}

print_info() {
    echo -e "${BLUE}→${NC} $1"
}

# Mappa file MATLAB → moduli Python
get_affected_module() {
    local file=$1
    local basename=$(basename "$file" .m)

    # Mapping patterns
    case "$basename" in
        CalcoloRSN*|MediaRSN*|ConvRSN*)
            echo "RSN" ;;
        CalcoloTLHR*|CalcoloBL*|CalcoloPL*|CalcoloKLHR*|MediaTilt*|ConvTilt*)
            echo "Tilt" ;;
        arot*|asse_a*|asse_b*|qmult*|fqa*)
            echo "Tilt" ;;
        CalcoloRL*|CalcoloLL*|CalcoloPL*|Calcolo3DEL*|CalcoloCrL*)
            echo "ATD" ;;
        CalcoloBiax*|corrTuL*|CalcoloStella*)
            echo "ATD" ;;
        ConvATD*|MediaATD*)
            echo "ATD" ;;
        database*|carica_parametri*|carica_calibrazione*)
            echo "Common" ;;
        ValidaTemp*|Despiking*)
            echo "Common" ;;
        *)
            echo "Unknown" ;;
    esac
}

# ================================================
# MAIN SCRIPT
# ================================================

print_header "MATLAB → Python Sync Script with Claude Integration"

# ------------------------------------------------
# Step 1: Sincronizzazione MATLAB
# ------------------------------------------------
print_step 1 6 "Sincronizzazione file MATLAB da server remoto"
echo "   Host: ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PORT}"
echo "   Source: ${REMOTE_SRC}"
echo "   Destination: ${LOCAL_DST}"
echo ""

rsync -avzm -e "ssh -p ${REMOTE_PORT}" \
  --include='*/' \
  --include='*.m' \
  --exclude='*' \
  "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_SRC}" "${LOCAL_DST}"

if [ $? -eq 0 ]; then
    print_success "Sincronizzazione completata"
else
    print_error "Errore durante la sincronizzazione Rsync"
    exit 1
fi

# ------------------------------------------------
# Step 2: Rilevamento modifiche
# ------------------------------------------------
print_step 2 6 "Rilevamento modifiche nei file MATLAB"

cd "${PYTHON_DIR}" || exit 1

# Aggiungi file .m all'area di staging
find "${LOCAL_DST}" -type f -name "*.m" -print0 | xargs -0 git add 2>/dev/null

# Ottieni lista modifiche
CHANGED_FILES=$(git diff --staged --name-only | grep "\.m$" || echo "")
CHANGED_COUNT=$(echo "$CHANGED_FILES" | grep -v '^$' | wc -l)

if [ -z "$CHANGED_FILES" ] || [ "$CHANGED_COUNT" -eq 0 ]; then
    print_success "Nessun file MATLAB modificato - Sistema già sincronizzato"
    echo ""
    echo "Nessuna azione richiesta."
    exit 0
fi

print_success "Rilevati ${CHANGED_COUNT} file modificati"

# ------------------------------------------------
# Step 3: Analisi moduli interessati
# ------------------------------------------------
print_step 3 6 "Analisi moduli Python interessati"

declare -A affected_modules
for file in $CHANGED_FILES; do
    module=$(get_affected_module "$file")
    if [ "$module" != "Unknown" ]; then
        affected_modules[$module]=1
    fi
done

echo "   Moduli da aggiornare:"
for module in "${!affected_modules[@]}"; do
    print_info "$module"
done

# ------------------------------------------------
# Step 4: Generazione richiesta per Claude
# ------------------------------------------------
print_step 4 6 "Generazione richiesta per Claude Code"

TIMESTAMP=$(date +%Y%m%d_%H%M%S)
REQUEST_FILE="${PYTHON_DIR}/CLAUDE_SYNC_REQUEST_${TIMESTAMP}.md"

# Crea richiesta formattata
cat > "$REQUEST_FILE" <<EOF
# Richiesta Sincronizzazione MATLAB → Python

**Generato automaticamente da**: sync_server_file_enhanced.sh
**Data**: $(date +"%Y-%m-%d %H:%M:%S")
**File modificati**: ${CHANGED_COUNT}

---

## 📋 File MATLAB Modificati

\`\`\`
$CHANGED_FILES
\`\`\`

---

## 🎯 Moduli Python Interessati

EOF

for module in "${!affected_modules[@]}"; do
    case "$module" in
        RSN)
            echo "- **RSN Module** → \`src/rsn/\`" >> "$REQUEST_FILE"
            echo "  - Files: elaboration.py, conversion.py, averaging.py, db_write.py" >> "$REQUEST_FILE"
            ;;
        Tilt)
            echo "- **Tilt Module** → \`src/tilt/\`" >> "$REQUEST_FILE"
            echo "  - Files: elaboration.py, conversion.py, averaging.py, geometry.py, db_write.py" >> "$REQUEST_FILE"
            ;;
        ATD)
            echo "- **ATD Module** → \`src/atd/\`" >> "$REQUEST_FILE"
            echo "  - Files: elaboration.py, conversion.py, averaging.py, db_write.py, star_calculation.py" >> "$REQUEST_FILE"
            ;;
        Common)
            echo "- **Common Module** → \`src/common/\`" >> "$REQUEST_FILE"
            echo "  - Files: database.py, config.py, validators.py" >> "$REQUEST_FILE"
            ;;
    esac
done

cat >> "$REQUEST_FILE" <<'EOF'

---

## 📝 Preview Modifiche (prime 30 righe per file)

EOF

for file in $CHANGED_FILES; do
    # Ottieni path relativo
    rel_path=$(echo "$file" | sed "s|${LOCAL_DST}/||")

    cat >> "$REQUEST_FILE" <<EOF

### 📄 ${rel_path}

\`\`\`diff
EOF

    # Aggiungi diff (massimo 30 righe)
    git diff --staged "$file" 2>/dev/null | head -n 30 >> "$REQUEST_FILE" || echo "No diff available" >> "$REQUEST_FILE"

    echo '```' >> "$REQUEST_FILE"
done

cat >> "$REQUEST_FILE" <<'EOF'

---

## ✅ Azione Richiesta

Aggiornare il codice Python corrispondente ai file MATLAB modificati sopra.

### Workflow Suggerito

1. **Analizzare modifiche MATLAB**
   - Leggere i file modificati
   - Identificare cambiamenti negli algoritmi
   - Verificare nuovi parametri o modifiche formule

2. **Applicare modifiche Python**
   - Aggiornare funzioni Python corrispondenti
   - Mantenere coerenza con architettura esistente
   - Aggiungere type hints e documentazione

3. **Validare modifiche**
   ```bash
   # Test base
   python -m src.main CU001 A

   # Validazione completa vs MATLAB
   python -m src.validation.cli CU001 A --output validation_report.txt

   # Verifica report
   cat validation_report.txt | grep "VALIDATION"
   ```

4. **Commit e tag**
   ```bash
   git add src/
   git commit -m "Sync Python from MATLAB changes - $(date +%Y-%m-%d)"
   git tag python-sync-$(date +%Y%m%d)
   ```

---

## 📚 Riferimenti

- **Mapping completo**: [MATLAB_SYNC_GUIDE.md](MATLAB_SYNC_GUIDE.md)
- **Quick reference**: [sync_matlab_changes.md](sync_matlab_changes.md)
- **Validation guide**: [README.md#validation](README.md#validation)

---

## 💡 Note

- I file MATLAB sono già stati committati nel repository
- Questo è un commit separato che richiede sync Python
- Dopo sync Python, eseguire validazione per verificare equivalenza

---

*File generato automaticamente - Non modificare manualmente*
*Timestamp: $(date +"%Y-%m-%d %H:%M:%S")*

EOF

print_success "Richiesta salvata: ${REQUEST_FILE}"

# ------------------------------------------------
# Step 5: Commit MATLAB changes
# ------------------------------------------------
print_step 5 6 "Commit modifiche MATLAB"

SYNC_DATE=$(date +"%Y-%m-%d %H:%M:%S")
COMMIT_MSG="Sync from remote server: ${SYNC_DATE}"

git commit -m "${COMMIT_MSG}" -m "Files changed: ${CHANGED_COUNT}" -m "$(echo "$CHANGED_FILES")" 2>/dev/null

if [ $? -eq 0 ]; then
    MATLAB_COMMIT=$(git rev-parse --short HEAD)
    print_success "Commit MATLAB completato (${MATLAB_COMMIT})"
else
    print_error "Nessuna modifica da committare (potrebbe essere già committato)"
    MATLAB_COMMIT="N/A"
fi

# ------------------------------------------------
# Step 6: Summary e istruzioni
# ------------------------------------------------
print_step 6 6 "Preparazione finale"

# Copia negli appunti se xclip disponibile
CLIPBOARD_COPIED=false
if command -v xclip &> /dev/null; then
    cat "$REQUEST_FILE" | xclip -selection clipboard 2>/dev/null && CLIPBOARD_COPIED=true
    if [ "$CLIPBOARD_COPIED" = true ]; then
        print_success "Richiesta copiata negli appunti"
    fi
fi

# ================================================
# SUMMARY FINALE
# ================================================

print_header "Sincronizzazione Completata"

echo -e "${BOLD}Status:${NC}"
print_success "File MATLAB sincronizzati: ${CHANGED_COUNT}"
print_success "Commit MATLAB: ${MATLAB_COMMIT}"
print_success "File richiesta Claude: ${REQUEST_FILE}"
[ "$CLIPBOARD_COPIED" = true ] && print_success "Richiesta negli appunti: Pronta per essere incollata"

echo ""
echo -e "${BOLD}${YELLOW}⚠️  Prossimi Step - AZIONE RICHIESTA:${NC}"
echo ""
echo -e "   ${BLUE}1.${NC} Aprire Claude Code"
echo -e "   ${BLUE}2.${NC} Incollare o fornire il file:"
echo -e "      ${GREEN}${REQUEST_FILE}${NC}"
echo -e "   ${BLUE}3.${NC} Claude analizzerà e aggiornerà Python automaticamente"
echo -e "   ${BLUE}4.${NC} Validare con:"
echo -e "      ${GREEN}python -m src.validation.cli CU001 A${NC}"
echo ""

echo -e "${BOLD}File modificati:${NC}"
echo "$CHANGED_FILES" | sed 's/^/   - /'

echo ""
echo -e "${BOLD}Moduli Python da aggiornare:${NC}"
for module in "${!affected_modules[@]}"; do
    echo "   - $module"
done

echo ""
print_header "Fine"

# Opzione per aprire file in editor
echo -e "${BLUE}Premere ENTER per aprire la richiesta in editor, o CTRL+C per uscire...${NC}"
read -r

# Apri in editor (priorità: $EDITOR, nano, vi)
if [ -n "$EDITOR" ]; then
    $EDITOR "$REQUEST_FILE"
elif command -v nano &> /dev/null; then
    nano "$REQUEST_FILE"
elif command -v vi &> /dev/null; then
    vi "$REQUEST_FILE"
else
    echo "Nessun editor trovato. File disponibile in: $REQUEST_FILE"
fi

echo ""
print_success "Processo completato!"
echo ""
