import { UniElement } from './index'



/**
 * UniNativeViewElement
 */
export interface UniNativeViewElement extends UniElement {

  /**
   * 设置组件需要重新触发测量排版
   */
  setDirty(): void

  /**
   * 设置测量回调，多次调用会覆盖之前设置的测量回调
   *  @param callback 测量回调方法
   *    注意：此回调方法运行在子线程中，需处理线程安全问题
   */
  setMeasureCallback(callback: UniNativeMeasureCallback): void
}

/**
 * 测量回调方法
 *  @param - res
 */
type UniNativeMeasureCallback = (res: UniNativeMeasureSpecification) => UniNativeMeasureSize
/**
 * 测量约束对象
 */
interface UniNativeMeasureSpecification {
  /**
   * 宽度约束值
   *  不同平台单位存在差异：
   *    - Android平台为物理像素
   *    - iOS/鸿蒙平台为逻辑像素
   */
  width: number,
  /**
   * 宽度约束模式
   */
  widthMode: UniNativeMeasureMode,
  /**
   * 高度约束值
   *  不同平台单位存在差异：
   *    - Android平台为物理像素
   *    - iOS/鸿蒙平台为逻辑像素
   */
  height: number,
  /**
   * 高度约束模式
   */
  heightMode: UniNativeMeasureMode,
}
type UniNativeMeasureSize = UniLayoutSize
/**
 * 测量约束模式
 */
export enum UniNativeMeasureMode {
  /**
   * 父元素对测量的子元素无任何限制，子元素可以是它想要的任意大小
   */
  Undefined,
  /**
   * 父元素对测量的子元素确定了一个精确的尺寸，子元素必须使用这个尺寸
   */
  Exactly,
  /**
   * 父元素对测量的子元素限定的最大尺寸，子元素不能超过此尺寸
   */
  AtMost,
}
