// Copyright 2019 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:googleapis/bigquery/v2.dart';

/// A fake bigquery tabledataresourceApi implementation.
///
/// This tabledataResourceApi considers only a simple case
/// where we focus on the number of rows inserted. This can be
/// easily extended for other test cases.
class FakeTabledataResource implements TabledataResource {
  List<TableDataInsertAllRequestRows>? rows;
  @override
  Future<TableDataInsertAllResponse> insertAll(
      TableDataInsertAllRequest request, String projectId, String datasetId, String tableId,
      {String? $fields}) async {
    rows = request.rows;
    return TableDataInsertAllResponse.fromJson(<String, String>{});
  }

  @override
  Future<TableDataList> list(String projectId, String datasetId, String tableId,
      {int? maxResults, String? selectedFields, String? startIndex, String? pageToken, String? $fields}) async {
    final List<Map<String, Object>> tableRowList = <Map<String, Object>>[];
    for (TableDataInsertAllRequestRows tableDataInsertAllRequestRows in rows!) {
      final dynamic value = tableDataInsertAllRequestRows.json;
      final List<Map<String, Object?>> tableCellList = <Map<String, Object?>>[];
      tableCellList.add(<String, Object?>{'v': value});
      tableRowList.add(<String, Object>{'f': tableCellList});
    }

    return TableDataList.fromJson(<String, Object>{'totalRows': rows!.length.toString(), 'rows': tableRowList});
  }
}
