import 'package:flutter_test/flutter_test.dart';
import 'package:lanebow/models/club_model.dart';

void main() {
  group('Club 모델 테스트', () {
    test('fromJson 메서드가 JSON 데이터를 올바르게 변환해야 함', () {
      // given
      final json = {
        'id': 'club_id_1',
        'name': '볼링 클럽',
        'description': '볼링을 사랑하는 사람들의 모임',
        'logo': 'https://example.com/logo.png',
        'address': '서울시 강남구',
        'location': '강남',
        'phone': '02-1234-5678',
        'email': 'club@example.com',
        'website': 'https://example.com',
        'memberCount': 50,
        'ownerId': 'owner_id_1',
        'femaleHandicap': 10,
        'averageCalculationPeriod': '3개월',
        'createdAt': '2022-01-01T09:00:00.000Z',
        'updatedAt': '2022-02-01T15:30:00.000Z',
      };

      // when
      final club = Club.fromJson(json);

      // then
      expect(club.id, 'club_id_1');
      expect(club.name, '볼링 클럽');
      expect(club.description, '볼링을 사랑하는 사람들의 모임');
      expect(club.logo, 'https://example.com/logo.png');
      expect(club.address, '서울시 강남구');
      expect(club.location, '강남');
      expect(club.phone, '02-1234-5678');
      expect(club.email, 'club@example.com');
      expect(club.website, 'https://example.com');
      expect(club.memberCount, 50);
      expect(club.ownerId, 'owner_id_1');
      expect(club.femaleHandicap, 10);
      expect(club.averageCalculationPeriod, '3개월');
      expect(club.createdAt, DateTime.parse('2022-01-01T09:00:00.000Z'));
      expect(club.updatedAt, DateTime.parse('2022-02-01T15:30:00.000Z'));
    });

    test('fromJson 메서드가 phone 필드 대신 contact 필드를 사용할 수 있어야 함', () {
      // given
      final json = {
        'id': 'club_id_1',
        'name': '볼링 클럽',
        'contact': '02-1234-5678', // phone 대신 contact 사용
      };

      // when
      final club = Club.fromJson(json);

      // then
      expect(club.phone, '02-1234-5678');
    });

    test('fromJson 메서드가 일부 필드가 null인 JSON 데이터를 처리해야 함', () {
      // given
      final json = {
        'id': 'club_id_1',
        'name': '볼링 클럽',
        // 나머지 필드는 null 또는 생략
      };

      // when
      final club = Club.fromJson(json);

      // then
      expect(club.id, 'club_id_1');
      expect(club.name, '볼링 클럽');
      expect(club.description, null);
      expect(club.logo, null);
      expect(club.address, null);
      expect(club.location, null);
      expect(club.phone, null);
      expect(club.email, null);
      expect(club.website, null);
      expect(club.memberCount, null);
      expect(club.ownerId, null);
      expect(club.femaleHandicap, null);
      expect(club.averageCalculationPeriod, null);
      expect(club.createdAt, null);
      expect(club.updatedAt, null);
    });

    test('fromJson 메서드가 필수 필드가 null인 경우 기본값을 설정해야 함', () {
      // given
      final json = {
        // 필수 필드가 null이거나 누락된 경우
        'id': null,
        'name': null,
      };

      // when
      final club = Club.fromJson(json);

      // then
      expect(club.id, '');
      expect(club.name, '');
    });

    test('femaleHandicap이 문자열로 제공될 때 int로 변환되어야 함', () {
      // given
      final json = {
        'id': 'club_id_1',
        'name': '볼링 클럽',
        'femaleHandicap': '15', // 문자열로 제공
      };

      // when
      final club = Club.fromJson(json);

      // then
      expect(club.femaleHandicap, 15);
    });

    test('toJson 메서드가 Club 객체를 JSON으로 올바르게 변환해야 함', () {
      // given
      final club = Club(
        id: 'club_id_1',
        name: '볼링 클럽',
        description: '볼링을 사랑하는 사람들의 모임',
        logo: 'https://example.com/logo.png',
        address: '서울시 강남구',
        location: '강남',
        phone: '02-1234-5678',
        email: 'club@example.com',
        website: 'https://example.com',
        memberCount: 50,
        ownerId: 'owner_id_1',
        femaleHandicap: 10,
        averageCalculationPeriod: '3개월',
        createdAt: DateTime.parse('2022-01-01T09:00:00.000Z'),
        updatedAt: DateTime.parse('2022-02-01T15:30:00.000Z'),
      );

      // when
      final json = club.toJson();

      // then
      expect(json['id'], 'club_id_1');
      expect(json['name'], '볼링 클럽');
      expect(json['description'], '볼링을 사랑하는 사람들의 모임');
      expect(json['logo'], 'https://example.com/logo.png');
      expect(json['address'], '서울시 강남구');
      expect(json['location'], '강남');
      expect(json['phone'], '02-1234-5678');
      expect(json['email'], 'club@example.com');
      expect(json['website'], 'https://example.com');
      expect(json['memberCount'], 50);
      expect(json['ownerId'], 'owner_id_1');
      expect(json['femaleHandicap'], 10);
      expect(json['averageCalculationPeriod'], '3개월');
      expect(json['createdAt'], '2022-01-01T09:00:00.000Z');
      expect(json['updatedAt'], '2022-02-01T15:30:00.000Z');
    });

    test('toJson 메서드가 null 필드를 포함하여 JSON으로 변환해야 함', () {
      // given
      final club = Club(
        id: 'club_id_1',
        name: '볼링 클럽',
        // 나머지 필드는 null
      );

      // when
      final json = club.toJson();

      // then
      expect(json['id'], 'club_id_1');
      expect(json['name'], '볼링 클럽');
      expect(json['description'], null);
      expect(json['logo'], null);
      expect(json['address'], null);
      expect(json['location'], null);
      expect(json['phone'], null);
      expect(json['email'], null);
      expect(json['website'], null);
      expect(json['memberCount'], null);
      expect(json['ownerId'], null);
      expect(json['femaleHandicap'], null);
      expect(json['averageCalculationPeriod'], null);
      expect(json['createdAt'], null);
      expect(json['updatedAt'], null);
    });
  });
}
