// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/******************************************************************************
* Copyright (C) 2008-2014, International Business Machines Corporation and
* others. All Rights Reserved.
*******************************************************************************
*/
//! [dtitvfmtPreDefined1]
#include <iostream>
#include "unicode/dtitvfmt.h"
#include "unicode/ustdio.h"
//! [dtitvfmtPreDefined1]

using namespace std;
using namespace icu;

static void dtitvfmtPreDefined() {
	  
	u_printf("===============================================================================\n");
	u_printf(" dtitvfmtPreDefined()\n");
    u_printf("\n");
    u_printf(" Use DateIntervalFormat to get date interval format for pre-defined skeletons:\n");
    u_printf(" yMMMd, MMMMd, jm per locale\n");
    u_printf("===============================================================================\n");
	
	//! [dtitvfmtPreDefined] 
	UFILE *out = u_finit(stdout, NULL, "UTF-8");
	UErrorCode status =U_ZERO_ERROR;
	// create 3 Date Intervals
	UnicodeString data[] = {
		UnicodeString("2007-10-10 10:10:10"),
		UnicodeString("2008-10-10 10:10:10"),
		UnicodeString("2008-11-10 10:10:10"),
		UnicodeString("2008-11-10 15:10:10")
		};
	Calendar *cal = Calendar::createInstance(status);
	cal->set(2007,10,10,10,10,10);
	UDate date1 = cal->getTime(status);
	cal->set(2008,10,10,10,10,10);
	UDate date2 = cal->getTime(status);
	cal->set(2008,11,10,10,10,10);
	UDate date3 = cal->getTime(status);
	cal->set(2008,11,10,15,10,10);
	UDate date4 = cal->getTime(status);
    DateInterval* dtitvsample[] = {
			new DateInterval(date1,date2),
            new DateInterval(date2,date3),
			new DateInterval(date3,date4),
        };
 	UnicodeString skeletons[] = {
            UnicodeString("yMMMd"),
            UnicodeString("MMMMd"),
            UnicodeString("jm"),
			0,
		};
    u_fprintf(out,"%-10s%-22s%-22s%-35s%-35s\n", "Skeleton","from","to","Date Interval in en_US","Date Interval in Ja");
	int i=0;
	UnicodeString formatEn,formatJa;
	FieldPosition pos=0;
    for (int j=0;skeletons[j]!=NULL ;j++) {
 		 u_fprintf(out,"%-10S%-22S%-22S",skeletons[j].getTerminatedBuffer(),data[i].getTerminatedBuffer(),data[i+1].getTerminatedBuffer());
         //create a DateIntervalFormat instance for given skeleton, locale
		 DateIntervalFormat* dtitvfmtEn = DateIntervalFormat::createInstance(skeletons[j], Locale::getEnglish(),status);
         DateIntervalFormat* dtitvfmtJa = DateIntervalFormat::createInstance(skeletons[j], Locale::getJapanese(),status);
		 formatEn.remove();
		 formatJa.remove();
		 //get the DateIntervalFormat
		 dtitvfmtEn->format(dtitvsample[i],formatEn,pos,status);
		 dtitvfmtJa->format(dtitvsample[i],formatJa,pos,status);
         u_fprintf(out,"%-35S%-35S\n", formatEn.getTerminatedBuffer(),formatJa.getTerminatedBuffer());     
		 delete dtitvfmtEn;
		 delete dtitvfmtJa;
         i++;
        }
	u_fclose(out);
	//! [dtitvfmtPreDefined]
}

static void dtitvfmtCustomized() {
	   
	u_printf("===============================================================================\n");
	u_printf("\n");
	u_printf(" dtitvfmtCustomized()\n");
	u_printf("\n");
    u_printf(" Use DateIntervalFormat to create customized date interval format for yMMMd, Hm");
	u_printf("\n");
    u_printf("================================================================================\n");
	//! [dtitvfmtCustomized]
	UFILE *out = u_finit(stdout, NULL, "UTF-8");
	UErrorCode status =U_ZERO_ERROR;
	UnicodeString data[] = {
		UnicodeString("2007-9-10 10:10:10"),
		UnicodeString("2007-10-10 10:10:10"),
		UnicodeString("2007-10-10 22:10:10")
		};
	// to create 2 Date Intervals
    Calendar *cal1 = Calendar::createInstance(status);
	cal1->set(2007,9,10,10,10,10);
	Calendar *cal2 = Calendar::createInstance(status);
	cal2->set(2007,10,10,10,10,10);
	Calendar *cal3 = Calendar::createInstance(status);
	cal3->set(2007,10,10,22,10,10);
	DateInterval* dtitvsample[] = {
			new DateInterval(cal1->getTime(status),cal2->getTime(status)),
            new DateInterval(cal2->getTime(status),cal3->getTime(status))
	      };
	UnicodeString skeletons[] = {
            UnicodeString("yMMMd"),
            UnicodeString("Hm"),
			0,
        };
		u_printf("%-10s%-22s%-22s%-45s%-35s\n", "Skeleton", "from","to", "Date Interval in en_US","Date Interval in Ja");
		// Create an empty DateIntervalInfo object
        DateIntervalInfo dtitvinf =  DateIntervalInfo(status);
		// Set Date Time internal pattern for MONTH, HOUR_OF_DAY
        dtitvinf.setIntervalPattern("yMMMd", UCAL_MONTH, "y 'Diff' MMM d --- MMM d",status);
        dtitvinf.setIntervalPattern("Hm", UCAL_HOUR_OF_DAY, "yyyy MMM d HH:mm ~ HH:mm",status);
		// Set fallback interval pattern
        dtitvinf.setFallbackIntervalPattern("{0} ~~~ {1}",status);
		// Get the DateIntervalFormat with the custom pattern
        UnicodeString formatEn,formatJa;
		FieldPosition pos=0;
		for (int i=0;i<2;i++){
            for (int j=0;skeletons[j]!=NULL;j++) {
			u_fprintf(out,"%-10S%-22S%-22S", skeletons[i].getTerminatedBuffer(),data[j].getTerminatedBuffer(), data[j+1].getTerminatedBuffer());
            DateIntervalFormat* dtitvfmtEn = DateIntervalFormat::createInstance(skeletons[i],Locale::getEnglish(),dtitvinf,status);
            DateIntervalFormat* dtitvfmtJa = DateIntervalFormat::createInstance(skeletons[i],Locale::getJapanese(),dtitvinf,status);
			formatEn.remove();
			formatJa.remove();
			dtitvfmtEn->format(dtitvsample[j],formatEn,pos,status);
			dtitvfmtJa->format(dtitvsample[j],formatJa,pos,status);
			u_fprintf(out,"%-45S%-35S\n", formatEn.getTerminatedBuffer(),formatJa.getTerminatedBuffer());    
            }
       }
	u_fclose(out);
	//! [dtitvfmtCustomized]
}

int main (int argc, char* argv[])
{
	dtitvfmtPreDefined();
	dtitvfmtCustomized();
	return 0;
}
