// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.components.webauthn;

import androidx.annotation.IntDef;

import org.chromium.base.metrics.RecordHistogram;
import org.chromium.components.webauthn.Fido2CredentialRequest.ConditionalUiState;

/**
 * This class is responsible for emitting histograms regarding CredMan usage in
 * Fido2CredentialRequest.
 */
public class CredManMetricsHelper {
    // These values are persisted to logs. Entries should not be renumbered and
    // numeric values should never be reused.
    @IntDef({CredManCreateRequestEnum.SENT_REQUEST, CredManCreateRequestEnum.COULD_NOT_SEND_REQUEST,
            CredManCreateRequestEnum.SUCCESS, CredManCreateRequestEnum.FAILURE,
            CredManCreateRequestEnum.CANCELLED, CredManCreateRequestEnum.NUM_ENTRIES})
    public @interface CredManCreateRequestEnum {
        int SENT_REQUEST = 0;
        int COULD_NOT_SEND_REQUEST = 1;
        int SUCCESS = 2;
        int FAILURE = 3;
        int CANCELLED = 4;

        int NUM_ENTRIES = 5;
    }

    // These values are persisted to logs. Entries should not be renumbered and
    // numeric values should never be reused.
    @IntDef({CredManPrepareRequestEnum.SENT_REQUEST,
            CredManPrepareRequestEnum.COULD_NOT_SEND_REQUEST,
            CredManPrepareRequestEnum.SUCCESS_HAS_RESULTS,
            CredManPrepareRequestEnum.SUCCESS_NO_RESULTS, CredManPrepareRequestEnum.FAILURE,
            CredManPrepareRequestEnum.NUM_ENTRIES})
    public @interface CredManPrepareRequestEnum {
        int SENT_REQUEST = 0;
        int COULD_NOT_SEND_REQUEST = 1;
        int SUCCESS_HAS_RESULTS = 2;
        int SUCCESS_NO_RESULTS = 3;
        int FAILURE = 4;

        int NUM_ENTRIES = 5;
    }

    // These values are persisted to logs. Entries should not be renumbered and
    // numeric values should never be reused.
    @IntDef({CredManGetRequestEnum.SENT_REQUEST, CredManGetRequestEnum.COULD_NOT_SEND_REQUEST,
            CredManGetRequestEnum.SUCCESS_PASSKEY, CredManGetRequestEnum.SUCCESS_PASSWORD,
            CredManGetRequestEnum.FAILURE, CredManGetRequestEnum.CANCELLED,
            CredManGetRequestEnum.NUM_ENTRIES})
    public @interface CredManGetRequestEnum {
        int SENT_REQUEST = 0;
        int COULD_NOT_SEND_REQUEST = 1;
        int SUCCESS_PASSKEY = 2;
        int SUCCESS_PASSWORD = 3;
        int FAILURE = 4;
        int CANCELLED = 5;

        int NUM_ENTRIES = 6;
    }

    public void recordCredManCreateRequestHistogram(@CredManCreateRequestEnum int value) {
        RecordHistogram.recordEnumeratedHistogram("WebAuthentication.Android.CredManCreateRequest",
                value, CredManCreateRequestEnum.NUM_ENTRIES);
    }

    public void recordCredmanPrepareRequestHistogram(@CredManPrepareRequestEnum int value) {
        RecordHistogram.recordEnumeratedHistogram("WebAuthentication.Android.CredManPrepareRequest",
                value, CredManPrepareRequestEnum.NUM_ENTRIES);
    }

    public void recordCredmanPrepareRequestDuration(long durationMs) {
        RecordHistogram.recordTimesHistogram(
                "WebAuthentication.Android.CredManPrepareRequestDuration", durationMs);
    }

    public void reportGetCredentialMetrics(
            @CredManGetRequestEnum int value, ConditionalUiState conditionalUiState) {
        assert !(conditionalUiState == ConditionalUiState.NONE)
                || !(value == CredManGetRequestEnum.SUCCESS_PASSWORD)
            : "Passwords cannot be received from modal requests!";
        if (conditionalUiState == ConditionalUiState.NONE) {
            RecordHistogram.recordEnumeratedHistogram(
                    "WebAuthentication.Android.CredManModalRequests", value,
                    CredManGetRequestEnum.NUM_ENTRIES);
            return;
        }
        RecordHistogram.recordEnumeratedHistogram(
                "WebAuthentication.Android.CredManConditionalRequest", value,
                CredManGetRequestEnum.NUM_ENTRIES);
    }
}
