package com.volcengine.velive.rn.pull.pictureInpicture;

import android.content.Context;
import android.view.SurfaceView;
import java.util.Map;

public interface IFloatingWindowHelper {
  // Set event listener callback
  void setEventListener(Listener listener);

  // Open floating window (will request permission if not granted),
  // also supports caching business data for restoring the live page.
  void openFloatingWindow(Context context, Config config,
                          Map<String, Object> extraData);

  // Close floating window
  void closeFloatingWindow(Context context);

  // Request overlay permission
  void requestOverlayPermission(Context context);

  // Get floating window configuration
  Config getConfig();

  // Get cached business data
  Map<String, Object> getExtraData();

  // Check if floating window is open
  boolean isOpen();

  interface Listener {
    // Error codes for opening floating window callback
    int ERR_NO = 0;
    int ERR_NOT_SUPPORT = 1;
    int ERR_INVALID_PARAMS = 2;
    int ERR_IS_ALREADY_OPEN = 3;
    int ERR_RETRY = 4;

    // Triggered when requesting overlay permission
    // return: boolean, whether to allow requesting overlay permission
    //      - true: allow
    //      - false: disallow
    default boolean onRequestOverlayPermission() { return true; }

    // Callback for the result of opening floating window
    // param: errCode, ERR_NO means success, other values indicate errors
    default void onOpenFloatingWindowResult(int errCode,
                                            Map<String, Object> extraData) {}

    // Callback when closing floating window
    default void onCloseFloatingWindow(Map<String, Object> extraData) {}

    // Callback when clicking the floating window, needs to be handled by
    // business logic
    default void onClickFloatingWindow(Context context) {}

    // Callback when clicking the close button of floating window, needs to be
    // handled by business logic
    default void onClickFloatingWindowCloseBtn(Context context) {
      FloatingWindowHelper.getInstance().closeFloatingWindow(context);
    }

    // Callback for the SurfaceView of floating window, needs to be set to SDK
    // to render video
    void onUpdateSurfaceView(SurfaceView surfaceView);
  }

  class Config {
    public float aspectRatio;
    int x, y; // Position for creating the floating window

    public Config(float aspectRatio) { this(aspectRatio, 0, 0); }

    public Config(float aspectRatio, int x, int y) {
      this.aspectRatio = aspectRatio;
      this.x = x;
      this.y = y;
    }
  }
}
