/**
* ============================================
* MAP.JS - Carte des places de parking
* Smart Parking - BTS CIEL IR
* ============================================
*/
// Configuration
const MAP_CONFIG = {
totalSpots: 10, // Nombre total de places
updateInterval: 5000 // Intervalle de mise à jour
};
// État des places
let spotsState = {
spots: [],
selectedSpot: null
};
// Types de places
const SPOT_STATUS = {
FREE: 'free',
OCCUPIED: 'occupied',
RESERVED: 'reserved'
};
// Initialisation
document.addEventListener('DOMContentLoaded', () => {
console.log('🗺️ Initialisation de la carte...');
initParkingMap();
});
/**
* Initialise la carte du parking
*/
function initParkingMap() {
// Charger les places depuis le stockage local ou créer les places par défaut
loadSpots();
// Rendre la carte
renderMap();
// Mettre à jour les statistiques
updateStats();
// Mettre à jour le formulaire de réservation
updateReservationForm();
// Démarrer la simulation (si pas admin)
if (!isAdmin()) {
startSimulation();
}
}
/**
* Charge les places
*/
function loadSpots() {
const stored = localStorage.getItem('smart_parking_spots');
if (stored) {
spotsState.spots = JSON.parse(stored);
} else {
// Créer les places par défaut
createDefaultSpots();
}
}
/**
* Crée les places par défaut
*/
function createDefaultSpots() {
spotsState.spots = [];
for (let i = 1; i <= MAP_CONFIG.totalSpots; i++) {
// Distribution: 60% libre, 25% occupé, 15% réservé
const rand = Math.random();
let status = SPOT_STATUS.FREE;
if (rand > 0.85) {
status = SPOT_STATUS.RESERVED;
} else if (rand > 0.60) {
status = SPOT_STATUS.OCCUPIED;
}
spotsState.spots.push({
id: i,
number: i,
status: status,
lastUpdate: new Date().toISOString(),
sensorId: `SENSOR_${String(i).padStart(3, '0')}`
});
}
saveSpots();
}
/**
* Sauvegarde les places
*/
function saveSpots() {
localStorage.setItem('smart_parking_spots', JSON.stringify(spotsState.spots));
}
/**
* Rend la carte
*/
function renderMap() {
const mapContainer = document.getElementById('parkingMap');
if (!mapContainer) return;
mapContainer.innerHTML = spotsState.spots.map(spot => `
${spot.number}${getStatusIcon(spot.status)}
`).join('');
}
/**
* Gère le clic sur une place
*/
function handleSpotClick(spotId) {
const spot = spotsState.spots.find(s => s.id === spotId);
if (!spot) return;
spotsState.selectedSpot = spot;
showSpotDetails(spot);
}
/**
* Affiche les détails d'une place
*/
function showSpotDetails(spot) {
const container = document.getElementById('spotDetails');
if (!container) return;
const isReserved = spot.status === SPOT_STATUS.RESERVED;
const reservation = isReserved ? findReservationForSpot(spot.id) : null;
container.innerHTML = `
NuméroPlace ${spot.number}
État
${getStatusLabel(spot.status)}
Capteur${spot.sensorId}
Dernière mise à jour${formatDate(spot.lastUpdate)}