// Простые валидаторы для полей правил роутинга. Возвращают массив ошибочных строк.

const IPV4 =
  /^((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d)$/;
const IPV6 = /^[0-9a-f:]+$/i;
const DOMAIN =
  /^(?=.{1,253}$)([a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)(\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i;

export function invalidCidrs(values) {
  return (values || []).filter((value) => !isValidCidr(value));
}

export function isValidCidr(value) {
  const trimmed = String(value || "").trim();
  if (!trimmed) return false;
  const [addr, mask] = trimmed.split("/");
  if (!addr) return false;

  if (IPV4.test(addr)) {
    if (mask === undefined) return true;
    const m = Number(mask);
    return Number.isInteger(m) && m >= 0 && m <= 32;
  }
  if (IPV6.test(addr) && addr.includes(":")) {
    if (mask === undefined) return true;
    const m = Number(mask);
    return Number.isInteger(m) && m >= 0 && m <= 128;
  }
  return false;
}

export function invalidPorts(values) {
  return (values || []).filter((value) => !isValidPort(value));
}

export function isValidPort(value) {
  const n = Number.parseInt(String(value).trim(), 10);
  return Number.isInteger(n) && n > 0 && n <= 65535;
}

export function invalidDomains(values) {
  return (values || []).filter((value) => !DOMAIN.test(String(value).trim()));
}

export function ruleErrors(rule) {
  return {
    domains: invalidDomains(rule.domains),
    domainSuffixes: invalidDomains(rule.domainSuffixes),
    ipCidrs: invalidCidrs(rule.ipCidrs),
    ports: invalidPorts(rule.ports),
  };
}

export function hasErrors(errors) {
  return Object.values(errors).some((arr) => arr.length > 0);
}
