/*
 *******************************************************************************
 * Copyright (C) 2013, International Business Machines Corporation and         *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.samples.text.datetimepatterngenerator;
// ---getBestPatternExample
import java.util.Date;

import com.ibm.icu.text.DateFormat;
import com.ibm.icu.text.DateTimePatternGenerator;
import com.ibm.icu.text.SimpleDateFormat;
import com.ibm.icu.util.GregorianCalendar;
import com.ibm.icu.util.TimeZone;
import com.ibm.icu.util.ULocale;
// ---getBestPatternExample
/**
 * com.ibm.icu.text.DateTimePatternGenerator Sample Code
 */
public class DateTimePatternGeneratorSample {
    
    public static void main (String[] args) {
        getBestPatternExample();
        addPatternExample();
        replaceFieldTypesExample();
    }
    
    public static void   getBestPatternExample() {
        System.out.println("========================================================================");
        System.out.println(" getBestPatternExample()");
        System.out.println();
        System.out.println(" Use DateTimePatternGenerator to create customized date/time pattern:");
        System.out.println(" yQQQQ,yMMMM, MMMMd, hhmm, jjmm per locale");
        System.out.println("========================================================================");
     // ---getBestPatternExample
        final String[] skeletons = {
                "yQQQQ", // year + full name of quarter, i.e., 4th quarter 1999
                "yMMMM", // year + full name of month, i.e., October 1999
                "MMMMd", // full name of month + day of the month, i.e., October 25
                "hhmm",  // 12-hour-cycle format, i.e., 1:32 PM
                "jjmm"   // preferred hour format for the given locale, i.e., 24-hour-cycle format for fr_FR
                };
        final ULocale[] locales = {
                new ULocale ("en_US"),
                new ULocale ("fr_FR"),
                new ULocale ("zh_CN"),
                };
        DateTimePatternGenerator dtfg = null;
        Date date= new GregorianCalendar(1999,9,13,23,58,59).getTime();
        System.out.printf("%-20s%-35s%-35s%-35s\n\n", "Skeleton", "en_US", "fr_FR","zh_CN");
        for (String skeleton:skeletons) {
             System.out.printf("%-20s", skeleton);
            for (ULocale locale:locales) {
                // create a DateTimePatternGenerator instance for given locale
                dtfg = DateTimePatternGenerator.getInstance(locale);
                // use getBestPattern method to get the best pattern for the given skeleton
                String pattern = dtfg.getBestPattern(skeleton);
                // Constructs a SimpleDateFormat with the best pattern generated above and the given locale
                SimpleDateFormat sdf = new SimpleDateFormat(pattern, locale);
                // Get the format of the given date
                System.out.printf("%-35s",sdf.format(date));
            }
            System.out.println("\n");
        }
        /** output of the sample code:
         *************************************************************************************************************
           Skeleton            en_US                              fr_FR                              zh_CN

           yQQQQ               4th quarter 1999                   4e trimestre 1999                  1999年第四季度

           yMMMM               October 1999                       octobre 1999                       1999年10月 

           MMMMd               October 13                         13 octobre                         10月13日 
           
           hhmm                11:58 PM                           11:58 PM                           下午11:58

           jjmm                11:58 PM                           23:58                              下午11:58

        **************************************************************************************************************/
        // Use DateTime.getPatternInstance to produce the same Date/Time format with predefined constant field value
        final String[] dtfskeleton = {
                DateFormat.YEAR_QUARTER, // year + full name of quarter, i.e., 4th quarter 1999
                DateFormat.YEAR_MONTH,   // year + full name of month, i.e., October 1999
                DateFormat.MONTH_DAY     // full name of month + day of the month, i.e., October 25
                };
        System.out.printf("%-20s%-35s%-35s%-35s\n\n", "Skeleton", "en_US", "fr_FR","zh_CN");
        for (String skeleton:dtfskeleton) {
            System.out.printf("%-20s", skeleton);
            for (ULocale locale:locales) {
                // Use DateFormat.getPatternInstance to get the date/time format for the locale,
                // and apply the format to the given date
                String df=DateFormat.getPatternInstance(skeleton,locale).format(date);
                System.out.printf("%-35s",df);
            }
            System.out.println("\n");
        }

        /** output of the sample code:
         ************************************************************************************************************
         Skeleton            en_US                              fr_FR                              zh_CN

         yQQQQ               4th quarter 1999                   4e trimestre 1999                  1999年第四季度

         yMMMM               October 1999                       octobre 1999                       1999年10月

         MMMMd               October 13                         13 octobre                         10月13日 
         ************************************************************************************************************/
// ---getBestPatternExample
}

    public static void addPatternExample() {
        System.out.println("========================================================================");
        System.out.println(" addPatternExample()");
        System.out.println();
        System.out.println(" Use addPattern API to add new '. von' to existing pattern");
        System.out.println("========================================================================");
    // ---addPatternExample
        Date date= new GregorianCalendar(1999,9,13,23,58,59).getTime();
        ULocale locale = ULocale.FRANCE;
        // Create an DateTimePatternGenerator instance for the given locale
        DateTimePatternGenerator gen = DateTimePatternGenerator.getInstance(locale);
        SimpleDateFormat format = new SimpleDateFormat(gen.getBestPattern("MMMMddHmm"), locale);
        DateTimePatternGenerator.PatternInfo returnInfo = new DateTimePatternGenerator.PatternInfo();
        // Add '. von' to the existing pattern
        gen.addPattern("dd'. von' MMMM", true, returnInfo);
        // Apply the new pattern
        format.applyPattern(gen.getBestPattern("MMMMddHmm"));
        System.out.println("New Pattern for FRENCH: "+format.toPattern());
        System.out.println("Date Time in new Pattern: "+format.format(date));
      
        /** output of the sample code:
        **************************************************************************************************
         New Pattern for FRENCH: dd. 'von' MMMM HH:mm
         Date Time in new Pattern: 13. von octobre 23:58
     
        *************************************************************************************************/
    // ---addPatternExample
}

    public static void replaceFieldTypesExample() {
        // Use repalceFieldTypes API to replace zone 'zzzz' with 'vvvv'
        System.out.println("========================================================================");
        System.out.println(" replaceFieldTypeExample()");
        System.out.println();
        System.out.println(" Use replaceFieldTypes API to replace zone 'zzzz' with 'vvvv");
        System.out.println("========================================================================");
    // ---replaceFieldTypesExample
        Date date= new GregorianCalendar(1999,9,13,23,58,59).getTime();
        TimeZone zone = TimeZone.getTimeZone("Europe/Paris");
        ULocale locale = ULocale.FRANCE;
        DateTimePatternGenerator gen = DateTimePatternGenerator.getInstance(locale);
        SimpleDateFormat format = new SimpleDateFormat("EEEE d MMMM y HH:mm:ss zzzz",locale);
        format.setTimeZone(zone);
        String pattern = format.toPattern();
        System.out.println("Pattern before replacement:");
        System.out.println(pattern);
        System.out.println("Date/Time format in fr_FR:");
        System.out.println(format.format(date));
        // Replace zone "zzzz" in the pattern with "vvvv"
        String newPattern = gen.replaceFieldTypes(pattern, "vvvv");
        // Apply the new pattern
        format.applyPattern(newPattern);
        System.out.println("Pattern after replacement:");
        System.out.println(newPattern);
        System.out.println("Date/Time format in fr_FR:");
        System.out.println(format.format(date));

        /** output of the sample code:
        ***************************************************************************************************
         Pattern before replacement:
         EEEE d MMMM y HH:mm:ss zzzz
         Date/Time format in fr_FR:
         jeudi 14 octobre 1999 05:58:59 heure avancée d’Europe centrale
         Pattern after replacement:
         EEEE d MMMM y HH:mm:ss vvvv
         Date/Time format in fr_FR:
         jeudi 14 octobre 1999 05:58:59 heure de l’Europe centrale

        **************************************************************************************************/
 // ---replaceFieldTypesExample
    }
}