import type React from 'react'
import type {
  View,
  ViewProps,
  TextProps,
  StyleProp,
  ViewStyle,
  TextStyle,
  TouchableOpacityProps,
  ColorValue,
} from 'react-native'

import type { PopupPropsCommon } from '../popup/interface'

export interface DropdownBadgeProps extends TextProps {
  /**
   * 徽标内容/展示的数字
   */
  count?: string | number | boolean
}

export interface DropdownItemOption<T> {
  /**
   * 文字
   */
  label: string

  /**
   * 标识符
   */
  value: T

  /**
   * 徽章
   */
  badge?: number | string | boolean

  children?: DropdownItemOption<T>[]
}

export interface DropdownTextProps extends TouchableOpacityProps {
  /**
   * 标题文案样式
   */
  textStyle?: StyleProp<TextStyle>

  /**
   * 图标样式
   */
  iconStyle?: StyleProp<ViewStyle>

  /**
   * 是否禁用菜单
   * @default false
   */
  disabled?: boolean

  /**
   * 菜单项标题
   */
  title: string

  /**
   * 是否激活状态
   * @default false
   */
  active?: boolean

  /**
   * 是否可点击 配合
   * @default true
   */
  pressable?: boolean

  /**
   * 菜单标题和选项的选中态颜色
   * @default dropdown_active_color
   */
  activeColor?: ColorValue

  /**
   * 箭头默认朝向
   * @default 'down'
   */
  direction?: 'up' | 'down'

  /**
   * 徽章
   */
  badge?: number | string | boolean
}

export interface DropdownItemProps<T>
  extends Partial<Pick<DropdownTextProps, 'iconStyle' | 'disabled'>> {
  /**
   * 标题样式
   */
  titleStyle?: StyleProp<ViewStyle>

  /**
   * 标题文案样式
   */
  titleTextStyle?: StyleProp<TextStyle>

  /**
   * 选项数组
   */
  options: DropdownItemOption<T>[]

  /**
   * 当前选中的选项值
   */
  value?: T

  /**
   * 默认值
   */
  defaultValue?: T

  /**
   * 点击选项导致 value 变化时触发
   */
  onChange?: (v: T, d: DropdownItemOption<T>) => void

  /**
   * 动画时长，单位秒
   * @default animation_duration_fast
   */
  duration?: number

  /**
   * 菜单栏 z-index 层级
   * @default 10
   */
  zIndex?: number

  /**
   * 是否在点击外部元素后关闭菜单
   * @default true
   */
  closeOnPressOutside?: boolean

  /**
   * 每个选项是否显示分割线
   */
  divider?: boolean

  /**
   * 候选项加载中
   */
  loading?: boolean

  /**
   * 支持搜索
   */
  search?: boolean
}

export interface DropdownContext
  extends Partial<
      Pick<DropdownTextProps, 'iconStyle' | 'activeColor' | 'direction'>
    >,
    Partial<
      Pick<
        DropdownItemProps<any>,
        | 'titleStyle'
        | 'titleTextStyle'
        | 'duration'
        | 'zIndex'
        | 'closeOnPressOutside'
      >
    > {
  /**
   * 菜单的 Ref，内部使用不向外暴露
   */
  MenuRef: React.MutableRefObject<View>
}

export interface DropdownMenuProps
  extends Omit<Partial<DropdownContext>, 'MenuRef'>,
    ViewProps {
  /**
   * 是否显示分割线
   * @default true
   */
  divider?: boolean
}

export interface DropdownPopupProps
  extends Pick<DropdownItemProps<any>, 'zIndex' | 'closeOnPressOutside'>,
    PopupPropsCommon {
  /**
   * 触发目标高度
   */
  targetHeight: number

  /**
   * 触发目标 pageY
   */
  targetPageY: number

  /**
   * 点击非内容的遮罩阴影
   */
  onPressShade?: TouchableOpacityProps['onPress']

  /**
   * 是否开启顶部/底部安全区适配
   * @default true
   */
  safeAreaInset?: boolean
}

export interface DropdownSelectorMethodProps<T>
  extends Omit<
    DropdownItemProps<T>,
    | 'iconStyle'
    | 'disabled'
    | 'titleStyle'
    | 'titleTextStyle'
    | 'value'
    | 'onChange'
    | 'loading'
  > {
  /**
   * 触发目标高度
   */
  targetHeight: number

  /**
   * 触发目标 pageY
   */
  targetPageY: number

  /**
   * 类似确定的回调，当选择到最末端时触发，部分业务需要把选项其他值提取出来
   */
  onConfirm?: (v: T, d: DropdownItemOption<T>) => void

  /**
   * 取消
   */
  onCancel?: () => void

  onClosed?: PopupPropsCommon['onClosed']

  /**
   * 菜单标题和选项的选中态颜色
   * @default dropdown_active_color
   */
  activeColor?: ColorValue
}
