/*
 * Copyright 2014 Tomi Virtanen
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.tltv.gantt.client;

import java.util.Date;
import java.util.Locale;

import com.google.gwt.i18n.client.TimeZone;
import com.google.gwt.i18n.shared.DateTimeFormat;

public interface LocaleDataProvider {

    /**
     * Returns month names in order starting from January.
     * 
     * @return Locale dependent month names
     */
    String[] getMonthNames();

    /**
     * Returns weekdays in order starting from Sunday.
     * 
     * @return Locale dependent weekday names
     */
    String[] getWeekdayNames();

    /**
     * Returns first day of week. Allowed values are 1-7. 1 is Sunday.
     * 
     * @return Integer between 1-7.
     */
    int getFirstDayOfWeek();

    /**
     * Format zoned date to String.
     * 
     * @param date
     *            Date to format (Expected to be in same TimeZone as
     *            {@link #getTimeZone()}).
     * @param format
     *            Pattern of the date format. Like MMM or MMMM.
     * @return Formatted date
     */
    String formatDate(Date date, String format);

    /** Format zoned date. */
    String formatDate(Date zonedDate, DateTimeFormat formatter);

    /**
     * Returns true, if active locale uses twelve hour clock.
     * 
     * @return true if 12h clock. False if 24h clock.
     */
    boolean isTwelveHourClock();

    /**
     * Get currently active locale id. See {@link Locale#toString()}.
     * 
     * @return Locale
     */
    String getLocale();

    /**
     * Get currently active Gantt specific time-zone.
     */
    TimeZone getTimeZone();

    /** Get daylight saving time adjustment in milliseconds for the target date. */
    long getDaylightAdjustment(Date zonedDate);

    /**
     * Return time-zone offset + daylight saving offset in milliseconds for the
     * target date.
     */
    long getTimeZoneOffset(Date zonedDate);

}