/*
 * Copyright (c) 2022 Huawei Device Co., Ltd.
 * 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.
 */

/**
 * @file
 * @kit ArkUI
 */

import { AsyncCallback } from './@ohos.base';

/**
 * Window animation manager.
 *
 * @namespace windowAnimationManager
 * @syscap SystemCapability.WindowManager.WindowManager.Core
 * @systemapi Hide this for inner system use.
 * @since 9 dynamic
 * @since 23 static
 */
declare namespace windowAnimationManager {
  /**
   * Set the window animation controller.
   *
   * @param { WindowAnimationController } controller - Window animation controller.
   * @syscap SystemCapability.WindowManager.WindowManager.Core
   * @systemapi Hide this for inner system use.
   * @since 9 dynamic
   * @since 23 static
   */
  function setController(controller: WindowAnimationController): void;

  /**
   * Minimize the window target with animation.
   *
   * @param { WindowAnimationTarget } windowTarget - The window target to be minimized.
   * @param { AsyncCallback<WindowAnimationFinishedCallback> } callback - Returns the animation finished callback.
   * @syscap SystemCapability.WindowManager.WindowManager.Core
   * @systemapi Hide this for inner system use.
   * @since 9 dynamic
   * @since 23 static
   */
  function minimizeWindowWithAnimation(windowTarget: WindowAnimationTarget,
    callback: AsyncCallback<WindowAnimationFinishedCallback>): void;

  /**
   * Minimize the window target with animation.
   *
   * @param { WindowAnimationTarget }windowTarget - The window target to be minimized.
   * @returns { Promise<WindowAnimationFinishedCallback> } Promise used to return the animation finished callback.
   * @syscap SystemCapability.WindowManager.WindowManager.Core
   * @systemapi Hide this for inner system use.
   * @since 9 dynamic
   * @since 23 static
   */
  function minimizeWindowWithAnimation(windowTarget: WindowAnimationTarget): Promise<WindowAnimationFinishedCallback>;

  /**
   * Round rect.
   *
   * @interface RRect
   * @syscap SystemCapability.WindowManager.WindowManager.Core
   * @systemapi Hide this for inner system use.
   * @since 9 dynamic
   * @since 23 static
   */
  export interface RRect {
    /**
     * The X-axis coordinate of the upper left vertex of the round rect, in pixels.
     * @type { double }
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 9 dynamic
     * @since 23 static
     */
    left: double;

    /**
     * The Y-axis coordinate of the upper left vertex of the round rect, in pixels.
     * @type { double }
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 9 dynamic
     * @since 23 static
     */
    top: double;

    /**
     * Width of the round rect, in pixels.
     * @type { double }
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 9 dynamic
     * @since 23 static
     */
    width: double;

    /**
     * Height of the round rect, in pixels.
     * @type { double }
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 9 dynamic
     * @since 23 static
     */
    height: double;

    /**
     * Radius of the round corner of the round rect, in pixels.
     * @type { double }
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 9 dynamic
     * @since 23 static
     */
    radius: double;
  }

  /**
   * Window animation target.
   *
   * @interface WindowAnimationTarget
   * @syscap SystemCapability.WindowManager.WindowManager.Core
   * @systemapi Hide this for inner system use.
   * @since 9 dynamic
   * @since 23 static
   */
  export interface WindowAnimationTarget {
    /**
     * The bundle name of the window animation target.
     * @type { string }
     * @readonly
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 9 dynamic
     * @since 23 static
     */
    readonly bundleName: string;

    /**
    /* The ability name of the window animation target.
     * @type { string }
     * @readonly
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 9 dynamic
     * @since 23 static
     */
    readonly abilityName: string;

    /**
    /* The window bounds of the window animation target.
     * @type { RRect }
     * @readonly
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 9 dynamic
     * @since 23 static
     */
    readonly windowBounds: RRect;

    /**
    /* The mission id of the window animation target.
     * @type { int }
     * @readonly
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 9 dynamic
     * @since 23 static
     */
    readonly missionId: int;
  }

  /**
   * Window animation finished callback.
   *
   * @interface WindowAnimationFinishedCallback
   * @syscap SystemCapability.WindowManager.WindowManager.Core
   * @systemapi Hide this for inner system use.
   * @since 9 dynamic
   * @since 23 static
   */
  export interface WindowAnimationFinishedCallback {
    /**
     * The function of window animation finished callback.
     *
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 9 dynamic
     * @since 23 static
     */
    onAnimationFinish(): void;
  }

  /**
   * Callback function on starting an application.
   *
   * @typedef { function } AppStartCallback
   * @param { WindowAnimationTarget } startingWindowTarget - Window target of the starting application.
   * @param { WindowAnimationFinishedCallback } finishCallback - Animation finished callback.
   * @syscap SystemCapability.WindowManager.WindowManager.Core
   * @systemapi Hide this for inner system use.
   * @since 23 static
   */
  type AppStartCallback = (startingWindowTarget: WindowAnimationTarget,
    finishCallback: WindowAnimationFinishedCallback) => void;

  /**
   * Callback function on application transition.
   *
   * @typedef { function } AppTransitionCallback
   * @param { WindowAnimationTarget } fromWindowTarget - Window target of the source application.
   * @param { WindowAnimationTarget } toWindowTarget - Window target of the destination application.
   * @param { WindowAnimationFinishedCallback } finishCallback - Animation finished callback.
   * @syscap SystemCapability.WindowManager.WindowManager.Core
   * @systemapi Hide this for inner system use.
   * @since 23 static
   */
  type AppTransitionCallback = (fromWindowTarget: WindowAnimationTarget, toWindowTarget: WindowAnimationTarget,
    finishCallback: WindowAnimationFinishedCallback) => void;

  /**
   * Callback function on minimizing a window.
   *
   * @typedef { function } WindowMinimizationCallback
   * @param { WindowAnimationTarget } minimizingWindowTarget - Window target of the minimizing window.
   * @param { WindowAnimationFinishedCallback } finishCallback - Animation finished callback.
   * @syscap SystemCapability.WindowManager.WindowManager.Core
   * @systemapi Hide this for inner system use.
   * @since 23 static
   */
  type WindowMinimizationCallback = (minimizingWindowTarget: WindowAnimationTarget,
    finishCallback: WindowAnimationFinishedCallback) => void;

  /**
   * Callback function on closing a window.
   *
   * @typedef { function } WindowCloseCallback
   * @param { WindowAnimationTarget }closingWindowTarget - Window target of the closing window.
   * @param { WindowAnimationFinishedCallback } finishCallback - Animation finished callback.
   * @syscap SystemCapability.WindowManager.WindowManager.Core
   * @systemapi Hide this for inner system use.
   * @since 23 static
   */
  type WindowCloseCallback = (closingWindowTarget: WindowAnimationTarget,
    finishCallback: WindowAnimationFinishedCallback) => void;

  /**
   * Callback function on unlocking the screen.
   *
   * @typedef { function } ScreenUnlockCallback
   * @param {WindowAnimationFinishedCallback } finishCallback - Animation finished callback.
   * @syscap SystemCapability.WindowManager.WindowManager.Core
   * @systemapi Hide this for inner system use.
   * @since 23 static
   */
  type ScreenUnlockCallback = (finishCallback: WindowAnimationFinishedCallback) => void;

  /**
   * Callback function on window animation targets update.
   *
   * @typedef { function } WindowAnimationTargetsUpdationCallback
   * @param { WindowAnimationTarget } fullScreenWindowTarget - The fullscreen window target.
   * @param { Array<WindowAnimationTarget> } floatingWindowTargets - All the floating window targets.
   * @syscap SystemCapability.WindowManager.WindowManager.Core
   * @systemapi Hide this for inner system use.
   * @since 23 static
   */
  type WindowAnimationTargetsUpdationCallback = (fullScreenWindowTarget: WindowAnimationTarget,
    floatingWindowTargets: Array<WindowAnimationTarget>) => void;

  /**
   * Window animation controller.
   *
   * @interface WindowAnimationController
   * @syscap SystemCapability.WindowManager.WindowManager.Core
   * @systemapi Hide this for inner system use.
   * @since 9 dynamic
   * @since 23 static
   */
  export interface WindowAnimationController {
    /**
     * Called on starting an application form launcher.
     *
     * @param { WindowAnimationTarget } startingWindowTarget  - indicates Window target of the starting application.
     * @param { WindowAnimationFinishedCallback } finishCallback - Animation finished callback.
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @stagemodelonly
     * @since 9 dynamic
     */
    onStartAppFromLauncher(startingWindowTarget: WindowAnimationTarget,
      finishCallback: WindowAnimationFinishedCallback): void;

    /**
     * Called on starting an application form recent.
     *
     * @param { WindowAnimationTarget } startingWindowTarget - Window target of the starting application.
     * @param { WindowAnimationFinishedCallback } finishCallback - Animation finished callback.
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @stagemodelonly
     * @since 9 dynamic
     */
    onStartAppFromRecent(startingWindowTarget: WindowAnimationTarget,
      finishCallback: WindowAnimationFinishedCallback): void;

    /**
     * Called on starting an application form other.
     *
     * @param { WindowAnimationTarget } startingWindowTarget - Window target of the starting application.
     * @param { WindowAnimationFinishedCallback } finishCallback - Animation finished callback.
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @stagemodelonly
     * @since 9 dynamic
     */
    onStartAppFromOther(startingWindowTarget: WindowAnimationTarget,
      finishCallback: WindowAnimationFinishedCallback): void;

    /**
     * Called on application transition.
     *
     * @param { WindowAnimationTarget } fromWindowTarget - Window target of the source application.
     * @param { WindowAnimationTarget } toWindowTarget - Window target of the destination application.
     * @param { WindowAnimationFinishedCallback } finishCallback - Animation finished callback.
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @stagemodelonly
     * @since 9 dynamic
     */
    onAppTransition(fromWindowTarget: WindowAnimationTarget, toWindowTarget: WindowAnimationTarget,
      finishCallback: WindowAnimationFinishedCallback): void;

    /**
     * Called on minimizing a window.
     *
     * @param { WindowAnimationTarget } minimizingWindowTarget - Window target of the minimizing window.
     * @param { WindowAnimationFinishedCallback } finishCallback - Animation finished callback.
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @stagemodelonly
     * @since 9 dynamic
     */
    onMinimizeWindow(minimizingWindowTarget: WindowAnimationTarget,
      finishCallback: WindowAnimationFinishedCallback): void;

    /**
     * Called on closing a window.
     *
     * @param { WindowAnimationTarget }closingWindowTarget - Window target of the closing window.
     * @param { WindowAnimationFinishedCallback } finishCallback - Animation finished callback.
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @stagemodelonly
     * @since 9 dynamic
     */
    onCloseWindow(closingWindowTarget: WindowAnimationTarget, finishCallback: WindowAnimationFinishedCallback): void;

    /**
     * Called on unlocking the screen.
     *
     * @param {WindowAnimationFinishedCallback } finishCallback - Animation finished callback.
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @stagemodelonly
     * @since 9 dynamic
     */
    onScreenUnlock(finishCallback: WindowAnimationFinishedCallback): void;

    /**
     * Called on window animation targets update.
     *
     * @param { WindowAnimationTarget } fullScreenWindowTarget - The fullscreen window target.
     * @param { Array<WindowAnimationTarget> } floatingWindowTargets - All the floating window targets.
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @stagemodelonly
     * @since 9 dynamic
     */
    onWindowAnimationTargetsUpdate(fullScreenWindowTarget: WindowAnimationTarget,
      floatingWindowTargets: Array<WindowAnimationTarget>): void;

    /**
     * Callback function on starting an application form launcher.
     *
     * @type { ?AppStartCallback }
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 23 static
     */
    onStartAppFromLauncher?: AppStartCallback;

    /**
     * Callback function on starting an application form recent.
     *
     * @type { ?AppStartCallback }
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 23 static
     */
    onStartAppFromRecent?: AppStartCallback;

    /**
     * Callback function on starting an application form other.
     *
     * @type { ?AppStartCallback }
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 23 static
     */
    onStartAppFromOther?: AppStartCallback;

    /**
     * Callback function on application transition.
     *
     * @type { ?AppTransitionCallback }
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 23 static
     */
    onAppTransition?: AppTransitionCallback;

    /**
     * Callback function on minimizing a window.
     *
     * @type { ?WindowMinimizationCallback }
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 23 static
     */
    onMinimizeWindow?: WindowMinimizationCallback;

    /**
     * Callback function on closing a window.
     *
     * @type { ?WindowCloseCallback }
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 23 static
     */
    onCloseWindow?: WindowCloseCallback;

    /**
     * Callback function on unlocking the screen.
     *
     * @type { ?ScreenUnlockCallback }
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 23 static
     */
    onScreenUnlock?: ScreenUnlockCallback;

    /**
     * Callback function on window animation targets update.
     *
     * @type { ?WindowAnimationTargetsUpdationCallback }
     * @syscap SystemCapability.WindowManager.WindowManager.Core
     * @systemapi Hide this for inner system use.
     * @since 23 static
     */
    onWindowAnimationTargetsUpdate?: WindowAnimationTargetsUpdationCallback;
  }
}

export default windowAnimationManager;