/**
 * Schedule Conflict Check (Self-Evolving OS Track 6-2/6-3) 테스트.
 */
import { findScheduleConflicts, formatConflictReport, CachedCalEvent } from '../src/features/calendar/conflictCheck';
import { _parseCalEventAttrs } from '../src/agent/attrParsers';

// 로컬 ISO (timezone 없음) — 실제 캐시도 로컬 자정 기준 all-day 를 담으므로
// 테스트를 실행 머신 timezone 과 무관하게 만든다.
const EXISTING: CachedCalEvent[] = [
    { summary: '주간회의', startIso: '2026-06-12T14:00:00', endIso: '2026-06-12T15:00:00', allDay: false, location: '회의실 A' },
    { summary: '워크숍', startIso: '2026-06-13T00:00:00', allDay: true },
];

describe('findScheduleConflicts', () => {
    it('구간이 겹치면 충돌', () => {
        const c = findScheduleConflicts(EXISTING, { startIso: '2026-06-12T14:30:00', durationMinutes: 60 });
        expect(c.length).toBe(1);
        expect(c[0].summary).toBe('주간회의');
    });

    it('경계 접촉(끝=시작)은 충돌 아님', () => {
        const c = findScheduleConflicts(EXISTING, { startIso: '2026-06-12T15:00:00', durationMinutes: 60 });
        expect(c.length).toBe(0);
    });

    it('endIso 없으면 기본 60분으로 판정', () => {
        const c = findScheduleConflicts(EXISTING, { startIso: '2026-06-12T13:30:00' });
        expect(c.length).toBe(1); // 13:30~14:30 vs 14:00~15:00
    });

    it('종일 일정과 그 날짜의 시간 일정은 충돌', () => {
        const c = findScheduleConflicts(EXISTING, { startIso: '2026-06-13T10:00:00', durationMinutes: 30 });
        expect(c.some((e) => e.summary === '워크숍')).toBe(true);
    });

    it('잘못된 날짜 입력은 보수적으로 충돌 없음 (생성 단계에서 실패)', () => {
        expect(findScheduleConflicts(EXISTING, { startIso: 'not-a-date' })).toEqual([]);
        expect(findScheduleConflicts([{ summary: 'x', startIso: 'broken', allDay: false }], { startIso: '2026-06-12T14:00:00' })).toEqual([]);
    });

    it('빈 캐시면 충돌 없음', () => {
        expect(findScheduleConflicts([], { startIso: '2026-06-12T14:00:00' })).toEqual([]);
    });
});

describe('formatConflictReport', () => {
    it('충돌 목록 + force 안내 포함', () => {
        const msg = formatConflictReport([EXISTING[0]]);
        expect(msg).toContain('주간회의');
        expect(msg).toContain('force="true"');
        expect(msg).toContain('보류');
    });
});

describe('_parseCalEventAttrs force 속성', () => {
    it('force="true" 파싱', () => {
        const attrs = _parseCalEventAttrs(' title="미팅" start="2026-06-12T14:00" force="true"');
        expect(attrs.force).toBe(true);
    });

    it('미지정이면 undefined (기본 차단 동작)', () => {
        const attrs = _parseCalEventAttrs(' title="미팅" start="2026-06-12T14:00"');
        expect(attrs.force).toBeUndefined();
    });
});
