// Copyright 2021 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.android_webview.services;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

import org.chromium.android_webview.common.PlatformServiceBridge;
import org.chromium.android_webview.common.services.IMetricsUploadService;

import java.net.HttpURLConnection;

/**
 * Service that receives UMA metrics logs from embedded WebView instances and send them to GMS-core
 * as is.
 */
public class MetricsUploadService extends Service {
    private static final String TAG = "MetricsUploadService";

    private final IMetricsUploadService.Stub mBinder = new IMetricsUploadService.Stub() {
        @Override
        public int uploadMetricsLog(byte[] serializedLog, boolean useDefaultUploadQos) {
            int status = PlatformServiceBridge.getInstance().logMetricsBlocking(
                    serializedLog, useDefaultUploadQos);

            // We map the platform reported statuses out to HTTP status codes so that Chromium
            // metrics can work with a single standard.
            switch (status) {
                // The platform will return -1 or 0 as a success status.
                // The Chromium metrics work with status codes in HTTP status codes so we will
                // convert these over.
                case -1:
                case 0:
                    return HttpURLConnection.HTTP_OK;
                // This is essentially the same as receiving an http 500.
                // All we know is something went wrong internally.
                case 8:
                    return HttpURLConnection.HTTP_INTERNAL_ERROR;
                // The request was interrupted so we're treating this the same way we
                // treat an interruption in
                // {@link org.chromium.android_webview.metrics.AwMetricsLogUploader}
                case 14:
                    return HttpURLConnection.HTTP_UNAVAILABLE;
                // The request timed out so we should try again.
                case 15:
                    return HttpURLConnection.HTTP_GATEWAY_TIMEOUT;
                // The request was cancelled to the client API.
                case 16:
                    return HttpURLConnection.HTTP_GONE;
                // The API is not available on the device so we should ensure this isn't called
                // again.
                case 17:
                    return HttpURLConnection.HTTP_BAD_REQUEST;
                // If we receive a non expected status from the platform, we will report this as bad
                // to be rejected to the chromium metrics.
                default:
                    return HttpURLConnection.HTTP_BAD_REQUEST;
            }
        }
    };

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
}
