// Copyright 2014 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 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

final Completer<void> _assetImageCompleter = Completer<void>();
final Completer<void> _networkImageCompleter = Completer<void>();

/// Notifies that Image.asset used in the test app loaded the image.
@visibleForTesting
Future<void> get whenAssetImageLoads => _assetImageCompleter.future;

/// Notifies that Image.network used in the test app loaded the image.
@visibleForTesting
Future<void> get whenNetworkImageLoads => _networkImageCompleter.future;

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  const MethodChannel channel =
      OptionalMethodChannel('flutter/web_test_e2e', JSONMethodCodec());

  // Artificially override the device pixel ratio to force the framework to pick the 1.5x asset variants.
  await channel.invokeMethod<void>('setDevicePixelRatio', '1.5');
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  MyAppState createState() => MyAppState();
}

class MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        key: const Key('mainapp'),
        title: 'Integration Test App',
        home: Column(children: <Widget>[
          const Text('Asset image:'),
          RepaintBoundary(child: Image.asset(
            'assets/icons/material/material.png',
            package: 'flutter_gallery_assets',
            frameBuilder: (
              BuildContext context,
              Widget child,
              int? frame,
              bool wasSynchronouslyLoaded,
            ) {
              if (frame != null) {
                _assetImageCompleter.complete();
              }
              return child;
            },
          )),
          const Text('Network image:'),
          RepaintBoundary(child: Image.network(
            'assets/packages/flutter_gallery_assets/assets/icons/material/material.png',
            frameBuilder: (
              BuildContext context,
              Widget child,
              int? frame,
              bool wasSynchronouslyLoaded,
            ) {
              if (frame != null) {
                _networkImageCompleter.complete();
              }
              return child;
            },
          )),
      ])
    );
  }
}
