/*
 * Copyright (C) 2014 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.android.test.soundtrigger;

import android.annotation.Nullable;
import android.content.Context;
import android.hardware.soundtrigger.SoundTrigger;
import android.hardware.soundtrigger.SoundTrigger.GenericSoundModel;
import android.media.soundtrigger.SoundTriggerDetector;
import android.media.soundtrigger.SoundTriggerManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ParcelUuid;
import android.util.Log;

import com.android.internal.app.ISoundTriggerService;

import java.lang.RuntimeException;
import java.util.UUID;

/**
 * Utility class for the managing sound trigger sound models.
 */
public class SoundTriggerUtil {
    private static final String TAG = "TestSoundTriggerUtil:Hotsound";

    private final ISoundTriggerService mSoundTriggerService;
    private final SoundTriggerManager mSoundTriggerManager;
    private final Context mContext;

    public SoundTriggerUtil(Context context) {
        mSoundTriggerService = ISoundTriggerService.Stub.asInterface(
                ServiceManager.getService(Context.SOUND_TRIGGER_SERVICE));
        mSoundTriggerManager = (SoundTriggerManager) context.getSystemService(
                Context.SOUND_TRIGGER_SERVICE);
        mContext = context;
    }

    /**
     * Adds/Updates a sound model.
     * The sound model must contain a valid UUID.
     *
     * @param soundModel The sound model to add/update.
     */
    public boolean addOrUpdateSoundModel(GenericSoundModel soundModel) {
        try {
            if (soundModel == null) {
                throw new RuntimeException("Bad sound model");
            }
            mSoundTriggerService.updateSoundModel(soundModel);
        } catch (RemoteException e) {
            Log.e(TAG, "RemoteException in updateSoundModel", e);
        }
        return true;
    }

    public void addOrUpdateSoundModel(SoundTriggerManager.Model soundModel) {
        mSoundTriggerManager.updateModel(soundModel);
    }

    /**
     * Gets the sound model for the given keyphrase, null if none exists.
     * If a sound model for a given keyphrase exists, and it needs to be updated,
     * it should be obtained using this method, updated and then passed in to
     * {@link #addOrUpdateSoundModel(GenericSoundModel)} without changing the IDs.
     *
     * @param modelId The model ID to look-up the sound model for.
     * @return The sound model if one was found, null otherwise.
     */
    @Nullable
    public GenericSoundModel getSoundModel(UUID modelId) {
        GenericSoundModel model = null;
        try {
            model = mSoundTriggerService.getSoundModel(new ParcelUuid(modelId));
        } catch (RemoteException e) {
            Log.e(TAG, "RemoteException in updateKeyphraseSoundModel");
        }

        if (model == null) {
            Log.w(TAG, "No models present for the gien keyphrase ID");
            return null;
        } else {
            return model;
        }
    }

    /**
     * Deletes the sound model for the given keyphrase id.
     *
     * @param modelId The model ID to look-up the sound model for.
     * @return {@code true} if the call succeeds, {@code false} otherwise.
     */
    @Nullable
    public boolean deleteSoundModel(UUID modelId) {
        try {
            mSoundTriggerService.deleteSoundModel(new ParcelUuid(modelId));
        } catch (RemoteException e) {
            Log.e(TAG, "RemoteException in updateSoundModel");
        }
        return true;
    }

    public void deleteSoundModelUsingManager(UUID modelId) {
            mSoundTriggerManager.deleteModel(modelId);
    }

    public SoundTriggerDetector createSoundTriggerDetector(UUID modelId,
            SoundTriggerDetector.Callback callback) {
        return mSoundTriggerManager.createSoundTriggerDetector(modelId, callback, null);
    }

}
