/**
* Copyright (C) 2013 Romain Guefveneu.
*
* This file is part of naonedbus.
*
* Naonedbus is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Naonedbus is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.naonedbus.rest.controller.impl;
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import net.naonedbus.bean.Arret;
import net.naonedbus.bean.horaire.Horaire;
import net.naonedbus.rest.UrlBuilder;
import net.naonedbus.rest.container.HoraireContainer;
import net.naonedbus.rest.container.HoraireContainer.HoraireNode;
import net.naonedbus.rest.controller.RestController;
import org.joda.time.DateMidnight;
import org.joda.time.MutableDateTime;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.annotation.SuppressLint;
import android.text.TextUtils;
@SuppressLint("SimpleDateFormat")
public class HoraireController extends RestController<HoraireContainer> {
private static final String LOG_TAG = HoraireController.class.getSimpleName();
private static final String TAG_CODE_COULEUR = "codeCouleur";
private static final String TAG_PLAGE_SERVICE = "plageDeService";
private static final String TAG_NOTES = "notes";
private static final String TAG_NOTES_CODE = "code";
private static final String TAG_NOTES_LIBELLE = "libelle";
private static final String TAG_HORAIRES = "horaires";
private static final String TAG_HORAIRES_HEURE = "heure";
private static final String TAG_HORAIRES_PASSAGE = "passages";
private static final String PATH = "https://open.tan.fr/ewp/horairesarret.json";
private final SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd");
private final SimpleDateFormat mDateDecode = new SimpleDateFormat("H'h'mm");
public HoraireController() {
super("horaires");
mDateDecode.setTimeZone(TimeZone.getTimeZone("GMT"));
}
/**
* Récupérer les horaires depuis le WebService.
*
* @throws IOException
* @throws MalformedURLException
*/
public synchronized List<Horaire> getAllFromWeb(final Arret arret, final DateMidnight date) throws IOException {
final UrlBuilder url = new UrlBuilder(PATH);
final List<HoraireNode> horaires;
List<Horaire> result = null;
url.addSegment(arret.getCodeArret());
url.addSegment(arret.getCodeLigne());
url.addSegment(arret.getCodeSens());
url.addSegment(mDateFormat.format(date.toDate()));
final HoraireContainer content = parseJsonObject(url.getUrl());
MutableDateTime mutableDateTime = new MutableDateTime(date);
if (content != null) {
horaires = content.horaires;
result = new ArrayList<Horaire>();
int lastHour = Integer.MIN_VALUE;
// Transformation des horaires TAN en horaire naonedbus.
for (final HoraireNode horaireTan : horaires) {
final int hour = Integer.parseInt(horaireTan.heure.replaceAll("[^\\d.]", ""));
mutableDateTime.setHourOfDay(hour);
// Changement de jour
if (hour < lastHour) {
mutableDateTime.addDays(1);
}
lastHour = hour;
for (final String passage : horaireTan.passages) {
int minute = Integer.parseInt(passage.replaceAll("[^\\d.]", ""));
mutableDateTime.setMinuteOfHour(minute);
final Horaire horaire = new Horaire();
horaire.setJour(date);
horaire.setHoraire(mutableDateTime.toDateTime());
horaire.setTerminus(parseTerminus(passage, content.notes));
horaire.setSection(new DateMidnight(horaire.getHoraire()));
result.add(horaire);
}
}
}
return result;
}
private String parseTerminus(final String minute, final Map<String, String> notes) {
if (TextUtils.isDigitsOnly(minute)) {
return null;
}
final String code = minute.replaceAll("[0-9]", "");
return notes.get(code);
}
@Override
protected HoraireContainer parseJsonObject(final JSONObject object) throws JSONException {
final HoraireContainer container = new HoraireContainer();
if (object.has(TAG_PLAGE_SERVICE))
container.plageDeService = object.getString(TAG_PLAGE_SERVICE);
if (object.has(TAG_CODE_COULEUR))
container.codeCouleur = object.getString(TAG_CODE_COULEUR);
if (object.has(TAG_NOTES))
container.notes = parseNotes(object.getJSONArray(TAG_NOTES));
if (object.has(TAG_HORAIRES))
container.horaires = parseHoraires(object.getJSONArray(TAG_HORAIRES));
return container;
}
private Map<String, String> parseNotes(final JSONArray array) throws JSONException {
final Map<String, String> notes = new HashMap<String, String>();
JSONObject object;
for (int i = 0; i < array.length(); i++) {
object = array.getJSONObject(i);
String code = null;
String libelle = null;
if (object.has(TAG_NOTES_CODE))
code = object.getString(TAG_NOTES_CODE);
if (object.has(TAG_NOTES_LIBELLE))
libelle = object.getString(TAG_NOTES_LIBELLE);
notes.put(code, libelle);
}
return notes;
}
private List<HoraireNode> parseHoraires(final JSONArray array) throws JSONException {
final List<HoraireNode> horaires = new ArrayList<HoraireNode>();
JSONObject object;
for (int i = 0; i < array.length(); i++) {
object = array.getJSONObject(i);
final HoraireNode horaire = new HoraireNode();
if (object.has(TAG_HORAIRES_HEURE))
horaire.heure = object.getString(TAG_HORAIRES_HEURE);
if (object.has(TAG_HORAIRES_PASSAGE))
horaire.passages = parsePassages(object.getJSONArray(TAG_HORAIRES_PASSAGE));
horaires.add(horaire);
}
return horaires;
}
private List<String> parsePassages(final JSONArray passagesArray) throws JSONException {
final List<String> passages = new ArrayList<String>();
for (int i = 0; i < passagesArray.length(); i++) {
passages.add(passagesArray.getString(i));
}
return passages;
}
@Override
protected JSONObject toJsonObject(final HoraireContainer item) throws JSONException {
return null;
}
}