/*
 *   Copyright (c) 2021 Project CHIP Authors
 *   All rights reserved.
 *
 *   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.matter.tv.server.tvapp;

import android.util.Log;

public class TvApp {
  private TvAppCallback mCallback;
  private static final String TAG = "TvApp";

  public TvApp(TvAppCallback callback) {
    mCallback = callback;
    nativeInit();
  }

  private void postClusterInit(int clusterId, int endpoint) {
    Log.d(TAG, "postClusterInit for " + clusterId + " at " + endpoint);
    if (mCallback != null) {
      mCallback.onClusterInit(this, clusterId, endpoint);
    }
  }

  public native void nativeInit();

  // called before Matter server is inited
  public native void preServerInit();

  // called after Matter server is inited
  public native void postServerInit(ContentAppEndpointManager manager);

  public native void setKeypadInputManager(int endpoint, KeypadInputManager manager);

  public native void setWakeOnLanManager(int endpoint, WakeOnLanManager manager);

  public native void setMediaInputManager(int endpoint, MediaInputManager manager);

  public native void setContentLaunchManager(int endpoint, ContentLaunchManager manager);

  public native void setLowPowerManager(int endpoint, LowPowerManager manager);

  public native void setMediaPlaybackManager(int endpoint, MediaPlaybackManager manager);

  public native void setChannelManager(int endpoint, ChannelManager manager);

  public native void setOnOffManager(int endpoint, OnOffManager manager);

  public native boolean setOnOff(int endpoint, boolean value);

  public native void setLevelManager(int endpoint, LevelManager manager);

  public native boolean setCurrentLevel(int endpoint, int value);

  public native void setDACProvider(DACProvider provider);

  public native void setChipDeviceEventProvider(DeviceEventProvider provider);

  public native int addContentApp(
      String vendorName,
      int vendorId,
      String appName,
      int productId,
      String appVersion,
      ContentAppEndpointManager manager);

  public native void sendTestMessage(int endpoint, String message);

  public native void setUserPrompter(UserPrompter userPrompter);

  static {
    System.loadLibrary("TvApp");
  }
}
