// 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);
  });
}