import { InputHTMLAttributes, ReactNode } from 'react';
import { ApphouseComponent } from '../component.interfaces';
import { InputComponentStyles } from './input.styles.interface';
import { Modify } from '../../types/type.utils';
import { InputStyles } from '../../styles/defaults/themes.interface';

type HtmlInputProps = Modify<
  InputHTMLAttributes<HTMLInputElement | HTMLTextAreaElement>,
  { onChange: (value: string) => void; children?: React.ReactNode }
>;

/**
 * Interface for props to be passed to the input component
 */
export interface InputProps
  extends ApphouseComponent<InputComponentStyles>,
    Partial<HtmlInputProps> {
  /**
   * Label for the input.
   */
  label?: string;
  /**
   * unique id for the input
   */
  id: string;
  /**
   * if true, the input will be a textarea
   */
  multiline?: boolean;
  /**
   * Styles to be applied to the input element
   * @default 'default'
   */
  variant?: keyof InputStyles;
  /**
   * A description for the input field, if set it will be displayed below the input
   * label
   * @optional
   */
  description?: ReactNode;
  /**
   * If true, the input will resize the width according to the content
   * @default false
   */
  resizableWidth?: boolean;
  /**
   * If true, the input will resize the height according to the content
   * @default false
   */
  resizableHeight?: boolean;
  /**
   * If true, the input will be switched to password type
   * @default false
   */
  password?: boolean;
  /**
   * If true, it will fill the width of the parent container
   * @default false
   */
  fullWidth?: boolean;
  /**
   * If provided, it will be displayed below the input as an error message.
   */
  error?: string;
}
