import { UniElement } from './index'
import { UniElementType, UniElementStyles } from './UniElementType'
import { UniViewElement } from './index'
import { UniTextElement } from './index'
import { UniImageElement } from './index'
import { UniRichTextNativeElement } from './index'
import { UniNativeView } from './UniNativeView'
import { UniNativeTextView } from './UniNativeTextView'
import { UniNativeImageView } from './UniNativeImageView'
import { UniNativeScrollView, UniNativeScrollViewOptions } from './UniNativeScrollView'
import { UniNativeCustomView } from './UniNativeCustomView'
import { UniNativeRichTextNativeView } from './UniNativeRichTextNativelView'
import { UniTextLayout } from './index'
import { UniText } from './index'


declare global {
  /**
   * 页面对象
   */
  interface UniPage {

    /**
     * 以下属性在DOM层封装
     * - Android平台：kt层封装
     * - iOS平台：c层实现
     * - 鸿蒙平台：c层实现
     */
    /**
     * 获取当前页面是否处于可复用状态，
     *  仅内部使用（不公开给开发者），用于解决image组件在复用场景时会闪以下复用前的图片
     *  当页面中的list等复用组件处于复用状态时，将会将此状态设置为true，处于非复用状态时设置为false
     *  iamge组件在更新src时如果当前页面处于isRecycling状态，需要先同步清空UI显示内容，避免显示复用前的图片
     */
    isRecycling(): boolean
    /**
     * 设置当前页面是否处于可复用状态
     */
    setRecycling(value: boolean): void

    /**
     * 创建UniElement
     * 仅内部使用，c层实现，在线程1中创建
     * @param type - UniElementType类型
     * @param flatten - Element是否被拍平（扁平化）
     *  true表示可拍平，false表示不可拍平，默认值false
     * @param style - 同时设置多个CSS样式
     * 注意：在Android平台仅支持排版CSS，为了各平台统一，编译生成的代码应该只设置排版相关CSS
     */
    // 废弃通过类型创建UniElement的API，改用下面创建指定类型的UniElement
    // createElement(type: UniElementType, flatten: boolean): UniElement
    // createElement(type: UniElementType, flatten: boolean, style?: UniElementStyles | null): UniElement
    /**
     * 创建view组件的Element
     * @internal
     */
    createViewElement(flatten: boolean, style?: UniElementStyles | null): UniViewElement
    /**
     * 创建text组件的Element
     * @internal
     */
    createTextElement(flatten: boolean, style?: UniElementStyles | null): UniTextElement
    /**
     * 创建image组件的Element
     * @internal
     */
    createImageElement(flatten: boolean, style?: UniElementStyles | null): UniImageElement
    /**
     * 创建scroll-view组件的Element
     * @internal
     */
    createScrollViewElement(): UniScrollViewElement
    /**
     * 创建nested-scroll-header组件的Element
     * @internal
     */
    createNestedScrollHeaderElement(): UniNestedScrollHeaderElement
    /**
     * 创建nested-scroll-body组件的Element
     * @internal
     */
    createNestedScrollBodyElement(): UniNestedScrollBodyElement
    /**
     * 创建native-viewe组件的Element
     * @internal
     */
    createNativeViewElement(): UniNativeViewElement
    /**
     * 创建rich-text-native组件的Element
     * @internal
     */
    createRichTextNativeElement(): UniRichTextNativeElement
    /**
     * 创建注释节点的Element
     * @internal
     */
    createComment(data: string): UniElement
    /**
     * 目前该API仅限特定场景使用，比如
     * <text><slot>123</slot></text>
     * <custom>123</custom>
     * @internal
     */
    createTextNode(data?: string | null): UniText
    /**
     * Android平台Kotlin层实现
     *  用于Android平台线程2中创建
     * @internal
     */
    createElement(type: UniElementType): UniElement
    /**
     * Android平台Kotlin层实现
     *  用于Android平台线程2中uts组件（native-view）中自定义的Element，仅限原生层自定义Element使用
     * @internal
     */
    createCustomNativeElement(name: string, flatten: boolean): UniElement
    /**
     * Android平台Kotlin层实现
     *  用于Android平台线程1中创建UniTextLayout
     * @internal
     */
    createTextLayout(id?: number | null): UniTextLayout
    /**
     * 增加TextLayout内部计数器，解决非text节点不需要创建TextLayout时能同时增加计数，确保内部id与UniTextElement的内部id一致
     * @internal
     */
    increaseTextLayoutCounter(count: number): void

    /**
     * 创建原生View（view）
     * @param flatten 原生View是否被拍平（扁平化），true表示可拍平，false表示不可拍平，默认值false
     * @internal
     */
    createNativeView(flatten: boolean): UniNativeView
    /**
     * 创建原生文本View（text）
     * @internal
     */
    createNativeTextView(flatten: boolean): UniNativeTextView
    /**
     * 创建原生图片View（image）
     * @internal
     */
    createNativeImageView(flatten: boolean): UniNativeImageView
    /**
     * 创建原生滚动View（scroll-view）
     * @internal
     */
    createNativeScrollView(options: UniNativeScrollViewOptions): UniNativeScrollView
    /**
     * 创建原生自定义View（native-view）
     * @internal
     */
    createNativeCustomView(): UniNativeCustomView
    /**
     * 创建原生富文本View（rich-text-native）
     */
    createNativeRichTextNativeView(): UniNativeRichTextNativeView
    // 废弃通过类型创建NativeView的API，改用上面创建指定类型的原生View
    // createNativeView(type: UniNativeViewType, flatten: boolean): UniNativeBaseView
    // createNativeView<T extends UniNativeBaseView>(type: UniNativeViewType, flatten: boolean): T
    /**
     * 增加原生view内部计数器，解决一些虚拟节点只需要创建UniElement，不需要创建UniNativeView的场景
     * @param count - 增加计数器值，默认值为1
     * @internal
     */
    increaseNativeViewCounter(count: number): void

    /**
     * 通过内部NodeID查找节点
     * @param id
     *  内部Node id
     * @internal
     */
    getNodeById(id: number): UniElement | null

    /**
     * 通过id属性查找元素
     * @param id
     *  元素的id值
     * @internal
     */
    getElementById(id: string): UniElement | null

    /**
     * 定义CSS变量
     * @param key - css变量名称
     * @param value - css变量值，空字符串则表示移除变量定义
     * @internal
     */
    defineStyleVariable(key: string, value: string): void

    /**
     * 获取DOM数据
     * @return {UTSJSONObject} 对象中包含以下字段数据
     *  children - Array[UTSJSONObject]类型，如果没有子，则此数据不存在
     *  attributes - UTSJSONObject类型，所有的属性列表：key为字符串类型属性名称，value为字符串类型属性值
     *                属性名称存在中划线时，保留中划线
     *  styles - UTSJSONObject类型，所有的样式列表：key为字符串类型样式名称，value为字符串类型样式值
     *                样式名称存在中划线时，保留中划线
     *  computedLayouts - UTSJSONObject类型，包括left/top/width/height，单位为逻辑像素值
     *  vueComponentId - string类型，vue组件标识，仅蒸汽模式存在
     *  vueComponentName - string类型，vue组件名称，仅蒸汽模式存在
     *  VueComponentPath - string类型，vue组件路径，仅蒸汽模式存在
     * @internal
     */
    getDom(): UTSJSONObject
  }
}
