import 'dart:convert';

import 'package:flutter_test/flutter_test.dart';
import 'package:lanebow/utils/event_csv_parser.dart';

void main() {
  group('EventCsvParser.parseCsvBytes', () {
    test('정상 CSV: 두 행 모두 유효', () {
      const headers = 'title,startDate,endDate,description,location,status,type,maxParticipants';
      const row1 = '볼링 대회,2025-10-01,2025-10-01,가을 정기 대회,서울볼링장,활성,개인전,32';
      const row2 = '연습 모임,2025-10-12,,월간 연습 모임,우리동네볼링장,대기,연습,';
      final csv = [headers, row1, row2].join('\n');
      final bytes = utf8.encode(csv);

      final result = EventCsvParser.parseCsvBytes(bytes);

      expect(result['error'], isNull);
      expect(result['processedRows'], 2);
      expect(result['invalidRows'], 0);
      final events = result['validEvents'] as List<dynamic>;
      expect(events.length, 2);
      expect((events[0] as Map)['title'], '볼링 대회');
      expect((events[1] as Map)['title'], '연습 모임');
    });

    test('일부 무효 행 포함: 한 행은 필수 누락으로 invalid', () {
      const headers = 'title,startDate,endDate,description,location,status,type,maxParticipants';
      const row1 = '볼링 대회,2025-10-01,2025-10-01,가을 정기 대회,서울볼링장,활성,개인전,32';
      const rowInvalid = ',,,,위치만,활성,개인전,10'; // title/startDate 누락
      final csv = [headers, row1, rowInvalid].join('\n');
      final bytes = utf8.encode(csv);

      final result = EventCsvParser.parseCsvBytes(bytes);

      expect(result['processedRows'], 2);
      expect(result['invalidRows'], 1);
      final invalidRowIndices = result['invalidRowIndices'] as List<dynamic>;
      // 헤더가 1행, 유효 2행, 무효 3행 → 3 보고
      expect(invalidRowIndices, contains(3));
      final events = result['validEvents'] as List<dynamic>;
      expect(events.length, 1);
    });

    test('헤더 누락: 오류 반환', () {
      const csv = 'wrong,columns\nvalue1,value2';
      final bytes = utf8.encode(csv);

      final result = EventCsvParser.parseCsvBytes(bytes);

      expect(result['processedRows'], 0);
      expect(result['invalidRows'], 0);
      expect(result['validEvents'], isEmpty);
      expect(result['error'], contains('필수 필드'));
    });

    test('빈 파일: 오류 반환', () {
      final bytes = utf8.encode('');
      final result = EventCsvParser.parseCsvBytes(bytes);
      expect(result['processedRows'], 0);
      expect(result['invalidRows'], 0);
      expect(result['validEvents'], isEmpty);
      expect(result['error'], contains('CSV 파일에 데이터'));
    });

    test('따옴표 포함 필드 파싱: 콤마 포함 설명', () {
      const headers = 'title,startDate,description';
      const row1 = '대회명,2025-10-01,"설명, 콤마 포함"';
      final csv = [headers, row1].join('\n');
      final bytes = utf8.encode(csv);

      final result = EventCsvParser.parseCsvBytes(bytes);
      expect(result['error'], isNull);
      final events = result['validEvents'] as List<dynamic>;
      expect(events.length, 1);
      expect((events.first as Map)['description'], '설명, 콤마 포함');
    });
  });
}
