import { describe, it, expect } from 'vitest';
import { parseTaskId, validateCreateTaskBody, validateCommentBody } from './validation.js';

describe('parseTaskId', () => {
  it('正の整数を返す', () => {
    expect(parseTaskId('1')).toBe(1);
    expect(parseTaskId('999')).toBe(999);
  });
  it('0 は null', () => {
    expect(parseTaskId('0')).toBeNull();
  });
  it('負数は null', () => {
    expect(parseTaskId('-1')).toBeNull();
  });
  it('小数は null', () => {
    expect(parseTaskId('1.5')).toBeNull();
  });
  it('NaN は null', () => {
    expect(parseTaskId('abc')).toBeNull();
    expect(parseTaskId('')).toBeNull();
  });
});

describe('validateCreateTaskBody', () => {
  it('正常な body を受け入れる', () => {
    const result = validateCreateTaskBody({ body: 'hello' });
    expect(result.valid).toBe(true);
  });
  it('body 空はエラー', () => {
    const result = validateCreateTaskBody({ body: '' });
    expect(result.valid).toBe(false);
  });
  it('body 未設定はエラー', () => {
    const result = validateCreateTaskBody({});
    expect(result.valid).toBe(false);
  });
  it('body が 100000 文字超はエラー', () => {
    const result = validateCreateTaskBody({ body: 'x'.repeat(100001) });
    expect(result.valid).toBe(false);
  });
  it('不正な profile はエラー', () => {
    const result = validateCreateTaskBody({ body: 'test', profile: 'invalid' });
    expect(result.valid).toBe(false);
  });
  it('正常な profile は受け入れる', () => {
    for (const p of ['auto', 'fast', 'quality']) {
      const result = validateCreateTaskBody({ body: 'test', profile: p });
      expect(result.valid).toBe(true);
    }
  });
  it('不正な outputFormat はエラー', () => {
    const result = validateCreateTaskBody({ body: 'test', outputFormat: 'xml' });
    expect(result.valid).toBe(false);
  });
  it('不正な askPolicy はエラー', () => {
    const result = validateCreateTaskBody({ body: 'test', askPolicy: 'medium' });
    expect(result.valid).toBe(false);
  });
  it('不正な priority はエラー', () => {
    const result = validateCreateTaskBody({ body: 'test', priority: 'critical' });
    expect(result.valid).toBe(false);
  });
  it('title が 200 文字超はエラー', () => {
    const result = validateCreateTaskBody({ body: 'test', title: 'x'.repeat(201) });
    expect(result.valid).toBe(false);
  });
  it('undefined のオプションフィールドは受け入れる', () => {
    const result = validateCreateTaskBody({ body: 'test' });
    expect(result.valid).toBe(true);
  });
});

describe('validateCommentBody', () => {
  it('正常な body を受け入れる', () => {
    const result = validateCommentBody({ body: 'hello' });
    expect(result.valid).toBe(true);
    if (result.valid) {
      expect(result.body).toBe('hello');
      expect(result.author).toBe('user');
    }
  });
  it('body 空はエラー', () => {
    const result = validateCommentBody({ body: '' });
    expect(result.valid).toBe(false);
  });
  it('body が 100000 文字超はエラー', () => {
    const result = validateCommentBody({ body: 'x'.repeat(100001) });
    expect(result.valid).toBe(false);
  });
  it('author を指定できる', () => {
    const result = validateCommentBody({ body: 'hi', author: 'bot' });
    expect(result.valid).toBe(true);
    if (result.valid) expect(result.author).toBe('bot');
  });
  it('author 未指定は user がデフォルト', () => {
    const result = validateCommentBody({ body: 'hi' });
    expect(result.valid).toBe(true);
    if (result.valid) expect(result.author).toBe('user');
  });
});
