const VALID_LETTER = 'а|в|е|к|м|н|о|р|с|т|у|х';

const invalidCharsRe = new RegExp(`[^(${VALID_LETTER})0-9]`, 'gi');
const cleanValue = (value: string) => value.replace(invalidCharsRe, '');

const validCarNumberInputRe = new RegExp(`^([${VALID_LETTER}]{1}|$)((?:[0-9]|$)(?:[0-9]|$)(?:[0-9]|$))([${VALID_LETTER}]{1,2}|$)((?:[0-9]|$)(?:[0-9]|$)(?:[0-9]|$))$`, 'gi');
const isValidInput = (cleanedValue: string) => validCarNumberInputRe.test(cleanedValue);

const formatAsCarNumber = (cleanedValue: string) => {
  return cleanedValue.replace(validCarNumberInputRe, (_, p1, p2, p3, p4) => [p1, p2, p3, p4].join(' ')).toUpperCase();
};
const getWithoutLastChar = (value: string) => value.substring(0, value.length - 1);

export const handleInputChange = (value: string | undefined | null) => {
  const cleanedValue = cleanValue(value);

  if (!cleanedValue) {
    return '';
  }

  if (isValidInput(cleanedValue)) {
    return formatAsCarNumber(cleanedValue).trim();
  }

  return getWithoutLastChar(value).trim();
};

const validCarNumberRe = new RegExp(`^[${VALID_LETTER}][0-9]{3}[${VALID_LETTER}]{2}[0-9]{2,3}$`, 'i');

export const isValidCarNumber = (value: string) => {
  const cleanedValue = cleanValue(value);
  return validCarNumberRe.test(cleanedValue);
};