/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * 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 com.example.android.autofillframework.multidatasetservice;

import android.service.autofill.SaveInfo;
import android.util.Log;
import android.view.View;

import com.example.android.autofillframework.multidatasetservice.model.FilledAutofillField;
import com.example.android.autofillframework.multidatasetservice.model.FilledAutofillFieldCollection;
import com.google.common.collect.ImmutableMap;

import java.util.Calendar;

import static com.example.android.autofillframework.CommonUtil.TAG;

public final class AutofillHints {
    public static final int PARTITION_OTHER = 0;
    public static final int PARTITION_ADDRESS = 1;
    public static final int PARTITION_EMAIL = 2;
    public static final int PARTITION_CREDIT_CARD = 3;
    public static final int[] PARTITIONS = {
            PARTITION_OTHER, PARTITION_ADDRESS, PARTITION_EMAIL, PARTITION_CREDIT_CARD
    };
    /* TODO: finish building fake data for all hints. */
    private static final ImmutableMap<String, AutofillHintProperties> sValidHints =
            new ImmutableMap.Builder<String, AutofillHintProperties>()
                    .put(View.AUTOFILL_HINT_EMAIL_ADDRESS, new AutofillHintProperties(
                            View.AUTOFILL_HINT_EMAIL_ADDRESS, SaveInfo.SAVE_DATA_TYPE_EMAIL_ADDRESS,
                            PARTITION_EMAIL,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(View.AUTOFILL_HINT_EMAIL_ADDRESS);
                                filledAutofillField.setTextValue("email" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(View.AUTOFILL_HINT_NAME, new AutofillHintProperties(
                            View.AUTOFILL_HINT_NAME, SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(View.AUTOFILL_HINT_NAME);
                                filledAutofillField.setTextValue("name" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(View.AUTOFILL_HINT_USERNAME, new AutofillHintProperties(
                            View.AUTOFILL_HINT_USERNAME, SaveInfo.SAVE_DATA_TYPE_USERNAME,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(View.AUTOFILL_HINT_USERNAME);
                                filledAutofillField.setTextValue("login" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(View.AUTOFILL_HINT_PASSWORD, new AutofillHintProperties(
                            View.AUTOFILL_HINT_PASSWORD, SaveInfo.SAVE_DATA_TYPE_PASSWORD,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(View.AUTOFILL_HINT_PASSWORD);
                                filledAutofillField.setTextValue("login" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(View.AUTOFILL_HINT_PHONE, new AutofillHintProperties(
                            View.AUTOFILL_HINT_PHONE, SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(View.AUTOFILL_HINT_PHONE);
                                filledAutofillField.setTextValue("" + seed + "2345678910");
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(View.AUTOFILL_HINT_POSTAL_ADDRESS, new AutofillHintProperties(
                            View.AUTOFILL_HINT_POSTAL_ADDRESS, SaveInfo.SAVE_DATA_TYPE_ADDRESS,
                            PARTITION_ADDRESS,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(View.AUTOFILL_HINT_POSTAL_ADDRESS);
                                filledAutofillField.setTextValue(
                                        "" + seed + " Fake Ln, Fake, FA, FAA 10001");
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(View.AUTOFILL_HINT_POSTAL_CODE, new AutofillHintProperties(
                            View.AUTOFILL_HINT_POSTAL_CODE, SaveInfo.SAVE_DATA_TYPE_ADDRESS,
                            PARTITION_ADDRESS,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(View.AUTOFILL_HINT_POSTAL_CODE);
                                filledAutofillField.setTextValue("1000" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(View.AUTOFILL_HINT_CREDIT_CARD_NUMBER, new AutofillHintProperties(
                            View.AUTOFILL_HINT_CREDIT_CARD_NUMBER,
                            SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD,
                            PARTITION_CREDIT_CARD,
                            (seed) -> {
                                FilledAutofillField filledAutofillField = new FilledAutofillField(
                                        View.AUTOFILL_HINT_CREDIT_CARD_NUMBER);
                                filledAutofillField.setTextValue("" + seed + "234567");
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(View.AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE, new AutofillHintProperties(
                            View.AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE,
                            SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD,
                            PARTITION_CREDIT_CARD,
                            (seed) -> {
                                FilledAutofillField filledAutofillField = new FilledAutofillField(
                                        View.AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE);
                                filledAutofillField.setTextValue("" + seed + seed + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE,
                            new AutofillHintProperties(
                                    View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE,
                                    SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD,
                                    (seed) -> {
                                        FilledAutofillField filledAutofillField = new FilledAutofillField(
                                                View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE);
                                        Calendar calendar = Calendar.getInstance();
                                        calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + seed);
                                        filledAutofillField.setDateValue(calendar.getTimeInMillis());
                                        return filledAutofillField;
                                    }, View.AUTOFILL_TYPE_DATE))
                    .put(View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH,
                            new AutofillHintProperties(
                                    View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH,
                                    SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD,
                                    (seed) -> {
                                        CharSequence[] months = monthRange();
                                        int month = seed % months.length;
                                        Calendar calendar = Calendar.getInstance();
                                        calendar.set(Calendar.MONTH, month);
                                        FilledAutofillField filledAutofillField =
                                                new FilledAutofillField(
                                                        View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH);
                                        filledAutofillField.setListValue(months, month);
                                        filledAutofillField.setTextValue(Integer.toString(month));
                                        filledAutofillField.setDateValue(calendar.getTimeInMillis());
                                        return filledAutofillField;
                                    }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST,
                                    View.AUTOFILL_TYPE_DATE))
                    .put(View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR, new AutofillHintProperties(
                            View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR,
                            SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD,
                            (seed) -> {
                                FilledAutofillField filledAutofillField = new FilledAutofillField(
                                        View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR);
                                Calendar calendar = Calendar.getInstance();
                                int expYear = calendar.get(Calendar.YEAR) + seed;
                                calendar.set(Calendar.YEAR, expYear);
                                filledAutofillField.setDateValue(calendar.getTimeInMillis());
                                filledAutofillField.setTextValue(Integer.toString(expYear));
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST,
                            View.AUTOFILL_TYPE_DATE))
                    .put(View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY, new AutofillHintProperties(
                            View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY,
                            SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD,
                            (seed) -> {
                                CharSequence[] days = dayRange();
                                int day = seed % days.length;
                                FilledAutofillField filledAutofillField = new FilledAutofillField(
                                        View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY);
                                Calendar calendar = Calendar.getInstance();
                                calendar.set(Calendar.DATE, day);
                                filledAutofillField.setListValue(days, day);
                                filledAutofillField.setTextValue(Integer.toString(day));
                                filledAutofillField.setDateValue(calendar.getTimeInMillis());
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST,
                            View.AUTOFILL_TYPE_DATE))
                    .put(W3cHints.HONORIFIC_PREFIX, new AutofillHintProperties(
                            W3cHints.HONORIFIC_PREFIX, SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField = new FilledAutofillField(
                                        W3cHints.HONORIFIC_PREFIX);
                                CharSequence[] examplePrefixes = {"Miss", "Ms.", "Mr.", "Mx.",
                                        "Sr.", "Dr.", "Lady", "Lord"};
                                filledAutofillField.setListValue(examplePrefixes,
                                        seed % examplePrefixes.length);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.GIVEN_NAME, new AutofillHintProperties(W3cHints.GIVEN_NAME,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.GIVEN_NAME);
                                filledAutofillField.setTextValue("name" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.ADDITIONAL_NAME, new AutofillHintProperties(
                            W3cHints.ADDITIONAL_NAME, SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.ADDITIONAL_NAME);
                                filledAutofillField.setTextValue("addtlname" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.FAMILY_NAME, new AutofillHintProperties(
                            W3cHints.FAMILY_NAME, SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.FAMILY_NAME);
                                filledAutofillField.setTextValue("famname" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.HONORIFIC_SUFFIX, new AutofillHintProperties(
                            W3cHints.HONORIFIC_SUFFIX, SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.HONORIFIC_SUFFIX);
                                CharSequence[] exampleSuffixes = {"san", "kun", "chan", "sama"};
                                filledAutofillField.setListValue(exampleSuffixes,
                                        seed % exampleSuffixes.length);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.NEW_PASSWORD, new AutofillHintProperties(
                            W3cHints.NEW_PASSWORD, SaveInfo.SAVE_DATA_TYPE_PASSWORD,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.NEW_PASSWORD);
                                filledAutofillField.setTextValue("login" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.CURRENT_PASSWORD, new AutofillHintProperties(
                            View.AUTOFILL_HINT_PASSWORD, SaveInfo.SAVE_DATA_TYPE_PASSWORD,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(View.AUTOFILL_HINT_PASSWORD);
                                filledAutofillField.setTextValue("login" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.ORGANIZATION_TITLE, new AutofillHintProperties(
                            W3cHints.ORGANIZATION_TITLE, SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.ORGANIZATION_TITLE);
                                filledAutofillField.setTextValue("org" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.ORGANIZATION, new AutofillHintProperties(W3cHints.ORGANIZATION,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.ORGANIZATION);
                                filledAutofillField.setTextValue("org" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.STREET_ADDRESS, new AutofillHintProperties(
                            W3cHints.STREET_ADDRESS, SaveInfo.SAVE_DATA_TYPE_ADDRESS,
                            PARTITION_ADDRESS,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.STREET_ADDRESS);
                                filledAutofillField.setTextValue(
                                        "" + seed + " Fake Ln, Fake, FA, FAA 10001");
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.ADDRESS_LINE1, new AutofillHintProperties(W3cHints.ADDRESS_LINE1,
                            SaveInfo.SAVE_DATA_TYPE_ADDRESS,
                            PARTITION_ADDRESS,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.ADDRESS_LINE1);
                                filledAutofillField.setTextValue("" + seed + " Fake Ln");
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.ADDRESS_LINE2, new AutofillHintProperties(W3cHints.ADDRESS_LINE2,
                            SaveInfo.SAVE_DATA_TYPE_ADDRESS, PARTITION_ADDRESS,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.ADDRESS_LINE2);
                                filledAutofillField.setTextValue("Apt. " + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.ADDRESS_LINE3, new AutofillHintProperties(W3cHints.ADDRESS_LINE3,
                            SaveInfo.SAVE_DATA_TYPE_ADDRESS, PARTITION_ADDRESS,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.ADDRESS_LINE3);
                                filledAutofillField.setTextValue("FA" + seed + ", FA, FAA");
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.ADDRESS_LEVEL4, new AutofillHintProperties(
                            W3cHints.ADDRESS_LEVEL4, SaveInfo.SAVE_DATA_TYPE_ADDRESS,
                            PARTITION_ADDRESS,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.ADDRESS_LEVEL4);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.ADDRESS_LEVEL3, new AutofillHintProperties(
                            W3cHints.ADDRESS_LEVEL3, SaveInfo.SAVE_DATA_TYPE_ADDRESS,
                            PARTITION_ADDRESS,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.ADDRESS_LEVEL3);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.ADDRESS_LEVEL2, new AutofillHintProperties(
                            W3cHints.ADDRESS_LEVEL2, SaveInfo.SAVE_DATA_TYPE_ADDRESS,
                            PARTITION_ADDRESS,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.ADDRESS_LEVEL2);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.ADDRESS_LEVEL1, new AutofillHintProperties(
                            W3cHints.ADDRESS_LEVEL1, SaveInfo.SAVE_DATA_TYPE_ADDRESS,
                            PARTITION_ADDRESS,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.ADDRESS_LEVEL1);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.COUNTRY, new AutofillHintProperties(W3cHints.COUNTRY,
                            SaveInfo.SAVE_DATA_TYPE_ADDRESS, PARTITION_ADDRESS,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.COUNTRY);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.COUNTRY_NAME, new AutofillHintProperties(W3cHints.COUNTRY_NAME,
                            SaveInfo.SAVE_DATA_TYPE_ADDRESS, PARTITION_ADDRESS,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.COUNTRY_NAME);
                                CharSequence[] exampleCountries = {"USA", "Mexico", "Canada"};
                                filledAutofillField.setListValue(exampleCountries,
                                        seed % exampleCountries.length);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.POSTAL_CODE, new AutofillHintProperties(
                            View.AUTOFILL_HINT_POSTAL_CODE, SaveInfo.SAVE_DATA_TYPE_ADDRESS,
                            PARTITION_ADDRESS,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(View.AUTOFILL_HINT_POSTAL_CODE);
                                filledAutofillField.setTextValue("" + seed + seed + seed + seed +
                                        seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.CC_NAME, new AutofillHintProperties(W3cHints.CC_NAME,
                            SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD,
                            PARTITION_CREDIT_CARD,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.CC_NAME);
                                filledAutofillField.setTextValue("firstname" + seed + "lastname" +
                                        seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.CC_GIVEN_NAME, new AutofillHintProperties(W3cHints.CC_GIVEN_NAME,
                            SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.CC_GIVEN_NAME);
                                filledAutofillField.setTextValue("givenname" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.CC_ADDITIONAL_NAME, new AutofillHintProperties(
                            W3cHints.CC_ADDITIONAL_NAME, SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD,
                            PARTITION_CREDIT_CARD,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.CC_ADDITIONAL_NAME);
                                filledAutofillField.setTextValue("addtlname" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.CC_FAMILY_NAME, new AutofillHintProperties(
                            W3cHints.CC_FAMILY_NAME, SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD,
                            PARTITION_CREDIT_CARD,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.CC_FAMILY_NAME);
                                filledAutofillField.setTextValue("familyname" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.CC_NUMBER, new AutofillHintProperties(
                            View.AUTOFILL_HINT_CREDIT_CARD_NUMBER,
                            SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD,
                            (seed) -> {
                                FilledAutofillField filledAutofillField = new FilledAutofillField(
                                        View.AUTOFILL_HINT_CREDIT_CARD_NUMBER);
                                filledAutofillField.setTextValue("" + seed + "234567");
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.CC_EXPIRATION, new AutofillHintProperties(
                            View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE,
                            SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD,
                            (seed) -> {
                                FilledAutofillField filledAutofillField = new FilledAutofillField(
                                        View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE);
                                Calendar calendar = Calendar.getInstance();
                                calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + seed);
                                filledAutofillField.setDateValue(calendar.getTimeInMillis());
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_DATE))
                    .put(W3cHints.CC_EXPIRATION_MONTH, new AutofillHintProperties(
                            View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH,
                            SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD,
                            (seed) -> {
                                FilledAutofillField filledAutofillField = new FilledAutofillField(
                                        View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH);
                                CharSequence[] months = monthRange();
                                filledAutofillField.setListValue(months,
                                        seed % months.length);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.CC_EXPIRATION_YEAR, new AutofillHintProperties(
                            View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR,
                            SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD,
                            (seed) -> {
                                FilledAutofillField filledAutofillField = new FilledAutofillField(
                                        View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR);
                                Calendar calendar = Calendar.getInstance();
                                int expYear = calendar.get(Calendar.YEAR) + seed;
                                calendar.set(Calendar.YEAR, expYear);
                                filledAutofillField.setDateValue(calendar.getTimeInMillis());
                                filledAutofillField.setTextValue("" + expYear);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.CC_CSC, new AutofillHintProperties(
                            View.AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE,
                            SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD,
                            (seed) -> {
                                FilledAutofillField filledAutofillField = new FilledAutofillField(
                                        View.AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE);
                                filledAutofillField.setTextValue("" + seed + seed + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.CC_TYPE, new AutofillHintProperties(W3cHints.CC_TYPE,
                            SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.CC_TYPE);
                                filledAutofillField.setTextValue("type" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.TRANSACTION_CURRENCY, new AutofillHintProperties(
                            W3cHints.TRANSACTION_CURRENCY, SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.TRANSACTION_CURRENCY);
                                CharSequence[] exampleCurrencies = {"USD", "CAD", "KYD", "CRC"};
                                filledAutofillField.setListValue(exampleCurrencies,
                                        seed % exampleCurrencies.length);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.TRANSACTION_AMOUNT, new AutofillHintProperties(
                            W3cHints.TRANSACTION_AMOUNT, SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.TRANSACTION_AMOUNT);
                                filledAutofillField.setTextValue("" + seed * 100);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.LANGUAGE, new AutofillHintProperties(W3cHints.LANGUAGE,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.LANGUAGE);
                                CharSequence[] exampleLanguages = {"Bulgarian", "Croatian", "Czech",
                                        "Danish", "Dutch", "English", "Estonian"};
                                filledAutofillField.setListValue(exampleLanguages,
                                        seed % exampleLanguages.length);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.BDAY, new AutofillHintProperties(W3cHints.BDAY,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.BDAY);
                                Calendar calendar = Calendar.getInstance();
                                calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) - seed * 10);
                                calendar.set(Calendar.MONTH, seed % 12);
                                calendar.set(Calendar.DATE, seed % 27);
                                filledAutofillField.setDateValue(calendar.getTimeInMillis());
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_DATE))
                    .put(W3cHints.BDAY_DAY, new AutofillHintProperties(W3cHints.BDAY_DAY,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.BDAY_DAY);
                                filledAutofillField.setTextValue("" + seed % 27);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.BDAY_MONTH, new AutofillHintProperties(W3cHints.BDAY_MONTH,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.BDAY_MONTH);
                                filledAutofillField.setTextValue("" + seed % 12);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.BDAY_YEAR, new AutofillHintProperties(W3cHints.BDAY_YEAR,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.BDAY_YEAR);
                                int year = Calendar.getInstance().get(Calendar.YEAR) - seed * 10;
                                filledAutofillField.setTextValue("" + year);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.SEX, new AutofillHintProperties(W3cHints.SEX,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.SEX);
                                filledAutofillField.setTextValue("Other");
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.URL, new AutofillHintProperties(W3cHints.URL,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.URL);
                                filledAutofillField.setTextValue("http://google.com");
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.PHOTO, new AutofillHintProperties(W3cHints.PHOTO,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.PHOTO);
                                filledAutofillField.setTextValue("photo" + seed + ".jpg");
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.PREFIX_SECTION, new AutofillHintProperties(
                            W3cHints.PREFIX_SECTION, SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.PREFIX_SECTION);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.SHIPPING, new AutofillHintProperties(W3cHints.SHIPPING,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_ADDRESS,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.SHIPPING);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.BILLING, new AutofillHintProperties(W3cHints.BILLING,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_ADDRESS,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.BILLING);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.PREFIX_HOME, new AutofillHintProperties(W3cHints.PREFIX_HOME,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.PREFIX_HOME);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.PREFIX_WORK, new AutofillHintProperties(W3cHints.PREFIX_WORK,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.PREFIX_WORK);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.PREFIX_FAX, new AutofillHintProperties(W3cHints.PREFIX_FAX,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.PREFIX_FAX);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.PREFIX_PAGER, new AutofillHintProperties(W3cHints.PREFIX_PAGER,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.PREFIX_PAGER);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.TEL, new AutofillHintProperties(W3cHints.TEL,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.TEL);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.TEL_COUNTRY_CODE, new AutofillHintProperties(
                            W3cHints.TEL_COUNTRY_CODE, SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.TEL_COUNTRY_CODE);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.TEL_NATIONAL, new AutofillHintProperties(W3cHints.TEL_NATIONAL,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.TEL_NATIONAL);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.TEL_AREA_CODE, new AutofillHintProperties(
                            W3cHints.TEL_AREA_CODE, SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.TEL_AREA_CODE);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.TEL_LOCAL, new AutofillHintProperties(
                            W3cHints.TEL_LOCAL, SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.TEL_LOCAL);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.TEL_LOCAL_PREFIX, new AutofillHintProperties(
                            W3cHints.TEL_LOCAL_PREFIX, SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.TEL_LOCAL_PREFIX);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.TEL_LOCAL_SUFFIX, new AutofillHintProperties(
                            W3cHints.TEL_LOCAL_SUFFIX, SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.TEL_LOCAL_SUFFIX);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.TEL_EXTENSION, new AutofillHintProperties(W3cHints.TEL_EXTENSION,
                            SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.TEL_EXTENSION);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .put(W3cHints.EMAIL, new AutofillHintProperties(
                            View.AUTOFILL_HINT_EMAIL_ADDRESS, SaveInfo.SAVE_DATA_TYPE_GENERIC,
                            PARTITION_EMAIL,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(View.AUTOFILL_HINT_EMAIL_ADDRESS);
                                filledAutofillField.setTextValue("email" + seed);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT))
                    .put(W3cHints.IMPP, new AutofillHintProperties(W3cHints.IMPP,
                            SaveInfo.SAVE_DATA_TYPE_EMAIL_ADDRESS, PARTITION_EMAIL,
                            (seed) -> {
                                FilledAutofillField filledAutofillField =
                                        new FilledAutofillField(W3cHints.IMPP);
                                return filledAutofillField;
                            }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST))
                    .build();

    private AutofillHints() {
    }

    public static boolean isValidTypeForHints(String[] hints, int type) {
        if (hints != null) {
            for (String hint : hints) {
                if (hint != null && sValidHints.containsKey(hint)) {
                    boolean valid = sValidHints.get(hint).isValidType(type);
                    if (valid) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    public static boolean isValidHint(String hint) {
        return sValidHints.containsKey(hint);
    }

    public static int getSaveTypeForHints(String[] hints) {
        int saveType = 0;
        if (hints != null) {
            for (String hint : hints) {
                if (hint != null && sValidHints.containsKey(hint)) {
                    saveType |= sValidHints.get(hint).getSaveType();
                }
            }
        }
        return saveType;
    }

    public static FilledAutofillField getFakeField(String hint, int seed) {
        return sValidHints.get(hint).generateFakeField(seed);
    }

    public static FilledAutofillFieldCollection getFakeFieldCollection(int partition, int seed) {
        FilledAutofillFieldCollection filledAutofillFieldCollection =
                new FilledAutofillFieldCollection();
        for (String hint : sValidHints.keySet()) {
            if (hint != null && sValidHints.get(hint).getPartition() == partition) {
                FilledAutofillField fakeField = getFakeField(hint, seed);
                filledAutofillFieldCollection.add(fakeField);
            }
        }
        return filledAutofillFieldCollection;
    }

    private static String getStoredHintName(String hint) {
        return sValidHints.get(hint).getAutofillHint();
    }

    public static void convertToStoredHintNames(String[] hints) {
        for (int i = 0; i < hints.length; i++) {
            hints[i] = getStoredHintName(hints[i]);
        }
    }

    private static CharSequence[] dayRange() {
        CharSequence[] days = new CharSequence[27];
        for (int i = 0; i < days.length; i++) {
            days[i] = Integer.toString(i);
        }
        return days;
    }

    private static CharSequence[] monthRange() {
        CharSequence[] months = new CharSequence[12];
        for (int i = 0; i < months.length; i++) {
            months[i] = Integer.toString(i);
        }
        return months;
    }

    public static String[] filterForSupportedHints(String[] hints) {
        String[] filteredHints = new String[hints.length];
        int i = 0;
        for (String hint : hints) {
            if (AutofillHints.isValidHint(hint)) {
                filteredHints[i++] = hint;
            } else {
                Log.d(TAG, "Invalid autofill hint: " + hint);
            }
        }
        if (i == 0) {
            return null;
        }
        String[] finalFilteredHints = new String[i];
        System.arraycopy(filteredHints, 0, finalFilteredHints, 0, i);
        return finalFilteredHints;
    }
}
