import { describe, expect, it } from 'vitest';
import {
  awayDurationOk,
  browserOffset,
  isOffsetZone,
  signInProvidersVisible,
  validDisplayName,
  validEmail,
} from './profileValidation';

describe('validDisplayName', () => {
  it.each([
    ['Kaya', true],
    ['Кая', true],
    ['Name_P. Last', true],
    ['Mr.Smith', true],
    ['Mr. Smith', true],
    ['  Kaya  ', true],
    ['Name P._Last', false],
    ['Name  Last', false],
    ['_Name', false],
    ['Anna B.', true],
    ['Name.', true],
    ['Name..', false],
    ['Name_', false],
    ['Name2', true], // a trailing digit is allowed
    ['Аня2007', true], // a trailing year
    ['Player12345', true], // 5 trailing digits — the max
    ['Player123456', false], // 6 trailing digits — over the limit
    ['Dark2Wolf', false], // a digit in the middle
    ['12345', false], // must start with a letter
    ['Name2.', false], // digits and a trailing dot cannot combine
    ['Anna B.2', false], // a trailing dot and digits cannot combine
    ['Night.Fox2007', true], // one "." special; digits do not count
    ['a.a.a.a.a.a2007', true], // 5 dots + a digit run still passes
    ['', false],
    ['a'.repeat(33), false],
    ['a.a.a.a.a.a', true], // 5 dots — at the special-char limit
    ['a.a.a.a.a.a.a', false], // 6 dots — over the limit
    ['J. R. R. Tolkien', true], // 3 dots; spaces are not special
  ])('%s -> %s', (name, ok) => {
    expect(validDisplayName(name)).toBe(ok);
  });
});

describe('validEmail', () => {
  it('accepts a normal address', () => expect(validEmail('you@example.com')).toBe(true));
  it('rejects a missing domain', () => expect(validEmail('you@')).toBe(false));
  it('rejects spaces', () => expect(validEmail('a b@x.com')).toBe(false));
});

describe('awayDurationOk', () => {
  it.each([
    ['22:00', '06:00', true],
    ['00:00', '12:00', true],
    ['08:00', '21:00', false],
    ['07:00', '07:00', true],
    ['20:00', '09:00', false],
  ])('%s-%s -> %s', (s, e, ok) => expect(awayDurationOk(s, e)).toBe(ok));
});

describe('timezone helpers', () => {
  it('detects offset zones', () => {
    expect(isOffsetZone('+03:00')).toBe(true);
    expect(isOffsetZone('Europe/Moscow')).toBe(false);
  });
  it('formats the browser offset as ±HH:MM', () => {
    expect(browserOffset()).toMatch(/^[+-]\d{2}:\d{2}$/);
  });
});

describe('signInProvidersVisible', () => {
  it('shows both providers off a proprietary host (web / native)', () => {
    expect(signInProvidersVisible(false, false)).toBe(true);
  });
  it('hides all providers inside a Telegram or VK host (email-only, ToS)', () => {
    expect(signInProvidersVisible(true, false)).toBe(false);
    expect(signInProvidersVisible(false, true)).toBe(false);
    expect(signInProvidersVisible(true, true)).toBe(false);
  });
});
