import Vue, { PluginObject } from 'vue'
import { ElementUIComponent, ElementUIComponentSize, ElementUIHorizontalAlignment } from './component'

import { ElAlert } from './alert'
import { ElAside } from './aside'
import { YkAutocomplete } from './autocomplete'
import { YkBadge } from './badge'
import { YkBreadcrumb } from './breadcrumb'
import { YkBreadcrumbItem } from './breadcrumb-item'
import { YkButton } from './button'
import { ElButtonGroup } from './button-group'
import { YkCard } from './card'
import { YkCarousel } from './carousel'
import { YkCarouselItem } from './carousel-item'
import { ElCascader } from './cascader'
import { YkCheckbox } from './checkbox'
import { YkCheckboxButton } from './checkbox-button'
import { YkCheckboxGroup } from './checkbox-group'
import { ElCol } from './col'
import { YkCollapse } from './collapse'
import { YkCollapseItem } from './collapse-item'
import { YkColorPicker } from './color-picker'
import { ElContainer } from './container'
import { YkDatePicker } from './date-picker'
import { YkDialog } from './dialog'
import { YkDropdown } from './dropdown'
import { YkDropdownItem } from './dropdown-item'
import { YkDropdownMenu } from './dropdown-menu'
import { ElFooter } from './footer'
import { YkForm } from './form'
import { YkFormItem } from './form-item'
import { ElHeader } from './header'
import { ElInput } from './input'
import { ElInputNumber } from './input-number'
import { ElLoading } from './loading'
import { ElMain } from './main'
import { YkMenu } from './menu'
import { YkMenuItem } from './menu-item'
import { YkMenuItemGroup } from './menu-item-group'
import { ElMessage } from './message'
import { ElMessageBox } from './message-box'
import { ElNotification } from './notification'
import { ElOption } from './option'
import { ElOptionGroup } from './option-group'
import { ElPagination } from './pagination'
import { YkPopover } from './popover'
import { YkProgress } from './progress'
import { YkRate } from './rate'
import { YkRadio } from './radio'
import { YkRadioButton } from './radio-button'
import { YkRadioGroup } from './radio-group'
import { ElRow } from './row'
import { ElSelect } from './select'
import { YkSlider } from './slider'
import { YkStep } from './step'
import { YkSteps } from './steps'
import { YkSubmenu } from './submenu'
import { YkSwitch } from './switch'
import { ElTable } from './table'
import { ElTableColumn } from './table-column'
import { YkTag } from './tag'
import { YkTabs } from './tabs'
import { YkTabPane } from './tab-pane'
import { YkTimeline } from './timeline'
import { YkTimelineItem } from './timeline-item'
import { YkTimePicker } from './time-picker'
import { ElTimeSelect } from './time-select'
import { YkTooltip } from './tooltip'
import { ElTransfer } from './transfer'
import { YkTree, TreeData } from './tree'
import { ElUpload } from './upload'
import { ElLink } from './link'
import { YkDivider } from './divider'
import { YkElIcon } from './icon'
import { YkCalendar } from './calendar'
import { YkImage } from './image'
import { ElBacktop } from './backtop'
import { ElInfiniteScroll } from './infinite-scroll'
import { YkPageHeader } from './page-header'
import { ElAvatar } from './avatar'
import { YkDrawer } from './drawer'
import { ElPopconfirm } from './popconfirm'
import { YkSkeleton } from './skeleton'
import { YkSkeletonItem } from './skeleton-item'
import { ElCascaderPanel } from './cascader-panel'
import { YkEmpty } from './empty'
import { ElSpinner } from './spinner'
import { YkDescriptions } from './descriptions'
import { YkDescriptionsItem } from './descriptions-item'
import { YkResult } from './result'
import { YKIcon } from './ykicon'
import { YkRoutebook } from './routebook'
import { YkBrowserVersion } from './browserVersion'

export interface InstallationOptions {
  locale: any,
  i18n: any,
  size: string
}

/** The version of @ykcl/smart-ui-oversea */
export const version: string

/**
 * Install all @ykcl/smart-ui-oversea components into Vue.
 * Please do not invoke this method directly.
 * Call `Vue.use(ElementUI)` to install.
 */
export function install (vue: typeof Vue, options: InstallationOptions): void

/** ElementUI component common definition */
export type Component = ElementUIComponent

/** Component size definition for button, input, etc */
export type ComponentSize = ElementUIComponentSize

/** Horizontal alignment */
export type HorizontalAlignment = ElementUIHorizontalAlignment

/** Show animation while loading data */
export const Loading: ElLoading

/** Used to show feedback after an activity. The difference with Notification is that the latter is often used to show a system level passive notification. */
export const Message: ElMessage

/** A set of modal boxes simulating system message box, mainly for message prompt, success tips, error messages and query information */
export const MessageBox: ElMessageBox

/** Displays a global notification message at the upper right corner of the page */
export const Notification: ElNotification

// TS cannot merge imported class with namespace, so declare subclasses instead

/** Alert Component */
export class Alert extends ElAlert {}

/** Aside Component */
export class Aside extends ElAside {}

/** Autocomplete Component */
export class Autocomplete extends YkAutocomplete {}

/** Bagde Component */
export class Badge extends YkBadge {}

/** Breadcrumb Component */
export class Breadcrumb extends YkBreadcrumb {}

/** Breadcrumb Item Component */
export class BreadcrumbItem extends YkBreadcrumbItem {}

/** Button Component */
export class Button extends YkButton {}

/** Button Group Component */
export class ButtonGroup extends ElButtonGroup {}

/** Card Component */
export class Card extends YkCard {}

/** Cascader Component */
export class Cascader extends ElCascader {}

/** Carousel Component */
export class Carousel extends YkCarousel {}

/** Carousel Item Component */
export class CarouselItem extends YkCarouselItem {}

/** Checkbox Component */
export class Checkbox extends YkCheckbox {}

/** Checkbox Button Component */
export class CheckboxButton extends YkCheckboxButton {}

/** Checkbox Group Component */
export class CheckboxGroup extends YkCheckboxGroup {}

/** Colunm Layout Component */
export class Col extends ElCol {}

/** Collapse Component */
export class Collapse extends YkCollapse {}

/** Collapse Item Component */
export class CollapseItem extends YkCollapseItem {}

/** Color Picker Component */
export class ColorPicker extends YkColorPicker {}

/** Container Component */
export class Container extends ElContainer {}

/** Date Picker Component */
export class DatePicker extends YkDatePicker {}

/** Dialog Component */
export class Dialog extends YkDialog {}

/** Dropdown Component */
export class Dropdown extends YkDropdown {}

/** Dropdown Item Component */
export class DropdownItem extends YkDropdownItem {}

/** Dropdown Menu Component */
export class DropdownMenu extends YkDropdownMenu {}

/** Footer Component */
export class Footer extends ElFooter {}

/** Form Component */
export class Form extends YkForm {}

/** Form Item Component */
export class FormItem extends YkFormItem {}

/** Header Component */
export class Header extends ElHeader {}

/** Input Component */
export class Input extends ElInput {}

/** Input Number Component */
export class InputNumber extends ElInputNumber {}

/** Main Component */
export class Main extends ElMain {}

/** Menu that provides navigation for your website */
export class Menu extends YkMenu {}

/** Menu Item Component */
export class MenuItem extends YkMenuItem {}

/** Menu Item Group Component */
export class MenuItemGroup extends YkMenuItemGroup {}

/** Dropdown Select Option Component */
export class Option extends ElOption {}

/** Dropdown Select Option Group Component */
export class OptionGroup extends ElOptionGroup {}

/** Pagination Component */
export class Pagination extends ElPagination {}

/** Popover Component */
export class Popover extends YkPopover {}

/** Progress Component */
export class Progress extends YkProgress {}

/** Rate Component */
export class Rate extends YkRate {}

/** Radio Component */
export class Radio extends YkRadio {}

/** Radio Button Component */
export class RadioButton extends YkRadioButton {}

/** Radio Group Component */
export class RadioGroup extends YkRadioGroup {}

/** Row Layout Component */
export class Row extends ElRow {}

/** Dropdown Select Component */
export class Select extends ElSelect {}

/** Slider Component */
export class Slider extends YkSlider {}

/** Step Component */
export class Step extends YkStep {}

/** Steps Component */
export class Steps extends YkSteps {}

/** Submenu Component */
export class Submenu extends YkSubmenu {}

/** Switch Component */
export class Switch extends YkSwitch {}

/** Table Component */
export class Table extends ElTable {}

/** Table Column Component */
export class TableColumn extends ElTableColumn {}

/** Tabs Component */
export class Tabs extends YkTabs {}

/** Tab Pane Component */
export class TabPane extends YkTabPane {}

/** Tag Component */
export class Tag extends YkTag {}

/** Timeline Component */
export class Timeline extends YkTimeline {}

/** Timeline Item Component */
export class TimelineItem extends YkTimelineItem {}

/** TimePicker Component */
export class TimePicker extends YkTimePicker {}

/** TimeSelect Component */
export class TimeSelect extends ElTimeSelect {}

/** Tooltip Component */
export class Tooltip extends YkTooltip {}

/** Transfer Component */
export class Transfer extends ElTransfer {}

/** Tree Component */
export class Tree<K = any, D = TreeData> extends YkTree<K, D> {}

/** Upload Component */
export class Upload extends ElUpload {}

/** Divider Component */
export class Divider extends YkDivider {}

/** Link Component */
export class Link extends ElLink {}

/** Image Component */
export class Image extends YkImage {}

/** Icon Component */
export class Icon extends YkElIcon {}

/** Calendar Component */
export class Calendar extends YkCalendar {}

/** Backtop Component */
export class Backtop extends ElBacktop {}

/** InfiniteScroll Directive */
export const InfiniteScroll: PluginObject<ElInfiniteScroll>;

/** PageHeader Component */
export class PageHeader extends YkPageHeader {}

/** Avatar Component */
export class Avatar extends ElAvatar {}

/** Drawer Component */
export class Drawer extends YkDrawer {}

/** Popconfirm Component */
export class Popconfirm extends ElPopconfirm {}

/** Skeleton Component */
export class Skeleton extends YkSkeleton {}

/** Skeleton Item Component */
export class SkeletonItem extends YkSkeletonItem {}

/** CascaderPanel Component */
export class CascaderPanel extends ElCascaderPanel {}

/** Empty Component */
export class Empty extends YkEmpty {}

/** Spinner Component */
export class Spinner extends ElSpinner {}

/** Description Component */
export class Descripitions extends YkDescriptions {}

/** Description Item Component */
export class DescripitionsItem extends YkDescriptionsItem {}

/** Result Component */
export class Result extends YkResult {}
/** Ykicon Component */
export class Ykicon extends YKIcon {}

/** Routebook Component */
export class Routebook extends YkRoutebook {}

/** BrowserVersion Component */
export class BrowserVersion extends YkBrowserVersion {}
