// 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 'package:flutter_tools/src/html_utils.dart';

import '../src/common.dart';

const String htmlSample1 = '''
<!DOCTYPE html>
<html>
<head>
  <title></title>
  <base href="/foo/222/">
  <meta charset="utf-8">
  <link rel="icon" type="image/png" href="favicon.png"/>
</head>
<body>
  <div></div>
  <script src="main.dart.js"></script>
</body>
</html>
''';

const String htmlSample2 = '''
<!DOCTYPE html>
<html>
<head>
  <title></title>
  <base href="$kBaseHrefPlaceholder">
  <meta charset="utf-8">
  <link rel="icon" type="image/png" href="favicon.png"/>
</head>
<body>
  <div></div>
  <script src="main.dart.js"></script>
  <script>
    const serviceWorkerVersion = null;
  </script>
  <script>
    navigator.serviceWorker.register('flutter_service_worker.js');
  </script>
</body>
</html>
''';

const String htmlSampleLegacyVar = '''
<!DOCTYPE html>
<html>
<head>
  <title></title>
  <base href="$kBaseHrefPlaceholder">
  <meta charset="utf-8">
  <link rel="icon" type="image/png" href="favicon.png"/>
</head>
<body>
  <div></div>
  <script src="main.dart.js"></script>
  <script>
    var serviceWorkerVersion = null;
  </script>
  <script>
    navigator.serviceWorker.register('flutter_service_worker.js');
  </script>
</body>
</html>
''';

String htmlSample2Replaced({
  required String baseHref,
  required String serviceWorkerVersion,
}) =>
    '''
<!DOCTYPE html>
<html>
<head>
  <title></title>
  <base href="$baseHref">
  <meta charset="utf-8">
  <link rel="icon" type="image/png" href="favicon.png"/>
</head>
<body>
  <div></div>
  <script src="main.dart.js"></script>
  <script>
    const serviceWorkerVersion = "$serviceWorkerVersion";
  </script>
  <script>
    navigator.serviceWorker.register('flutter_service_worker.js?v=$serviceWorkerVersion');
  </script>
</body>
</html>
''';

const String htmlSample3 = '''
<!DOCTYPE html>
<html>
<head>
  <title></title>
  <meta charset="utf-8">
  <link rel="icon" type="image/png" href="favicon.png"/>
</head>
<body>
  <div></div>
  <script src="main.dart.js"></script>
</body>
</html>
''';

void main() {
  test('can parse baseHref', () {
    expect(IndexHtml('<base href="/foo/111/">').getBaseHref(), 'foo/111');
    expect(IndexHtml(htmlSample1).getBaseHref(), 'foo/222');
    expect(IndexHtml(htmlSample2).getBaseHref(), ''); // Placeholder base href.
  });

  test('handles missing baseHref', () {
    expect(IndexHtml('').getBaseHref(), '');
    expect(IndexHtml('<base>').getBaseHref(), '');
    expect(IndexHtml(htmlSample3).getBaseHref(), '');
  });

  test('throws on invalid baseHref', () {
    expect(() => IndexHtml('<base href>').getBaseHref(), throwsToolExit());
    expect(() => IndexHtml('<base href="">').getBaseHref(), throwsToolExit());
    expect(() => IndexHtml('<base href="foo/111">').getBaseHref(), throwsToolExit());
    expect(
      () => IndexHtml('<base href="foo/111/">').getBaseHref(),
      throwsToolExit(),
    );
    expect(
      () => IndexHtml('<base href="/foo/111">').getBaseHref(),
      throwsToolExit(),
    );
  });

  test('applies substitutions', () {
    final IndexHtml indexHtml = IndexHtml(htmlSample2);
    indexHtml.applySubstitutions(
      baseHref: '/foo/333/',
      serviceWorkerVersion: 'v123xyz',
    );
    expect(
      indexHtml.content,
      htmlSample2Replaced(
        baseHref: '/foo/333/',
        serviceWorkerVersion: 'v123xyz',
      ),
    );
  });

  test('applies substitutions with legacy var version syntax', () {
    final IndexHtml indexHtml = IndexHtml(htmlSampleLegacyVar);
    indexHtml.applySubstitutions(
      baseHref: '/foo/333/',
      serviceWorkerVersion: 'v123xyz',
    );
    expect(
      indexHtml.content,
      htmlSample2Replaced(
        baseHref: '/foo/333/',
        serviceWorkerVersion: 'v123xyz',
      ),
    );
  });

  test('re-parses after substitutions', () {
    final IndexHtml indexHtml = IndexHtml(htmlSample2);
    expect(indexHtml.getBaseHref(), ''); // Placeholder base href.

    indexHtml.applySubstitutions(
      baseHref: '/foo/333/',
      serviceWorkerVersion: 'v123xyz',
    );
    // The parsed base href should be updated after substitutions.
    expect(indexHtml.getBaseHref(), 'foo/333');
  });
}