/*
 * 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 com.example.android.autofillframework.multidatasetservice.model.FilledAutofillField;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * Holds the properties associated with an autofill hint in this Autofill Service.
 */
public final class AutofillHintProperties {

    private String mAutofillHint;
    private FakeFieldGenerator mFakeFieldGenerator;
    private Set<Integer> mValidTypes;
    private int mSaveType;
    private int mPartition;

    public AutofillHintProperties(String autofillHint, int saveType, int partitionNumber,
            FakeFieldGenerator fakeFieldGenerator, Integer... validTypes) {
        mAutofillHint = autofillHint;
        mSaveType = saveType;
        mPartition = partitionNumber;
        mFakeFieldGenerator = fakeFieldGenerator;
        mValidTypes = new HashSet<>(Arrays.asList(validTypes));
    }

    /**
     * Generates dummy autofill field data that is relevant to the autofill hint.
     */
    public FilledAutofillField generateFakeField(int seed) {
        return mFakeFieldGenerator.generate(seed);
    }

    /**
     * Returns autofill hint associated with these properties. If you save a field that uses a W3C
     * hint, there is a chance this will return a different but analogous hint, when applicable.
     * For example, W3C has hint 'email' and {@link android.view.View} has hint 'emailAddress', so
     * the W3C hint should map to the hint defined in {@link android.view.View} ('emailAddress').
     */
    public String getAutofillHint() {
        return mAutofillHint;
    }

    /**
     * Returns how this hint maps to a {@link android.service.autofill.SaveInfo} type.
     */
    public int getSaveType() {
        return mSaveType;
    }

    /**
     * Returns which data partition this autofill hint should be a part of. See partitions defined
     * in {@link AutofillHints}.
     */
    public int getPartition() {
        return mPartition;
    }


    /**
     * Sometimes, data for a hint should only be stored as a certain AutofillValue type. For
     * example, it is recommended that data representing a Credit Card Expiration date, annotated
     * with the hint {@link android.view.View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE}, should
     * only be stored as {@link android.view.View.AUTOFILL_TYPE_DATE}.
     */
    public boolean isValidType(int type) {
        return mValidTypes.contains(type);
    }
}
