// FUNCTIONAL!!!!

// it is starting at the right date.
// need to do so once it passes one month, in the next month it starts at 01
// IT ALSO FINDS PALINDROME
// it is now going through the months....

// NEED TO ADDRESS FOR NEXT MONTH, IT STARTS AGAIN AT SAME POSITION - RESOLVED!!

//At the end of the year, it is currently starting same month again.  Need to get it to roll over year.... and month - resolved

// ALL COMPLETE?

/*
Online Java - IDE, Code Editor, Compiler

Online Java is a quick and easy tool that helps you to build, compile, test your programs online.
*/

abstract class checkDate
{
    //abstract void createDate();
    //abstract void checkPalindrome();
    //abstract void checkLeapYear();
    
}


public class Main extends checkDate
{
        static int year;
        static String yearString;
        static String finalDate;
        static Object days;
        static Object month;
        static Object objectLeapYearFebruaryDays;
        static int intLeapYearFebruaryDays;
        static boolean leapYear;
        static String temp;
        static Object prefixZero = "0";
        static int daysMonth;
        static int monthcount;
        static String formattedMonth;
        
        static int ddInt;
        static int mmInt;
        
        static String ddString;
        static String mmString;
        
        static boolean processedFirstMonth=false;
        
        
    public static void checkPalindrome(String finalDate)
    {
        
        //System.out.println("CHECKING!");
        String reverseString;
        
          //THIS FAILS TO PICK UP PALINDROME, SO OWN CODE IS REQUIRED
        int j=0;
        
        StringBuffer sb = new StringBuffer();
        
        for (int i=finalDate.length()-1; i>=0; i--)
        {
            
            sb.append(finalDate.charAt(i));
            j++;
        }
        
        //System.out.println("CHECKING");
        reverseString=sb.toString();
        
        if(finalDate.equalsIgnoreCase(reverseString))
        {
            System.out.println("Palindrome");
            System.out.println("***" + finalDate + "***");
            
        }
        
    }
    
    
    enum Months
    {
        JAN (31,1), 
        FEB(28,2),
        MAR(31,3),
        APR(30,4),
        MAY(31,5),
        JUN(30,6),
        JUL(31,7),
        AUG(31,8),
        SEPT(30,9),
        OCT(31,10),
        NOV(30,11),
        DEC(31,12);
        
        public int days;
        public int month;
        
        Months (int days, int month)
        {
            this.days=days;
            this.month=month;
        }
    }
   
    public static void main(String[] args) {
        System.out.println("Welcome to Online IDE!! Happy Coding :)");
        
        palindromicDates("01/01/2020", 102);
    }
    
    public static int palindromicDates (String date, int years)
    {
        int startPos = date.length()-4;
        
        createDate(startPos, date, years);
        return 1;
    }
    
    
    public static void createDate(int startPos, String date, int years)
    {
        yearString = date.substring(startPos, date.length());
        
        year = Integer.valueOf(yearString);
        
        ddString = date.substring(0,2);
        ddInt = Integer.valueOf(ddString);
        
        mmString = date.substring(3,5);     // This will get section such  as     /   04   /
        mmInt = Integer.valueOf(mmString)-1;
        boolean newYearRollOver=false;
        
        // for every year
        
        for (int i=0; i<=years; i++)  
        
        // perhaps need to flip the days first and then months nested inside?
        
        {
            newYearRollOver=false;
            leapYear=false;
            
            //System.out.println("This is the year: " + year);
            
            //for every month in n years
            
            monthcount=0;
            
            do
            {
            
            // for every month   (can not nest something inside here.......)
            for (Months m: Months.values())
        {
            //System.out.println("How many times!!");   // this runs 12 times
            
            /*
            if (m.name()=="NOVEMBER")  // need a switch statement here... to ensure that a prefix of 0 is inserted 
            //for months January - September
            {
                
            }
            */
            
            
            switch (mmInt)
            {
                case 0:
                    formattedMonth = "01";
                    System.out.println(m.values()[mmInt].name());
                    break;
                    
                case 1:
                    formattedMonth = "02";
                    System.out.println(m.values()[mmInt].name());
                    break;
                    
                case 2:
                    formattedMonth = "03";
                    System.out.println(m.values()[mmInt].name());
                    break;
                    
                case 3:
                    formattedMonth = "04";
                    System.out.println(m.values()[mmInt].name());
                    break;
                    
                case 4:
                    formattedMonth = "05";
                    System.out.println(m.values()[mmInt].name());
                    break;
                    
                 case 5:
                    formattedMonth = "06";
                    System.out.println(m.values()[mmInt].name());
                    break;
                    
                    case 6:
                    formattedMonth = "07";
                    System.out.println(m.values()[mmInt].name());
                    break;
                    
                    case 7:
                    formattedMonth = "08";
                    System.out.println(m.values()[mmInt].name());
                    break;
                    
                    case 8:
                    formattedMonth = "09";
                    System.out.println(m.values()[mmInt].name());
                    break;
                    
                    case 9:
                    formattedMonth = "10";
                    System.out.println(m.values()[mmInt].name());
                    break;
                    
                    case 10:
                    formattedMonth = "11";
                    System.out.println(m.values()[mmInt].name());
                    break;
                    
                    case 11:
                    formattedMonth = "12";
                    System.out.println(m.values()[mmInt].name());
                    break;
                    
            }
            
            if (year%4==0)    //leap year
            {
                objectLeapYearFebruaryDays = m.FEB.days;
                
                intLeapYearFebruaryDays = (int) (objectLeapYearFebruaryDays)+1;
                
                leapYear=true;
                
            }
            
            //System.out.println("This is the month:" + m.name());
            
            days = m.days;
            
            
            if (m.name()=="FEB" && leapYear)
            {
                
                //intDaysFebruaryLeap = (int) days + 1;
                
                days = (Object) intLeapYearFebruaryDays;
                
            }
            if (leapYear)
            {
                //System.out.println("LEAP YEAR!!!!!");
            }
            
            // for every day
            
            daysMonth = (int) days;
            
            
            if (processedFirstMonth)
            {
                ddInt=1;
            }
            
            
            for (int k=ddInt; k<=(int) daysMonth; k++)
            {
                //System.out.println("*******reach here!!!! " + daysMonth);
                //System.out.println("This is k: " + k);
                
                month = m.month;
                temp="";
                
                temp = Integer.toString(k);
                
                if (k<10)
                {
                    //temp is a string of following objects
                    temp = prefixZero.toString() + Integer.toString(k);
                    
                    // the value taken for the day will be cast back to int
                    
                    //aa = Integer.valueOf(temp);
                    // + prefixZero;
                }
                
                //System.out.println("This is the day: " + temp);
            
           finalDate = temp + "/" + formattedMonth + "/" +  year;
            
            System.out.println("This is final date: " + finalDate);
            
            checkPalindrome(finalDate);
            
            //System.out.println(temp);
            //System.out.println(formattedMonth);
            
            if (k==daysMonth && formattedMonth=="12")
            {
                year++;
                
                mmInt=0;  // this starts again new year
                
                newYearRollOver=true;
                
            }
                
            }
            processedFirstMonth=true;
        
        if (!newYearRollOver)
        {
            mmInt=mmInt+1;    
        }
            
        }
        
        monthcount++;
        
        }while(monthcount<=12);
        
        year++;
        //System.out.println("YEAR IS NOW:$$$$ " + year);
        }
   
        //return 1;
    }
    
}
