package de.westnordost.streetcomplete.quests.opening_hours;
import android.content.res.Resources;
import java.text.DateFormatSymbols;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import de.westnordost.streetcomplete.R;
public class Weekdays
{
// in ISO 8601 order
private static final String[] OSM_ABBR_WEEKDAYS = {"Mo","Tu","We","Th","Fr","Sa","Su","PH"};
private static final int PUBLIC_HOLIDAY = 7;
private static final int WEEKDAYS_VALUES = OSM_ABBR_WEEKDAYS.length;
private static final NumberSystem WEEKDAY_NUMBER_SYSTEM = new NumberSystem(0, 6);
private boolean[] data = new boolean[WEEKDAYS_VALUES];
public static String[] getNames(Resources r)
{
DateFormatSymbols symbols = DateFormatSymbols.getInstance();
String[] result = Arrays.copyOf(toIso8601Order(symbols.getWeekdays()),WEEKDAYS_VALUES);
result[PUBLIC_HOLIDAY] = r.getString(R.string.quest_openingHours_public_holidays);
return result;
}
public static String[] getShortNames(Resources r)
{
DateFormatSymbols symbols = DateFormatSymbols.getInstance();
String[] result = Arrays.copyOf(toIso8601Order(symbols.getShortWeekdays()),WEEKDAYS_VALUES);
result[PUBLIC_HOLIDAY] = r.getString(R.string.quest_openingHours_public_holidays_short);
return result;
}
private static String[] toIso8601Order(String[] javaCalendarOrder)
{
String[] result = new String[7];
int shift = 1;
for(int i = 0; i < 7; ++i)
{
result[i] = javaCalendarOrder[1+(i+shift)%7];
}
return result;
}
public Weekdays()
{
}
public Weekdays(boolean[] selection)
{
for(int i=0; i<selection.length && i <data.length; ++i)
{
data[i] = selection[i];
}
}
public boolean[] getSelection()
{
return Arrays.copyOf(data, data.length);
}
@Override public String toString()
{
return toStringUsing(OSM_ABBR_WEEKDAYS, ",", "-");
}
public String toLocalizedString(Resources r)
{
return toStringUsing(Weekdays.getShortNames(r), ", ", "–");
}
private String toStringUsing(String[] names, String seperator, String range)
{
StringBuilder sb = new StringBuilder();
boolean first = true;
for(CircularSection section : getWeekdaysAsCircularSections())
{
if(!first) sb.append(seperator);
else first = false;
sb.append(names[section.getStart()]);
if (section.getStart() != section.getEnd())
{
if(WEEKDAY_NUMBER_SYSTEM.getSize(section) > 2)
{
sb.append(range);
}
else
{
sb.append(seperator);
}
sb.append(names[section.getEnd()]);
}
}
for(int i = 7; i < data.length; ++i)
{
if(!data[i]) continue;
if(!first) sb.append(seperator);
else first = false;
sb.append(names[i]);
}
return sb.toString();
}
private List<CircularSection> getWeekdaysAsCircularSections()
{
List<CircularSection> result = new ArrayList<>();
Integer currentStart = null;
for(int i = 0; i < 7; ++i)
{
if(currentStart == null)
{
if(data[i]) currentStart = i;
}
else
{
if(!data[i])
{
result.add(new CircularSection(currentStart, i-1));
currentStart = null;
}
}
}
// section that goes until the end
if(currentStart != null)
{
result.add(new CircularSection(currentStart, 6));
}
return WEEKDAY_NUMBER_SYSTEM.merged(result);
}
@Override public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
return Arrays.equals(data, ((Weekdays) o).data);
}
@Override public int hashCode()
{
return Arrays.hashCode(data);
}
}