import type { StaffProfileDto } from './types';

const EMPLOYEE_RE = /^[A-Z0-9-]{3,32}$/;

/** Uppercase + trim for API (matches server normalize). */
export function normalizeEmployeeIdInput(raw: string | null | undefined): string | null {
  if (raw == null || !String(raw).trim()) return null;
  return String(raw).trim().toUpperCase();
}

export function validateEmployeeIdFormat(emp: string | null): string | null {
  if (emp == null || emp === '') return null;
  if (!EMPLOYEE_RE.test(emp)) {
    return 'Mã nhân sự: 3–32 ký tự (chữ hoa, số, gạch ngang).';
  }
  return null;
}

/**
 * Client-side hints before submit (server is authoritative).
 *
 * Accepts a partial profile so the registration form's `StaffFieldState`
 * (a `Pick<>` of `StaffProfileDto`) type-checks under the apps' `strict: true`
 * config — fe0 ran `strict: false`, which silently allowed the narrower shape.
 * Only the picked profile fields are read here.
 */
export function getSubmitReadinessIssues(staff: Partial<StaffProfileDto> | undefined): string[] {
  const issues: string[] = [];
  if (!staff) return ['Chưa có dữ liệu hồ sơ.'];
  const emp = normalizeEmployeeIdInput(staff.employeeId ?? undefined);
  if (!emp) issues.push('Nhập mã số nhân sự.');
  else {
    const e = validateEmployeeIdFormat(emp);
    if (e) issues.push(e);
  }
  if (!staff.academicTitleCode) issues.push('Chọn học hàm / học vị.');
  if (staff.academicTitleCode === 'other' && !String(staff.academicTitleOther ?? '').trim()) {
    issues.push('Nhập nội dung khi chọn «Khác».');
  }
  const hasUnit = Boolean(staff.unitId) || Boolean(String(staff.unitNameFreetext ?? '').trim());
  if (!hasUnit) issues.push('Chọn đơn vị hoặc nhập tên đơn vị.');
  if (!String(staff.jobTitle ?? '').trim()) issues.push('Nhập chức vụ công tác.');
  return issues;
}
