import { describe, it, expect, beforeEach } from 'vitest';
import Database from 'better-sqlite3';
import { runMigrations } from '@main/db/migrations/index.js';
import { NoteRepository } from '@main/repository/NoteRepository.js';
import { IntentService } from '@main/services/IntentService.js';

describe('IntentService', () => {
  let db: Database.Database;
  let repo: NoteRepository;
  let svc: IntentService;

  beforeEach(() => {
    db = new Database(':memory:');
    runMigrations(db);
    repo = new NoteRepository(db);
    svc = new IntentService(repo);
  });

  it('setIntent stores text on note', () => {
    const { id } = repo.create({ rawText: 'x' });
    svc.setIntent(id, '내일의 나에게');
    expect(repo.findById(id)?.userIntent).toBe('내일의 나에게');
  });

  it('dismissIntent stamps prompted_at without setting intent', () => {
    const { id } = repo.create({ rawText: 'x' });
    svc.dismissIntent(id);
    const note = repo.findById(id)!;
    expect(note.userIntent).toBeNull();
    expect(note.intentPromptedAt).not.toBeNull();
  });

  it('rejects empty intent text', () => {
    const { id } = repo.create({ rawText: 'x' });
    expect(() => svc.setIntent(id, '   ')).toThrow(/empty/i);
  });

  it('throws if note does not exist', () => {
    expect(() => svc.setIntent('nonexistent', 'x')).toThrow(/not found/i);
    expect(() => svc.dismissIntent('nonexistent')).toThrow(/not found/i);
  });
});
