/*
 * Copyright (C) 2024 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.
 */
import { HeaderOptions, HttpRequestOption } from './ImageKnifeOption'
import { ImageKnifeRequest } from './ImageKnifeRequest'
import { IEngineKey } from '../key/IEngineKey'
import { PixelMapTransformation } from '../transform/PixelMapTransformation'
import common from '@ohos.app.ability.common';
import { Size } from '@kit.ArkUI'
import { DownsampleStrategy } from '../downsampling/DownsampleStartegy'
import List from '@ohos.util.List';
import { sendableImage } from '@kit.ImageKit';
import http from '@ohos.net.http';

export interface ImageKnifeData {
  source: PixelMap | string, // url
  imageWidth: number, // 原始宽高大小
  imageHeight: number,
  bufSize?: number, // 图片的字节数
  type?:string,
  httpCode?: number, // 网络请求状态码及错误码
  imageAnimator?: Array<ImageFrameInfo>
  frameCount ?: number // 帧
  decodeImages?: Array<DecodeImageInfo> //Image组件或者ImageAnimator组件可以加载一张或者多张
  timeInfo?: TimeInfo // 加载图片的各个时间点
  errorInfo?: ErrorInfo // 错误
}

/**
 * 解码后的图片的size
 */
export interface DecodeImageInfo {
  contentWidth ?: number // 解码后宽高
  contentHeight?: number
  contentSize ?: number // 大小
}

/**
 * 加载的错误信息
 */
export interface ErrorInfo {
  phase: string, //图片加载阶段信息,如:网络加载阶段,缓存获取阶段及其解码阶段等
  code: number,
}

/**
 * load检查时间点
 */
export interface TimeInfo {
  requestStartTime?: number,
  requestEndTime?: number,
  requestCancelTime?: number,
  memoryCheckStartTime?: number,
  memoryCheckEndTime?: number,
  diskCheckStartTime?: number,
  diskCheckEndTime?: number,
  netRequestStartTime?: number,
  netRequestEndTime?: number,
  decodeStartTime?: number,
  decodeEndTime?: number,
}

/**
 * onComplete成功回调
 */
export interface EventImage {
  width: number;
  height: number;
  componentWidth: number;
  componentHeight: number;
  loadingStatus: number;
  contentWidth: number;
  contentHeight: number;
  contentOffsetX: number;
  contentOffsetY: number;
}
/**
 * 缓存策略
 */
export enum CacheStrategy {
  // 默认-写入/读取内存和文件缓存
  Default = 0,
  // 只写入/读取内存缓存
  Memory = 1,
  // 只写入/读取文件缓存
  File = 2
}

/**
 * 区分是src,placehodler,还是error_holder
 */
export enum ImageKnifeRequestSource {
  SRC,
  PLACE_HOLDER,
  ERROR_HOLDER
}


export interface ImageKnifeRequestWithSource {
  request: ImageKnifeRequest
  source: ImageKnifeRequestSource
}

export interface ImageKnifeCheckRequest {
  memoryKey: string
  requestList: List<ImageKnifeRequestWithSource>
}

/**
 * request子线程处理时的返回
 */
export interface RequestJobResult {
  pixelMap: sendableImage.PixelMap | string | undefined
  bufferSize: number
  fileKey: string
  loadFail?: string,
  size?:Size,
  type?: string,
  pixelMapList?:Array<sendableImage.PixelMap>,
  delayList?: Array<number>,
  imageKnifeData?: ImageKnifeData,
}

/**
 * request子线程处理时的请求参数
 */
export interface RequestJobRequest {
  context: common.UIAbilityContext,
  src: string | number,
  headers?: Array<HeaderOptions>,
  allHeaders: Map<string, Object>,
  componentWidth: number,
  componentHeight: number,
  customGetImage?: (context: Context, src: string | PixelMap | Resource,headers?: Record<string,Object>,httpOption?:HttpRequestOption) => Promise<ArrayBuffer | undefined>,
  onlyRetrieveFromCache?: boolean
  requestSource: ImageKnifeRequestSource
  transformation?: PixelMapTransformation
  writeCacheStrategy?: CacheStrategy
  signature?: string
  engineKey: IEngineKey
  isWatchProgress: boolean
  memoryKey: string
  fileCacheFolder: string,
  isAnimator?: boolean,
  moduleName?:string,
  resName?: string
  targetWidth: number
  targetHeight: number
  downsampType: DownsampleStrategy,
  isAutoImageFit: boolean,
  componentId?: number,
  componentVersion?: number
  caPath?: string,
  connectTimeout?: number
  readTimeout?: number
  dnsOverHttps?: string,
  dnsServers?: Array<string>,
  remoteValidation?: http.RemoteValidation,
  pixelName?: string,
  dynamicRangeMode?: DynamicRangeMode,
  jpegOptimizeDecoding?: boolean
}

export interface FlipRotate{
  horizontal: boolean,
  vertical: boolean,
  rotate: number,
}