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

import type { AsyncCallback } from '@ohos.base';
import type image from '@ohos.multimedia.image';

/**
 * @name  effectKit
 * @since 9
 */
declare namespace effectKit {

  /**
   * The Filter of FilterChain.
   * @since 9
   * @syscap SystemCapability.Multimedia.Image.Core
   */
  interface Filter {

    /**
    * A blur effect is added to the image.
    * @since 9
    * @syscap SystemCapability.Multimedia.Image.Core
    * @param radius The degree of blur, the value is measured in pixels.
    * @returns Filters for the current effect have been added.
    */
    blur(radius: number): Filter;

    /**
     * A blur effect is added to the image.
     * @param { number } radius - The degree of blur, the value is measured in pixels.
     * @param { TileMode } tileMode - The tile mode of blur.
     * @returns { Filter } Filters for the current effect have been added.
     * @syscap SystemCapability.Multimedia.Image.Core
     * @since 14
     */
    blur(radius: number, tileMode: TileMode): Filter;

    /**
    * A Brightness effect is added to the image.
    * @since 9
    * @syscap SystemCapability.Multimedia.Image.Core
    * @param bright The degree of light and darkness,the value range is 0 to 1.
    * @returns Filters for the current effect have been added.
    */
    brightness(bright: number): Filter;

    /**
    * A Grayscale effect is added to the image.
    * @since 9
    * @syscap SystemCapability.Multimedia.Image.Core
    * @returns Filters for the current effect have been added.
    */
    grayscale(): Filter;

    /**
    * Gets the PixelMap where all filter effects have been added to the image.
    * @since 9
    * @syscap SystemCapability.Multimedia.Image.Core
    * @returns image.PixelMap.
    */
    getPixelMap(): image.PixelMap;

    /**
     * Gets the PixelMap where all filter effects have been added to the image.
     * @returns { Promise<image.PixelMap> } - returns the PixelMap generated.
     * @syscap SystemCapability.Multimedia.Image.Core
     * @since 11
     */
    getEffectPixelMap(): Promise<image.PixelMap>;
  }

  /**
   * The color picker of an image.
   * @since 9
   * @syscap SystemCapability.Multimedia.Image.Core
   */
  interface ColorPicker {

    /**
     * get main color of an image
     * @since 9
     * @syscap SystemCapability.Multimedia.Image.Core
     */
    getMainColor(): Promise<Color>;

    /**
     * get main color of an image
     * @since 9
     * @syscap SystemCapability.Multimedia.Image.Core
     */
    getMainColorSync(): Color;

    /**
     * Get largest proportion color of an image
     * @since 10
     * @syscap SystemCapability.Multimedia.Image.Core
     * @returns {Color} Largest proportion color picked in the image.
     */
    getLargestProportionColor(): Color;
    getTopProportionColors(colorCount: number): Array<Color | null>;
    /**
     * Get highest saturation color of an image
     * @since 10
     * @syscap SystemCapability.Multimedia.Image.Core
     * @returns {Color} Highest saturation color picked in the image.
     */
    getHighestSaturationColor(): Color;

    /**
     * Get average color of an image
     * @since 10
     * @syscap SystemCapability.Multimedia.Image.Core
     * @returns {Color} Average color calculated in the image.
     */
    getAverageColor(): Color;

    /**
     * Determine whether the color is black or white or gray
     * @since 10
     * @syscap SystemCapability.Multimedia.Image.Core
     * @param {color} number The 32 bit ARGB color to discriminate.
     * @returns {boolean} Result of judging black, white and gray.
     */
    isBlackOrWhiteOrGrayColor(color: number): boolean;
    discriminatePitureLightDegree(): PictureLightColorDegree;
    getReverseColor(): Color
  }

  enum PictureLightColorDegree {

    UNKOWN_LIGHT_COLOR_DEGREE_PICTURE = 0,

    EXTREMELY_LIGHT_COLOR_PICTURE = 1,

    LIGHT_COLOR_PICTURE = 2,

    DARK_COLOR_PICTURE = 3,

    EXTREMELY_DARK_COLOR_PICTURE = 4,

    FLOWERY_PICTURE = 5,

    EXTREMELY_FLOWERY_PICTURE = 6,

  }

  /**
   * The color param.
   * @since 9
   * @syscap SystemCapability.Multimedia.Image.Core
   */
  interface Color {

    /**
     * Red
     * @since 9
     * @syscap SystemCapability.Multimedia.Image.Core
     */
    red: number;

    /**
     * Green
     * @since 9
     * @syscap SystemCapability.Multimedia.Image.Core
     */
    green: number;

    /**
     * Blue
     * @since 9
     * @syscap SystemCapability.Multimedia.Image.Core
     */
    blue: number;

    /**
     * Alpha
     * @since 9
     * @syscap SystemCapability.Multimedia.Image.Core
     */
    alpha: number;
  }

  /**
   * Create a FilterChain to add multiple effects to an image.
   * @since 9
   * @syscap SystemCapability.Multimedia.Image.Core
   * @param image.PixelMap.
   * @returns Returns the head node of FilterChain.
   */
  function createEffect(source: image.PixelMap): Filter;

  /**
   * Create a color picker to get color of an image.
   * @param { image.PixelMap } source - the source pixelmap.
   * @returns { Promise<ColorPicker> } - returns the ColorPicker generated.
   * @throws { BusinessError } 401 - Input parameter error.
   * @syscap SystemCapability.Multimedia.Image.Core
   * @since 9
   */
  function createColorPicker(source: image.PixelMap): Promise<ColorPicker>;

  /**
   * Create a color picker to get color of an image.
   * @param { image.PixelMap } source - the source pixelmap.
   * @param { Array<number> } region - contains 4 elements, represents the region's left, top, right, bottom coordinates,
   * default is [0, 0, 1, 1], represents the region of color picker is the whole pixelMap.
   * @returns { Promise<ColorPicker> } - returns the ColorPicker generated.
   * @throws { BusinessError } 401 - Input parameter error.
   * @syscap SystemCapability.Multimedia.Image.Core
   * @since 10
   */
  function createColorPicker(source: image.PixelMap, region: Array<number>): Promise<ColorPicker>;

  /**
   * Create a color picker to get color of an image.
   * @param { image.PixelMap } source - the source pixelmap.
   * @param { AsyncCallback<ColorPicker> } callback - the callback of createColorPicker.
   * @throws { BusinessError } 401 - Input parameter error.
   * @syscap SystemCapability.Multimedia.Image.Core
   * @since 9
   */
  function createColorPicker(source: image.PixelMap, callback: AsyncCallback<ColorPicker>): void;
  
  /**
   * Create a color picker to get color of an image.
   * @param { image.PixelMap } source - the source pixelmap.
   * @param { Array<number> } region - contains 4 elements, represents the region's left, top, right, bottom coordinates,
   * default is [0, 0, 1, 1], represents the region of color picker is the whole pixelMap.
   * @param { AsyncCallback<ColorPicker> } callback - the callback of createColorPicker.
   * @throws { BusinessError } 401 - Input parameter error.
   * @syscap SystemCapability.Multimedia.Image.Core
   * @since 10
   */
  function createColorPicker(source: image.PixelMap, region: Array<number>, callback: AsyncCallback<ColorPicker>): void;

  /**
   * TileMode enumeration description
   *
   * @enum { number }
   * @syscap SystemCapability.Multimedia.Image.Core
   * @since 14
   */
  enum TileMode {
    /**
     * Clamp mode.
     *
     * @syscap SystemCapability.Multimedia.Image.Core
     * @since 14
     */
    CLAMP = 0,
    /**
     * Repeat mode.
     *
     * @syscap SystemCapability.Multimedia.Image.Core
     * @since 14
     */
    REPEAT = 1,
    /**
     * Mirror mode.
     *
     * @syscap SystemCapability.Multimedia.Image.Core
     * @since 14
     */
    MIRROR = 2,
    /**
     * Decal mode.
     *
     * @syscap SystemCapability.Multimedia.Image.Core
     * @since 14
     */
    DECAL = 3
  }
}

export default effectKit;