#!/bin/bash

# Script de test pour l'API de génération d'offres CSV
# Usage: ./test-csv-offers-api.sh

set -e

echo "================================================"
echo "🧪 Test de l'API - Génération d'Offres CSV"
echo "================================================"
echo ""

# Configuration
API_URL="http://localhost:4000/api/v1"
JWT_TOKEN=""

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

# Fonction pour afficher les résultats
print_step() {
    echo -e "${BLUE}➜${NC} $1"
}

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

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

print_info() {
    echo -e "${YELLOW}ℹ${NC} $1"
}

# Étape 1: Login
print_step "Étape 1: Authentification"
echo ""

LOGIN_RESPONSE=$(curl -s -X POST "${API_URL}/auth/login" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "admin@xpeditis.com",
    "password": "Admin123!"
  }')

JWT_TOKEN=$(echo $LOGIN_RESPONSE | jq -r '.accessToken')

if [ "$JWT_TOKEN" != "null" ] && [ ! -z "$JWT_TOKEN" ]; then
    print_success "Authentification réussie"
    print_info "Token: ${JWT_TOKEN:0:20}..."
else
    print_error "Échec de l'authentification"
    echo "Réponse: $LOGIN_RESPONSE"
    exit 1
fi

echo ""
echo "================================================"
echo ""

# Étape 2: Recherche standard (sans offres)
print_step "Étape 2: Recherche CSV standard (sans offres)"
echo ""

STANDARD_RESPONSE=$(curl -s -X POST "${API_URL}/rates/search-csv" \
  -H "Authorization: Bearer ${JWT_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "origin": "FRPAR",
    "destination": "USNYC",
    "volumeCBM": 5.0,
    "weightKG": 1000,
    "palletCount": 2
  }')

STANDARD_RESULTS=$(echo $STANDARD_RESPONSE | jq -r '.totalResults // 0')
print_info "Résultats trouvés (standard): $STANDARD_RESULTS"

if [ "$STANDARD_RESULTS" -gt "0" ]; then
    print_success "Recherche standard réussie"

    # Afficher le premier résultat
    echo ""
    print_info "Premier résultat (standard):"
    echo $STANDARD_RESPONSE | jq '.results[0] | {
      companyName: .rate.companyName,
      priceUSD: .calculatedPrice.usd,
      transitDays: .rate.transitDays,
      serviceLevel: .serviceLevel
    }' | sed 's/^/  /'
else
    print_error "Aucun résultat trouvé (vérifiez que des tarifs CSV sont chargés)"
fi

echo ""
echo "================================================"
echo ""

# Étape 3: Recherche avec génération d'offres
print_step "Étape 3: Recherche CSV avec génération d'offres (RAPID, STANDARD, ECONOMIC)"
echo ""

OFFERS_RESPONSE=$(curl -s -X POST "${API_URL}/rates/search-csv-offers" \
  -H "Authorization: Bearer ${JWT_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "origin": "FRPAR",
    "destination": "USNYC",
    "volumeCBM": 5.0,
    "weightKG": 1000,
    "palletCount": 2
  }')

OFFERS_RESULTS=$(echo $OFFERS_RESPONSE | jq -r '.totalResults // 0')
print_info "Résultats trouvés (avec offres): $OFFERS_RESULTS"

if [ "$OFFERS_RESULTS" -gt "0" ]; then
    print_success "Recherche avec offres réussie"

    # Vérifier qu'on a bien 3x plus d'offres qu'en standard
    EXPECTED_OFFERS=$((STANDARD_RESULTS * 3))
    if [ "$OFFERS_RESULTS" -eq "$EXPECTED_OFFERS" ]; then
        print_success "Nombre d'offres correct: $OFFERS_RESULTS (= $STANDARD_RESULTS tarifs × 3 offres)"
    else
        print_info "Offres générées: $OFFERS_RESULTS (attendu: $EXPECTED_OFFERS)"
    fi

    echo ""
    print_info "Première offre de chaque type:"
    echo ""

    # Afficher une offre ECONOMIC
    print_info "📦 Offre ECONOMIC (moins chère + plus lente):"
    echo $OFFERS_RESPONSE | jq '.results[] | select(.serviceLevel == "ECONOMIC") | {
      companyName: .rate.companyName,
      serviceLevel: .serviceLevel,
      priceUSD: .calculatedPrice.usd,
      originalPriceUSD: .originalPrice.usd,
      transitDays: .rate.transitDays,
      originalTransitDays: .originalTransitDays,
      priceAdjustment: "-15%",
      transitAdjustment: "+50%"
    }' | head -n 12 | sed 's/^/  /'

    echo ""

    # Afficher une offre STANDARD
    print_info "📦 Offre STANDARD (prix et transit de base):"
    echo $OFFERS_RESPONSE | jq '.results[] | select(.serviceLevel == "STANDARD") | {
      companyName: .rate.companyName,
      serviceLevel: .serviceLevel,
      priceUSD: .calculatedPrice.usd,
      originalPriceUSD: .originalPrice.usd,
      transitDays: .rate.transitDays,
      originalTransitDays: .originalTransitDays,
      priceAdjustment: "Aucun",
      transitAdjustment: "Aucun"
    }' | head -n 12 | sed 's/^/  /'

    echo ""

    # Afficher une offre RAPID
    print_info "📦 Offre RAPID (plus chère + plus rapide):"
    echo $OFFERS_RESPONSE | jq '.results[] | select(.serviceLevel == "RAPID") | {
      companyName: .rate.companyName,
      serviceLevel: .serviceLevel,
      priceUSD: .calculatedPrice.usd,
      originalPriceUSD: .originalPrice.usd,
      transitDays: .rate.transitDays,
      originalTransitDays: .originalTransitDays,
      priceAdjustment: "+20%",
      transitAdjustment: "-30%"
    }' | head -n 12 | sed 's/^/  /'

    echo ""
    echo "================================================"
    echo ""

    # Validation de la logique métier
    print_step "Validation de la logique métier"
    echo ""

    # Extraire les prix et transit pour validation
    ECONOMIC_PRICE=$(echo $OFFERS_RESPONSE | jq -r '.results[] | select(.serviceLevel == "ECONOMIC") | .calculatedPrice.usd' | head -1)
    STANDARD_PRICE=$(echo $OFFERS_RESPONSE | jq -r '.results[] | select(.serviceLevel == "STANDARD") | .calculatedPrice.usd' | head -1)
    RAPID_PRICE=$(echo $OFFERS_RESPONSE | jq -r '.results[] | select(.serviceLevel == "RAPID") | .calculatedPrice.usd' | head -1)

    ECONOMIC_TRANSIT=$(echo $OFFERS_RESPONSE | jq -r '.results[] | select(.serviceLevel == "ECONOMIC") | .rate.transitDays' | head -1)
    STANDARD_TRANSIT=$(echo $OFFERS_RESPONSE | jq -r '.results[] | select(.serviceLevel == "STANDARD") | .rate.transitDays' | head -1)
    RAPID_TRANSIT=$(echo $OFFERS_RESPONSE | jq -r '.results[] | select(.serviceLevel == "RAPID") | .rate.transitDays' | head -1)

    # Validation: RAPID plus cher que STANDARD
    if (( $(echo "$RAPID_PRICE > $STANDARD_PRICE" | bc -l) )); then
        print_success "RAPID plus cher que STANDARD ($RAPID_PRICE > $STANDARD_PRICE) ✓"
    else
        print_error "RAPID devrait être plus cher que STANDARD"
    fi

    # Validation: ECONOMIC moins cher que STANDARD
    if (( $(echo "$ECONOMIC_PRICE < $STANDARD_PRICE" | bc -l) )); then
        print_success "ECONOMIC moins cher que STANDARD ($ECONOMIC_PRICE < $STANDARD_PRICE) ✓"
    else
        print_error "ECONOMIC devrait être moins cher que STANDARD"
    fi

    # Validation: RAPID plus rapide que STANDARD
    if (( $(echo "$RAPID_TRANSIT < $STANDARD_TRANSIT" | bc -l) )); then
        print_success "RAPID plus rapide que STANDARD ($RAPID_TRANSIT < $STANDARD_TRANSIT jours) ✓"
    else
        print_error "RAPID devrait être plus rapide que STANDARD"
    fi

    # Validation: ECONOMIC plus lent que STANDARD
    if (( $(echo "$ECONOMIC_TRANSIT > $STANDARD_TRANSIT" | bc -l) )); then
        print_success "ECONOMIC plus lent que STANDARD ($ECONOMIC_TRANSIT > $STANDARD_TRANSIT jours) ✓"
    else
        print_error "ECONOMIC devrait être plus lent que STANDARD"
    fi

else
    print_error "Aucune offre générée"
    echo "Réponse: $OFFERS_RESPONSE" | jq '.'
fi

echo ""
echo "================================================"
echo ""

# Étape 4: Test avec filtre de niveau de service
print_step "Étape 4: Test avec filtre de niveau de service (RAPID uniquement)"
echo ""

FILTERED_RESPONSE=$(curl -s -X POST "${API_URL}/rates/search-csv-offers" \
  -H "Authorization: Bearer ${JWT_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "origin": "FRPAR",
    "destination": "USNYC",
    "volumeCBM": 5.0,
    "weightKG": 1000,
    "palletCount": 2,
    "filters": {
      "serviceLevels": ["RAPID"]
    }
  }')

FILTERED_RESULTS=$(echo $FILTERED_RESPONSE | jq -r '.totalResults // 0')
print_info "Résultats filtrés (RAPID uniquement): $FILTERED_RESULTS"

if [ "$FILTERED_RESULTS" -gt "0" ]; then
    print_success "Filtre de niveau de service fonctionne"

    # Vérifier que toutes les offres sont RAPID
    NON_RAPID=$(echo $FILTERED_RESPONSE | jq -r '.results[] | select(.serviceLevel != "RAPID") | .serviceLevel' | wc -l)
    if [ "$NON_RAPID" -eq "0" ]; then
        print_success "Toutes les offres sont de niveau RAPID ✓"
    else
        print_error "Certaines offres ne sont pas de niveau RAPID"
    fi
else
    print_error "Aucun résultat avec filtre RAPID"
fi

echo ""
echo "================================================"
echo ""
print_success "Tests terminés avec succès!"
echo ""
print_info "Pour tester dans Swagger UI:"
print_info "  → http://localhost:4000/api/docs"
print_info "  → Endpoint: POST /api/v1/rates/search-csv-offers"
echo ""
print_info "Documentation complète:"
print_info "  → ALGO_BOOKING_CSV_IMPLEMENTATION.md"
echo ""
echo "================================================"
