import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:travel_mate/models/expense.dart';
import 'package:travel_mate/models/expense_split.dart';

void main() {
  group('Expense Model Tests', () {
    const id = 'expense1';
    const groupId = 'group1';
    const description = 'Lunch';
    const amount = 50.0;
    const currency = ExpenseCurrency.eur;
    const amountInEur = 50.0;
    const category = ExpenseCategory.restaurant;
    const paidById = 'user1';
    const paidByName = 'Alice';
    final date = DateTime(2023, 6, 1);
    final createdAt = DateTime(2023, 6, 1);
    const split = ExpenseSplit(
      userId: 'user1',
      userName: 'Alice',
      amount: 25.0,
    );
    const splits = [
      split,
      ExpenseSplit(userId: 'user2', userName: 'Bob', amount: 25.0),
    ];

    final expense = Expense(
      id: id,
      groupId: groupId,
      description: description,
      amount: amount,
      currency: currency,
      amountInEur: amountInEur,
      category: category,
      paidById: paidById,
      paidByName: paidByName,
      date: date,
      createdAt: createdAt,
      splits: splits,
    );

    test('supports value equality', () {
      final expense2 = Expense(
        id: id,
        groupId: groupId,
        description: description,
        amount: amount,
        currency: currency,
        amountInEur: amountInEur,
        category: category,
        paidById: paidById,
        paidByName: paidByName,
        date: date,
        createdAt: createdAt,
        splits: splits,
      );
      expect(expense, equals(expense2));
    });

    group('fromMap', () {
      test('parses correctly', () {
        final map = {
          'groupId': groupId,
          'description': description,
          'amount': amount,
          'currency': 'EUR',
          'amountInEur': amountInEur,
          'category': 'restaurant', // matching category name
          'paidById': paidById,
          'paidByName': paidByName,
          'date': Timestamp.fromDate(date),
          'createdAt': Timestamp.fromDate(createdAt),
          'splits': splits.map((s) => s.toMap()).toList(),
        };

        final fromMapExpense = Expense.fromMap(map, id);
        expect(fromMapExpense, equals(expense));
      });
    });

    group('copyWith', () {
      test('updates fields correctly', () {
        final updated = expense.copyWith(amount: 100.0);
        expect(updated.amount, 100.0);
        expect(updated.description, description);
      });
    });
  });
}
