"use client";

// Ô nhập tiền dùng chung toàn hệ thống: hiển thị "5.000.000" khi gõ, nhưng `value`/`onChange`
// luôn làm việc với chuỗi SỐ GỐC (vd "5000000") — DB và các phép tính không bao giờ thấy dấu chấm.
import { useEffect, useRef, useState } from "react";
import { digitsOnly, formatDigitsVND } from "@/lib/finance";

function digitCountBefore(text: string, pos: number): number {
  return digitsOnly(text.slice(0, pos)).length;
}

function positionAfterDigits(display: string, digitCount: number): number {
  if (digitCount <= 0) return 0;
  let count = 0;
  for (let i = 0; i < display.length; i++) {
    if (/\d/.test(display[i])) count++;
    if (count === digitCount) return i + 1;
  }
  return display.length;
}

export function CurrencyInput({
  value,
  onChange,
  placeholder = "0",
  className = "",
}: {
  value: string;
  onChange: (rawDigits: string) => void;
  placeholder?: string;
  className?: string;
}) {
  const ref = useRef<HTMLInputElement>(null);
  const [display, setDisplay] = useState(formatDigitsVND(value));

  useEffect(() => {
    setDisplay(formatDigitsVND(value));
  }, [value]);

  function applyRaw(newRaw: string, cursorDigits: number) {
    const newDisplay = formatDigitsVND(newRaw);
    onChange(newRaw);
    setDisplay(newDisplay);
    requestAnimationFrame(() => {
      const pos = positionAfterDigits(newDisplay, cursorDigits);
      ref.current?.setSelectionRange(pos, pos);
    });
  }

  function handleChange(e: React.ChangeEvent<HTMLInputElement>) {
    const input = e.target;
    const pos = input.selectionStart ?? input.value.length;
    const cursorDigits = digitCountBefore(input.value, pos);
    const newRaw = digitsOnly(input.value);
    applyRaw(newRaw, cursorDigits);
  }

  function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {
    if (e.key !== "Backspace" && e.key !== "Delete") return;
    const input = e.currentTarget;
    const pos = input.selectionStart ?? 0;
    const selEnd = input.selectionEnd ?? pos;
    if (pos !== selEnd) return; // có vùng chọn — để hành vi mặc định + onChange xử lý

    const raw = digitsOnly(value);

    if (e.key === "Backspace") {
      if (pos === 0) {
        e.preventDefault();
        return;
      }
      const digitsLeft = digitCountBefore(display, pos);
      if (digitsLeft === 0) {
        e.preventDefault();
        return;
      }
      e.preventDefault();
      const newRaw = raw.slice(0, digitsLeft - 1) + raw.slice(digitsLeft);
      applyRaw(newRaw, digitsLeft - 1);
    } else {
      const digitsLeft = digitCountBefore(display, pos);
      if (digitsLeft >= raw.length) {
        e.preventDefault();
        return;
      }
      e.preventDefault();
      const newRaw = raw.slice(0, digitsLeft) + raw.slice(digitsLeft + 1);
      applyRaw(newRaw, digitsLeft);
    }
  }

  return (
    <input
      ref={ref}
      type="text"
      inputMode="numeric"
      placeholder={placeholder}
      value={display}
      onChange={handleChange}
      onKeyDown={handleKeyDown}
      className={className}
    />
  );
}
