package io.github.memfis19.cadar.settings;
import android.support.annotation.LayoutRes;
import android.support.v4.util.Pair;
import java.util.Calendar;
import java.util.List;
import io.github.memfis19.cadar.R;
import io.github.memfis19.cadar.data.entity.Event;
import io.github.memfis19.cadar.internal.configuration.BaseCalendarConfiguration;
import io.github.memfis19.cadar.internal.configuration.BaseCalendarConfigurationBuilder;
import io.github.memfis19.cadar.internal.process.EventsProcessor;
import io.github.memfis19.cadar.internal.ui.list.adapter.decorator.factory.EventDecoratorFactory;
import io.github.memfis19.cadar.internal.ui.list.adapter.decorator.factory.MonthDecoratorFactory;
import io.github.memfis19.cadar.internal.ui.list.adapter.decorator.factory.WeekDecoratorFactory;
/**
* Created by serg on 13.09.16.
*/
public class ListCalendarConfiguration extends BaseCalendarConfiguration {
private EventDecoratorFactory eventDecoratorFactory;
private WeekDecoratorFactory weekDecoratorFactory;
private MonthDecoratorFactory monthDecoratorFactory;
private EventsProcessor<Pair<Calendar, Calendar>, List<Event>> eventsProcessor;
@LayoutRes
private int
eventLayoutId = R.layout.event_layout,
weekLayoutId = R.layout.week_title_layout,
monthLayoutId = R.layout.list_calendar_item_layout;
private ListCalendarConfiguration() {
super();
}
public static class Builder extends BaseCalendarConfigurationBuilder<ListCalendarConfiguration> {
private ListCalendarConfiguration listCalendarConfiguration;
public Builder() {
super();
listCalendarConfiguration = new ListCalendarConfiguration();
}
public Builder setEventLayout(@LayoutRes int layoutId, EventDecoratorFactory eventDecoratorFactory) {
listCalendarConfiguration.eventLayoutId = layoutId;
listCalendarConfiguration.eventDecoratorFactory = eventDecoratorFactory;
return this;
}
public Builder setEventsProcessor(EventsProcessor<Pair<Calendar, Calendar>, List<Event>> eventsProcessor) {
listCalendarConfiguration.eventsProcessor = eventsProcessor;
return this;
}
public Builder setWeekLayout(@LayoutRes int layoutId, WeekDecoratorFactory weekDecoratorFactory) {
listCalendarConfiguration.weekLayoutId = layoutId;
listCalendarConfiguration.weekDecoratorFactory = weekDecoratorFactory;
return this;
}
public Builder setMonthLayout(@LayoutRes int layoutId, MonthDecoratorFactory monthDecoratorFactory) {
listCalendarConfiguration.monthLayoutId = layoutId;
listCalendarConfiguration.monthDecoratorFactory = monthDecoratorFactory;
return this;
}
@Override
public ListCalendarConfiguration build() {
if (eventProcessingEnabled && eventCalculator == null)
throw new IllegalStateException("Configuration set to process events. But event processor not passed or null.");
listCalendarConfiguration.eventProcessingEnabled = eventProcessingEnabled;
listCalendarConfiguration.eventCalculator = eventCalculator;
if (eventProcessingEnabled && eventFactory == null)
throw new NullPointerException("Event factory is null. Please setup it.");
listCalendarConfiguration.eventFactory = eventFactory;
listCalendarConfiguration.eventCalculator.setEventFactory(listCalendarConfiguration.eventFactory);
if (periodType != Calendar.MONTH && periodType != Calendar.YEAR)
throw new IllegalArgumentException("Period type should be Calendar.MONTH or Calendar.YEAR only.");
if (periodValue < 1)
throw new IllegalArgumentException("Period value should be more then 1.");
if (periodType == Calendar.MONTH && periodValue < 3)
throw new IllegalStateException("In case with Calendar.MONTH period type, minimum value should be GE 3.");
listCalendarConfiguration.periodType = periodType;
listCalendarConfiguration.periodValue = periodValue;
return listCalendarConfiguration;
}
}
public EventDecoratorFactory getEventDecoratorFactory() {
return eventDecoratorFactory;
}
public WeekDecoratorFactory getWeekDecoratorFactory() {
return weekDecoratorFactory;
}
public MonthDecoratorFactory getMonthDecoratorFactory() {
return monthDecoratorFactory;
}
public int getEventLayoutId() {
return eventLayoutId;
}
public int getWeekLayoutId() {
return weekLayoutId;
}
public int getMonthLayoutId() {
return monthLayoutId;
}
public EventsProcessor<Pair<Calendar, Calendar>, List<Event>> getEventsProcessor() {
return eventsProcessor;
}
}