package ch.retorte.intervalmusiccompositor.playlist;
import static ch.retorte.intervalmusiccompositor.commons.Utf8Bundle.getBundle;
import static ch.retorte.intervalmusiccompositor.list.BlendMode.CROSS;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import ch.retorte.intervalmusiccompositor.audiofile.IAudioFile;
import ch.retorte.intervalmusiccompositor.commons.FormatTime;
import ch.retorte.intervalmusiccompositor.commons.MessageFormatBundle;
import ch.retorte.intervalmusiccompositor.spi.ApplicationData;
/**
* @author nw
*/
public class PlaylistReport {
private MessageFormatBundle bundle = getBundle("core_imc");
private FormatTime formatTime = new FormatTime();
private static final String ITEM_DELIMITER = ", ";
private static final String RANGE_DELIMITER = "-";
private static final String EOL_DELIMITER = "\r\n";
private static final String HORIZONTAL_ROW = "================================================================================";
private ApplicationData applicationData;
public PlaylistReport(ApplicationData applicationData) {
this.applicationData = applicationData;
}
public String generateReportFor(Playlist playlist, List<IAudioFile> badTunesList) {
StringBuilder result = new StringBuilder();
appendTitle(result);
int totalPositionSeconds = 0;
int i = 0;
for (PlaylistItem playlistItem : playlist) {
int currentPositionsSeconds = totalPositionSeconds;
if (playlist.getBlendMode() == CROSS) {
currentPositionsSeconds += (int) (playlist.getBlendTime() / 2);
}
appendMusicLine(result, playlist, i, currentPositionsSeconds, playlistItem);
totalPositionSeconds += playlistItem.getExtractDurationInSeconds();
if (playlist.getBlendMode() == CROSS && !playlistItem.isSilentBreak()) {
totalPositionSeconds -= playlist.getBlendTime();
}
if (!(playlistItem instanceof BreakPlaylistItem)) {
i++;
}
}
appendBadTunesList(result, badTunesList);
return result.toString();
}
private void appendTitle(StringBuilder builder) {
String titleString = applicationData.getProgramName();
String websiteString = bundle.getString("web.website.url");
String generatedOnString = bundle.getString("imc.playlist.generated_on");
String playlistString = bundle.getString("imc.playlist.playlist_header");
String bpmNotReliableLegendString = bundle.getString("imc.playlist.bpm_not_reliable_legend");
builder.append(titleString);
builder.append(EOL_DELIMITER);
builder.append(websiteString);
builder.append(EOL_DELIMITER);
builder.append(generatedOnString);
builder.append(" ");
builder.append(getFormattedCurrentTime());
builder.append(EOL_DELIMITER);
builder.append(EOL_DELIMITER);
builder.append(playlistString);
builder.append(" (");
builder.append(bpmNotReliableLegendString);
builder.append(")");
builder.append(EOL_DELIMITER);
builder.append(HORIZONTAL_ROW);
builder.append(EOL_DELIMITER);
}
private String getFormattedCurrentTime() {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getDefault());
return dateFormat.format(new Date());
}
private void appendMusicLine(StringBuilder builder, Playlist playlist, int listPosition, int totalDurationSoFar, PlaylistItem playlistItem) {
String durationString = bundle.getString("imc.playlist.duration");
String extractString = bundle.getString("imc.playlist.extract");
String bpmNotReliableString = bundle.getString("imc.playlist.bpm_not_reliable");
if (playlistItem.isSilentBreak()) {
if (0 < playlistItem.getExtractDurationInMilliseconds()) {
builder.append(" ");
builder.append(formatTime.getStrictFormattedTime(totalDurationSoFar));
builder.append(ITEM_DELIMITER);
builder.append("[");
builder.append(durationString);
builder.append(" ");
double extractDurationInSeconds = playlistItem.getExtractDurationInSeconds();
if (playlist.getBlendMode() == CROSS) {
extractDurationInSeconds -= playlist.getBlendTime();
}
builder.append(formatTime.getStrictFormattedTime(extractDurationInSeconds));
builder.append("]");
builder.append(EOL_DELIMITER);
}
}
else {
IAudioFile audioFile = playlistItem.getAudioFile();
if (playlistItem instanceof BreakPlaylistItem) {
builder.append(" ");
}
else {
builder.append(String.format("%02d. ", listPosition + 1));
}
builder.append(formatTime.getStrictFormattedTime(totalDurationSoFar));
builder.append(ITEM_DELIMITER);
String bpmNotReliableStringInstance = bpmNotReliableString;
if (audioFile.isBpmReliable()) {
bpmNotReliableStringInstance = "";
}
builder.append("[");
builder.append(durationString);
builder.append(" ");
double extractDurationInSeconds = playlistItem.getExtractDurationInSeconds();
if (playlist.getBlendMode() == CROSS) {
extractDurationInSeconds -= playlist.getBlendTime();
}
builder.append(formatTime.getStrictFormattedTime(extractDurationInSeconds));
builder.append("]");
builder.append(ITEM_DELIMITER);
builder.append(audioFile.getDisplayName());
builder.append(" ");
builder.append("(");
builder.append(audioFile.getBpm());
builder.append(" bpm");
builder.append(bpmNotReliableStringInstance);
builder.append(")");
builder.append(ITEM_DELIMITER);
builder.append(extractString);
builder.append(" ");
builder.append(formatTime.getStrictFormattedTime(playlistItem.getExtractStartInSeconds()));
builder.append(RANGE_DELIMITER);
builder.append(formatTime.getStrictFormattedTime(playlistItem.getExtractEndInSeconds()));
builder.append(EOL_DELIMITER);
}
}
private void appendBadTunesList(StringBuilder builder, List<IAudioFile> badTunesList) {
if (badTunesList != null && !badTunesList.isEmpty()) {
String errorListString = bundle.getString("imc.playlist.errorList_header");
String reasonString = bundle.getString("imc.playlist.reason");
String reasonTooShortString = bundle.getString("imc.playlist.reason_too_short");
builder.append(EOL_DELIMITER);
builder.append(EOL_DELIMITER);
builder.append(errorListString);
builder.append(EOL_DELIMITER);
builder.append(HORIZONTAL_ROW);
builder.append(EOL_DELIMITER);
for (IAudioFile badTrack : badTunesList) {
builder.append(badTrack.getDisplayName());
builder.append(" -- ");
if (badTrack.isOK()) {
builder.append(reasonTooShortString);
}
else {
builder.append(reasonString);
builder.append(" ");
builder.append(badTrack.getErrorMessage());
}
builder.append(EOL_DELIMITER);
}
}
}
}