/*
 * Copyright (c) 2017, University of Oslo
 *
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 * Neither the name of the HISP project nor the names of its contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package org.hisp.dhis.android.core.period;

import java.util.Calendar;
import java.util.Date;

class YearlyPeriodGenerator extends AbstractPeriodGenerator {
    private final int firstMonth;

    YearlyPeriodGenerator(Calendar calendar, PeriodType periodType, int firstMonth, String suffix) {
        super(calendar, "yyyy'" + suffix + "'", periodType);
        this.firstMonth = firstMonth;
    }

    @Override
    protected void setCalendarToStartDate() {
        calendar.set(Calendar.DATE, 1);
        if (calendar.get(Calendar.MONTH) < firstMonth) {
            calendar.add(Calendar.YEAR, -1);
        }
        calendar.set(Calendar.MONTH, firstMonth);
    }

    @Override
    protected void setCalendarToFirstPeriod(int count) {
        calendar.add(Calendar.YEAR, -count + 1);
    }

    @Override
    protected Date getEndDateAndUpdateCalendar() {
        calendar.add(Calendar.YEAR, 1);
        calendar.add(Calendar.MILLISECOND, -1);
        return calendar.getTime();
    }
}

@@ -1736,16 +1736,49 @@
 stMonth;
+%0A    private final String suffix;
 %0A%0A    Ye
@@ -1905,24 +1905,8 @@
 yyyy
-'%22 + suffix + %22'
 %22, p
@@ -1951,24 +1951,54 @@
 firstMonth;%0A
+        this.suffix = suffix;%0A
     %7D%0A%0A    @
@@ -2204,16 +2204,16 @@
       %7D%0A
-
         
@@ -2253,32 +2253,181 @@
 tMonth);%0A    %7D%0A%0A
+    @Override%0A    protected String generateId() %7B%0A        String year = idFormatter.format(calendar.getTime());%0A        return year + suffix;%0A    %7D%0A%0A
     @Override%0A  

fix id generation in YearlyPeriodGenerator