import { TextField, TextFieldVariants } from "@mui/material";
import { LenConstraint } from "../../api/ServerApi";

/**
 * Text input
 */
export function TextInput(p: {
  label?: string;
  editable?: boolean;
  value?: string;
  onValueChange?: (newVal: string | undefined) => void;
  size?: LenConstraint;
  checkValue?: (s: string) => boolean;
  multiline?: boolean;
  minRows?: number;
  maxRows?: number;
  placeholder?: string;
  type?: React.HTMLInputTypeAttribute;
  style?: React.CSSProperties;
  helperText?: string;
  variant?: TextFieldVariants;
}): React.ReactElement {
  if (!p.editable && (p.value ?? "") === "") return <></>;

  let valueError = undefined;
  if (p.value && p.value.length > 0) {
    if (p.size?.min && p.type !== "number" && p.value.length < p.size.min)
      valueError = `Please specify at least ${p.size.min} characters !`;
    if (p.checkValue && !p.checkValue(p.value)) valueError = "Invalid value!";
    if (
      p.type === "number" &&
      p.size &&
      (Number(p.value) > p.size.max || Number(p.value) < p.size.min)
    )
      valueError = "Invalid size range!";
  }

  return (
    <TextField
      label={p.label}
      value={p.value ?? ""}
      onChange={(e) =>
        p.onValueChange?.(
          e.target.value.length === 0 ? undefined : e.target.value
        )
      }
      slotProps={{
        input: {
          readOnly: !p.editable,
          type: p.type,
        },
        htmlInput: { maxLength: p.size?.max, placeholder: p.placeholder },
      }}
      variant={p.variant ?? "standard"}
      style={p.style ?? { width: "100%", marginBottom: "15px" }}
      multiline={p.multiline}
      minRows={p.minRows}
      maxRows={p.maxRows}
      error={valueError !== undefined}
      helperText={valueError ?? p.helperText}
    />
  );
}
