import {BooleanDefinition} from 'sanity'
import {BooleanInputProps} from 'sanity'
import {BooleanOptions} from 'sanity'
import {BooleanSchemaType} from 'sanity'
import {NumberDefinition} from 'sanity'
import {NumberInputProps} from 'sanity'
import {NumberOptions} from 'sanity'
import {NumberSchemaType} from 'sanity'
import {Plugin as Plugin_2} from 'sanity'
import {default as React_2} from 'react'
import {StringDefinition} from 'sanity'
import {StringInputProps} from 'sanity'
import {TextDefinition} from 'sanity'
import {TextOptions} from 'sanity'
import {TextSchemaType} from 'sanity'

export declare interface ComputedBooleanDefinition
  extends Omit<BooleanDefinition, 'type' | 'options'> {
  type: 'computedBoolean'
  options: ComputedBooleanOptions
}

export declare const ComputedBooleanInput: React_2.FC<ComputedBooleanInputProps>

export declare type ComputedBooleanInputProps = BooleanInputProps<ComputedBooleanSchemaType>

declare type ComputedBooleanOptions = ComputedFieldOptions<boolean> & BooleanOptions

export declare const computedBooleanSchema: {
  type: 'boolean'
  name: 'computedBoolean'
} & Omit<BooleanDefinition, 'preview'>

declare interface ComputedBooleanSchemaType extends Omit<BooleanSchemaType, 'options'> {
  options: ComputedBooleanOptions
}

declare type ComputedFieldOptions<FieldType> = {
  buttonText?: string
  documentQuerySelection: string
  reduceQueryResult: (queryResult: ComputedQueryResult) => FieldType | Promise<FieldType>
}

declare interface ComputedFieldPluginConfig {}

export declare interface ComputedNumberDefinition
  extends Omit<NumberDefinition, 'type' | 'options'> {
  type: 'computedNumber'
  options: ComputedNumberOptions
}

export declare const ComputedNumberInput: React_2.FC<ComputedNumberInputProps>

export declare type ComputedNumberInputProps = NumberInputProps<ComputedNumberSchemaType>

/**
 * @public
 */
declare type ComputedNumberOptions = ComputedFieldOptions<number> & NumberOptions

export declare const computedNumberSchema: {
  type: 'number'
  name: 'computedNumber'
} & Omit<NumberDefinition, 'preview'>

declare interface ComputedNumberSchemaType extends Omit<NumberSchemaType, 'options'> {
  options: ComputedNumberOptions
}

declare type ComputedQueryResult = {
  draft?: any
  published: any
}

export declare const computedStringSchema: {
  type: 'string'
  name: 'computedString'
} & Omit<StringDefinition, 'preview'>

export declare interface ComputedTextDefinition extends Omit<TextDefinition, 'type' | 'options'> {
  type: 'computedText'
  options: ComputedTextOptions
}

export declare const ComputedTextInput: React_2.FC<ComputedTextInputProps>

export declare type ComputedTextInputProps = StringInputProps<ComputedTextSchemaType>

declare type ComputedTextOptions = ComputedFieldOptions<string> & TextOptions

export declare const computedTextSchema: {
  type: 'text'
  name: 'computedText'
} & Omit<TextDefinition, 'preview'>

declare interface ComputedTextSchemaType extends Omit<TextSchemaType, 'options'> {
  options: ComputedTextOptions
}

export declare const sanityComputedField: Plugin_2<void | ComputedFieldPluginConfig>

export {}

declare module '@sanity/types' {
  interface IntrinsicDefinitions {
    computedBoolean: ComputedBooleanDefinition
    computedText: ComputedTextDefinition
    computedNumber: ComputedNumberDefinition
  }
}
