import test from 'node:test';
import assert from 'node:assert/strict';
import {
  BoardPostAutomationLockedError,
  buildBoardPostPlanNote,
  resolveSequencedPlanWorkId,
} from './board-service.js';

test('buildBoardPostPlanNote formats automation work memo with clear sections', async () => {
  assert.equal(
    await buildBoardPostPlanNote(
      '  알림 개선  ',
      '본문 첫 줄\n본문 둘째 줄\n',
      [],
      {
        name: '자동화 메모',
      },
      ['ctx-1'],
      [
        {
          id: 'ctx-1',
          title: '처리 기준',
          content: '## 처리 기준\n- 선택된 유형의 context를 먼저 읽습니다.',
          enabled: true,
          defaultSelected: true,
          updatedAt: '2026-04-29T00:00:00.000Z',
        },
      ],
    ),
    [
      '# 자동화 작업메모',
      '',
      '- 게시판 제목: 알림 개선',
      '- 메모 출처: board_posts 자동화 접수',
      '- 선택 자동화 유형: 자동화 메모',
      '- 자동화 처리 원칙: 아래에서 선택된 자동화 Context만 우선 참조합니다.',
      '',
      '## 자동화 Context',
      '### 처리 기준\n## 처리 기준\n- 선택된 유형의 context를 먼저 읽습니다.',
      '',
      '## 요청 본문',
      '본문 첫 줄\n본문 둘째 줄',
    ].join('\n'),
  );
});

test('buildBoardPostPlanNote keeps context section even when selected context is empty', async () => {
  assert.equal(
    await buildBoardPostPlanNote(
      '작업',
      '본문',
      [],
      {
        name: '빈 context 유형',
      },
      [],
      [],
    ),
    [
      '# 자동화 작업메모',
      '',
      '- 게시판 제목: 작업',
      '- 메모 출처: board_posts 자동화 접수',
      '- 선택 자동화 유형: 빈 context 유형',
      '- 자동화 처리 원칙: 아래에서 선택된 자동화 Context만 우선 참조합니다.',
      '',
      '## 자동화 Context',
      '선택된 자동화 Context 없음',
      '',
      '## 요청 본문',
      '본문',
    ].join('\n'),
  );
});

test('buildBoardPostPlanNote appends attachment lines when files exist', async () => {
  assert.equal(
    await buildBoardPostPlanNote(
      '작업',
      '본문',
      [
        {
          id: 'attachment-1',
          name: 'spec.png',
          path: 'public/.codex_chat/test/resource/uploads/spec.png',
          publicUrl: '/api/chat/resources/.codex_chat/test/resource/uploads/spec.png',
          size: 1280,
          mimeType: 'image/png',
        },
      ],
      null,
      [],
      [],
    ),
    [
      '# 자동화 작업메모',
      '',
      '- 게시판 제목: 작업',
      '- 메모 출처: board_posts 자동화 접수',
      '- 자동화 처리 원칙: 아래에서 선택된 자동화 Context만 우선 참조합니다.',
      '',
      '## 자동화 Context',
      '선택된 자동화 Context 없음',
      '',
      '## 요청 본문',
      '본문',
      '',
      '## 첨부 파일',
      '- spec.png: public/.codex_chat/test/resource/uploads/spec.png',
    ].join('\n'),
  );
});

test('BoardPostAutomationLockedError keeps user-facing message by action', () => {
  assert.equal(new BoardPostAutomationLockedError('update').message, '자동화 접수된 작업메모는 수정할 수 없습니다.');
  assert.equal(new BoardPostAutomationLockedError('delete').message, '자동화 접수된 작업메모는 삭제할 수 없습니다.');
});

test('resolveSequencedPlanWorkId uses -1 suffix first and finds the next available suffix', () => {
  assert.equal(resolveSequencedPlanWorkId('정기-점검', []), '정기-점검-1');
  assert.equal(resolveSequencedPlanWorkId('정기-점검', ['정기-점검-1', '정기-점검-2', '다른작업-1']), '정기-점검-3');
});

test('resolveSequencedPlanWorkId supports custom suffix labels such as service-{seq}', () => {
  assert.equal(resolveSequencedPlanWorkId('schedule-10-반복-정리', [], 'service'), 'schedule-10-반복-정리-service-1');
  assert.equal(
    resolveSequencedPlanWorkId(
      'schedule-10-반복-정리',
      ['schedule-10-반복-정리-service-1', 'schedule-10-반복-정리-service-2'],
      'service',
    ),
    'schedule-10-반복-정리-service-3',
  );
});

test('resolveSequencedPlanWorkId truncates the base to preserve the suffix within 120 chars', () => {
  const longBase = 'a'.repeat(120);
  const workId = resolveSequencedPlanWorkId(longBase, []);

  assert.equal(workId.length, 120);
  assert.ok(workId.endsWith('-1'));
});
