// 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:convert';
import 'dart:io';

import 'package:flutter_devicelab/framework/apk_utils.dart';
import 'package:flutter_devicelab/framework/framework.dart';
import 'package:flutter_devicelab/framework/task_result.dart';
import 'package:flutter_devicelab/framework/utils.dart';
import 'package:path/path.dart' as path;

final String gradlew = Platform.isWindows ? 'gradlew.bat' : 'gradlew';
final String gradlewExecutable = Platform.isWindows ? '.\\$gradlew' : './$gradlew';

/// Tests that we respect storage proxy URLs in gradle dependencies.
Future<void> main() async {
  await task(() async {
    section('Find Java');

    final String? javaHome = await findJavaHome();
    if (javaHome == null) {
      return TaskResult.failure('Could not find Java');
    }
    print('\nUsing JAVA_HOME=$javaHome');

    section('Create project');
    await runProjectTest((FlutterProject flutterProject) async {
      await inDirectory(path.join(flutterProject.rootPath, 'android'), () async {
        section('Insert gradle testing script');
        final File build = File(path.join(
          flutterProject.rootPath, 'android', 'app', 'build.gradle',
        ));
        build.writeAsStringSync(
          '''
task printEngineMavenUrl() {
    doLast {
        println project.repositories.find { it.name == 'maven' }.url
    }
}
          ''',
          mode: FileMode.append,
          flush: true,
        );

        section('Checking default maven URL');

        String gradleOutput = await eval(
          gradlewExecutable,
          <String>['printEngineMavenUrl', '-q'],
        );
        const LineSplitter splitter = LineSplitter();
        List<String> outputLines = splitter.convert(gradleOutput);
        String mavenUrl = outputLines.last;
        print('Returned maven url: $mavenUrl');

        String realm = File(
          path.join(flutterDirectory.path, 'bin', 'internal', 'engine.realm'),
        ).readAsStringSync().trim();
        if (realm.isNotEmpty) {
          realm = '$realm/';
        }

        if (mavenUrl != 'https://storage.googleapis.com/${realm}download.flutter.io') {
          throw TaskResult.failure(
            'Expected Android engine maven dependency URL to '
            'resolve to https://storage.googleapis.com/${realm}download.flutter.io. Got '
            '$mavenUrl instead',
          );
        }

        section('Checking overridden maven URL');
        gradleOutput = await eval(
          gradlewExecutable,
          <String>['printEngineMavenUrl','-q'],
          environment: <String, String>{
            'FLUTTER_STORAGE_BASE_URL': 'https://my.special.proxy',
          },
        );
        outputLines = splitter.convert(gradleOutput);
        mavenUrl = outputLines.last;

        if (mavenUrl != 'https://my.special.proxy/${realm}download.flutter.io') {
          throw TaskResult.failure(
            'Expected overridden Android engine maven '
            'dependency URL to resolve to proxy location '
            'https://my.special.proxy/${realm}download.flutter.io. Got '
            '$mavenUrl instead',
          );
        }
      });
    });
    return TaskResult.success(null);
  });
}
