import { ReactNode } from 'react';
import { GroupBase, Props, StylesConfig, ThemeConfig } from 'react-select';
import { AsyncPaginateProps } from 'react-select-async-paginate';
import { FieldValidator } from 'formik';
import { ButtonProps } from 'reactstrap';

/* eslint-disable @typescript-eslint/no-explicit-any */


interface SelectStyleArgs {
  showError?: boolean;
  styles?: StylesConfig;
  isInline?: boolean;
}

declare const selectStyles: (props: SelectStyleArgs) => {
  styles: StylesConfig;
  theme: ThemeConfig;
};

type SelectProps<Option, IsMulti extends boolean, Group extends GroupBase<Option> = GroupBase<Option>> = {
  allowSelectAll?: boolean;
  autofill?: boolean | Record<string, string | ((value: any) => any)>;
  cacheUniq?: any | any[];
  clearButtonClassName?: string;
  clearButtonText?: string;
  creatable?: boolean;
  clearButtonProps?: ButtonProps;
  defaultToFirstOption?: boolean;
  defaultToOnlyOption?: boolean;
  feedback?: boolean;
  helpMessage?: ReactNode;
  labelKey?: string;
  loadOptions?: AsyncPaginateProps<Option, Group, any, IsMulti>['loadOptions'];
  minLength?: number;
  maxLength?: number;
  name: string;
  onChange?: (value: Option) => void;
  raw?: boolean;
  required?: boolean;
  selectRef?: AsyncPaginateProps<Option, Group, any, IsMulti>['selectRef'];
  validate?: FieldValidator;
  waitUntilFocused?: boolean;
  valueKey?: string;
} & Omit<Props<Option, IsMulti, Group>, 'onChange'>;

declare const Select: <Option, IsMulti extends boolean, Group extends GroupBase<Option> = GroupBase<Option>>(
  props: SelectProps<Option, IsMulti, Group>
) => JSX.Element;

type SelectFieldProps<Option, IsMulti extends boolean, Group extends GroupBase<Option> = GroupBase<Option>> = {
  feedbackClass?: string;
  groupClass?: string;
  helpId?: string;
  label?: ReactNode;
  labelClass?: string;
  labelHidden?: boolean;
  required?: boolean;
  isHelpVideoType?: boolean;
} & SelectProps<Option, IsMulti, Group>;

declare const SelectField: <Option, IsMulti extends boolean, Group extends GroupBase<Option> = GroupBase<Option>>(
  props: SelectFieldProps<Option, IsMulti, Group>
) => JSX.Element;

/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/ban-types */


type ResourceSelectProps<
  Option,
  IsMulti extends boolean,
  Group extends GroupBase<Option> = GroupBase<Option>
> = {
  additional?: object;
  additionalPostGetArgs?: object;
  customerId?: string;
  debounceTimeout?: number;
  defaultToFirstOption?: boolean;
  defaultToOnlyOption?: boolean;
  delay?: number;
  encodeSearchValue?: boolean;
  getResult?: string | ((resource: any, data: any) => any);
  graphqlConfig?: { type: string; query: string };
  hasMore?:
    | boolean
    | ((data: any) => boolean)
    | ((data: { totalCount: number; limit: number; offset: number }) => boolean);
  itemsPerPage?: number;
  method?: 'POST' | 'GET';
  minCharsToSearch?: number;
  onError?: (error: unknown) => void;
  onPageChange?: (inputValue: any, page: any) => void;
  parameters?: any | ((params: any) => void);
  pageAll?: boolean;
  pageAllSearchBy?: (previousOptions: Option[], inputValue: string) => Option[] | Promise<Option[]>;
  requestConfig?: any;
  requiredParams?: any[];
  resource: any;
  searchTerm?: string;
  shouldSearch?: boolean | ((inputValue: string, prevOptions: Option[], additional: any) => boolean);
  watchParams?: any[];
} & SelectFieldProps<Option, IsMulti, Group>;

declare const ResourceSelect: (<Option, IsMulti extends boolean, Group extends GroupBase<Option> = GroupBase<Option>>(
  props: ResourceSelectProps<Option, IsMulti, Group>
) => JSX.Element) & {
  create<Option, IsMulti extends boolean, Group extends GroupBase<Option>>(
    defaults: ResourceSelectProps<Option, IsMulti, Group>
  ): (props: ResourceSelectProps<Option, IsMulti, Group>) => JSX.Element;
};

type PrebuiltResourceSelectProps$2<
  Option,
  IsMulti extends boolean,
  Group extends GroupBase<Option> = GroupBase<Option>
> = Omit<ResourceSelectProps<Option, IsMulti, Group>, 'resource'>;

type Organization = {
  id: string;
  customerId: string;
  name: string;
  dbaName: string;
  status: string;
  statusCode: string;
  types: { code: string; name: string }[];
  primaryConrollingAuthority: { lastName: string; firstName: string; primaryPhone: string; email: string };
  physicalAddress: Address;
  mailingAddress: Address;
  billingAddress: Address;
  regions: { code: string; value: string }[];
  npis: { number: string }[];
  taxIds: { number: string; type: string }[];
  payerAssignedProviderIds: Record<string, { number: string }[]>;
  phoneNumber: { areaCode: string; exchange: string; phoneNumber: string };
  faxNumber: { areaCode: string; exchange: string; phoneNumber: string };
  numberOfLicensedPhysicians: string;
  numberOfLicensedClinicians: string;
};

type AvOrganizationSelectProps<
  Option,
  IsMulti extends boolean = boolean,
  Group extends GroupBase<Option> = GroupBase<Option>
> = PrebuiltResourceSelectProps$2<Option, IsMulti, Group> & {
  resourceIds?: string | string[] | string[][];
  permissionIds?: string | string[] | string[][];
};

declare const AvOrganizationSelect: <
  Option = Organization,
  IsMulti extends boolean = boolean,
  Group extends GroupBase<Option> = GroupBase<Option>
>(
  props: AvOrganizationSelectProps<Option, IsMulti, Group>
) => JSX.Element;

type PrebuiltResourceSelectProps$1<
  Option,
  IsMulti extends boolean,
  Group extends GroupBase<Option> = GroupBase<Option>
> = Omit<ResourceSelectProps<Option, IsMulti, Group>, 'resource'>;

type Region = {
  id: string;
  value: string;
};

declare const AvRegionSelect: <
  Option = Region,
  IsMulti extends boolean = boolean,
  Group extends GroupBase<Option> = GroupBase<Option>
>(
  props: PrebuiltResourceSelectProps$1<Option, IsMulti, Group> & { defaultToCurrentRegion?: boolean }
) => JSX.Element;

type PrebuiltResourceSelectProps<
  Option,
  IsMulti extends boolean,
  Group extends GroupBase<Option> = GroupBase<Option>
> = Omit<ResourceSelectProps<Option, IsMulti, Group>, 'resource'>;

type Code = {
  code: string;
  value: string;
};

declare const AvCodeSelect: <
  Option = Code,
  IsMulti extends boolean = boolean,
  Group extends GroupBase<Option> = GroupBase<Option>
>(
  props: PrebuiltResourceSelectProps<Option, IsMulti, Group>
) => JSX.Element;

type NavOption = {
  id: string;
  name: string;
  shortName: string;
  description: string;
  type: string;
  activeDate: string;
  hasAccess?: boolean;
  children: NavOption[];
};

declare const AvNavigationSelect: <
  Option = NavOption,
  IsMulti extends boolean = boolean,
  Group extends GroupBase<Option> = GroupBase<Option>
>(
  props: PrebuiltResourceSelectProps<Option, IsMulti, Group>
) => JSX.Element;

type Payer = {
  id: string;
  payerId: string;
  payerName: string;
};

declare const AvPayerSelect: <
  Option = Payer,
  IsMulti extends boolean = boolean,
  Group extends GroupBase<Option> = GroupBase<Option>
>(
  props: PrebuiltResourceSelectProps<Option, IsMulti, Group> & { customerId: string }
) => JSX.Element;

type Permission = {
  id: string;
  description: string;
  organizations: {
    id: string;
    customerId: string;
    name: string;
    resources: {
      id: string;
    }[];
  }[];
};

declare const AvPermissionSelect: <
  Option = Permission,
  IsMulti extends boolean = boolean,
  Group extends GroupBase<Option> = GroupBase<Option>
>(
  props: PrebuiltResourceSelectProps<Option, IsMulti, Group>
) => JSX.Element;

type Provider = {
  id: string;
  businessNAme: string;
  uiDisplayName: string;
  atypical: boolean;
  npi: string;
  customerIds: string[];
  roles: { code: string; value: string }[];
  primaryPhone: { internationalCellularCode: string; areaCode: string; phoneNumber: string };
  primaryFax: { internationalCellularCode: string; areaCode: string; phoneNumber: string };
  primaryAddress: {
    line1: string;
    line2: string;
    city: string;
    state: string;
    stateCode: string;
    zip: { code: string; addon: string };
  };
};

declare const AvProviderSelect: <
  Option = Provider,
  IsMulti extends boolean = boolean,
  Group extends GroupBase<Option> = GroupBase<Option>
>(
  props: PrebuiltResourceSelectProps<Option, IsMulti, Group> & { customerId: string }
) => JSX.Element;

type User = {
  id: string;
  userId: string;
  akaname: string;
  lastName: string;
  firstName: string;
  email: string;
  userValidated: boolean;
  userHasSecurityException: boolean;
  userLatestVerifyStatusCode: string;
  currentRegion: string;
  createDate: string;
  lastUpdateDate: string;
};

declare const AvUserSelect: <
  Option = User,
  IsMulti extends boolean = boolean,
  Group extends GroupBase<Option> = GroupBase<Option>
>(
  props: PrebuiltResourceSelectProps<Option, IsMulti, Group>
) => JSX.Element;

export { AvCodeSelect, AvNavigationSelect, AvOrganizationSelect, AvPayerSelect, AvPermissionSelect, AvProviderSelect, AvRegionSelect, AvUserSelect, ResourceSelect, type ResourceSelectProps, SelectField, type SelectFieldProps, type SelectProps, type SelectStyleArgs, Select as default, selectStyles };
