// 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:file/file.dart';
import 'package:file/memory.dart';
import 'package:path/path.dart' as path;
import 'package:pub_semver/pub_semver.dart';
import 'package:snippets/snippets.dart';
import 'package:test/test.dart' hide TypeMatcher, isInstanceOf;

import 'filesystem_resource_provider.dart';

class FakeFlutterInformation extends FlutterInformation {
  FakeFlutterInformation(this.flutterRoot);

  final Directory flutterRoot;

  @override
  Directory getFlutterRoot() {
    return flutterRoot;
  }

  @override
  Map<String, dynamic> getFlutterInformation() {
    return <String, dynamic>{
      'flutterRoot': flutterRoot,
      'frameworkVersion': Version(2, 10, 0),
      'dartSdkVersion': Version(2, 12, 1),
    };
  }
}

void main() {
  group('Parser', () {
    late MemoryFileSystem memoryFileSystem = MemoryFileSystem();
    late FlutterRepoSnippetConfiguration configuration;
    late SnippetGenerator generator;
    late Directory tmpDir;
    late Directory flutterRoot;

    void writeSkeleton(String type) {
      switch (type) {
        case 'dartpad':
          configuration.getHtmlSkeletonFile('dartpad').writeAsStringSync('''
<div>HTML Bits (DartPad-style)</div>
<iframe class="snippet-dartpad" src="https://dartpad.dev/embed-flutter.html?split=60&run=true&sample_id={{id}}&sample_channel={{channel}}"></iframe>
<div>More HTML Bits</div>
''');
        case 'sample':
        case 'snippet':
          configuration.getHtmlSkeletonFile(type).writeAsStringSync('''
<div>HTML Bits</div>
{{description}}
<pre>{{code}}</pre>
<pre>{{app}}</pre>
<div>More HTML Bits</div>
''');
      }
    }

    setUp(() {
      // Create a new filesystem.
      memoryFileSystem = MemoryFileSystem();
      tmpDir = memoryFileSystem.systemTempDirectory.createTempSync('flutter_snippets_test.');
      flutterRoot = memoryFileSystem.directory(path.join(tmpDir.absolute.path, 'flutter'));
      configuration = FlutterRepoSnippetConfiguration(
        flutterRoot: flutterRoot,
        filesystem: memoryFileSystem,
      );
      configuration.skeletonsDirectory.createSync(recursive: true);
      <String>['dartpad', 'sample', 'snippet'].forEach(writeSkeleton);
      FlutterInformation.instance = FakeFlutterInformation(flutterRoot);
      generator = SnippetGenerator(
        configuration: configuration,
        filesystem: memoryFileSystem,
        flutterRoot: configuration.skeletonsDirectory.parent,
      );
    });

    test('parses from comments', () async {
      final File inputFile = _createSnippetSourceFile(tmpDir, memoryFileSystem);
      final Iterable<SourceElement> elements = getFileElements(
        inputFile,
        resourceProvider: FileSystemResourceProvider(memoryFileSystem),
      );
      expect(elements, isNotEmpty);
      final SnippetDartdocParser sampleParser = SnippetDartdocParser(memoryFileSystem);
      sampleParser.parseFromComments(elements);
      sampleParser.parseAndAddAssumptions(elements, inputFile);
      expect(elements.length, equals(7));
      int sampleCount = 0;
      for (final SourceElement element in elements) {
        expect(element.samples.length, greaterThanOrEqualTo(1));
        sampleCount += element.samples.length;
        final String code = generator.generateCode(element.samples.first);
        expect(code, contains('// Description'));
        expect(
          code,
          contains(
            RegExp('''^String elementName = '${element.elementName}';\$''', multiLine: true),
          ),
        );
        final String html = generator.generateHtml(element.samples.first);
        expect(
          html,
          contains(
            RegExp(
              '''^<pre>String elementName = &#39;${element.elementName}&#39;;.*\$''',
              multiLine: true,
            ),
          ),
        );
        expect(
          html,
          contains(
            '<div class="snippet-description">{@end-inject-html}Description{@inject-html}</div>\n',
          ),
        );
      }
      expect(sampleCount, equals(8));
    });
    test('parses dartpad samples from linked file', () async {
      final File inputFile = _createDartpadSourceFile(
        tmpDir,
        memoryFileSystem,
        flutterRoot,
        linked: true,
      );
      final Iterable<SourceElement> elements = getFileElements(
        inputFile,
        resourceProvider: FileSystemResourceProvider(memoryFileSystem),
      );
      expect(elements, isNotEmpty);
      final SnippetDartdocParser sampleParser = SnippetDartdocParser(memoryFileSystem);
      sampleParser.parseFromComments(elements);
      expect(elements.length, equals(1));
      int sampleCount = 0;
      for (final SourceElement element in elements) {
        expect(element.samples.length, greaterThanOrEqualTo(1));
        sampleCount += element.samples.length;
        final String code = generator.generateCode(element.samples.first);
        expect(code, contains('// Description'));
        expect(
          code,
          contains(RegExp('^void ${element.name}Sample\\(\\) \\{.*\$', multiLine: true)),
        );
        final String html = generator.generateHtml(element.samples.first);
        expect(
          html,
          contains(
            RegExp(
              '''^<iframe class="snippet-dartpad" src="https://dartpad.dev/.*sample_id=${element.name}.0.*></iframe>.*\$''',
              multiLine: true,
            ),
          ),
        );
      }
      expect(sampleCount, equals(1));
    });
    test('parses assumptions', () async {
      final File inputFile = _createSnippetSourceFile(tmpDir, memoryFileSystem);
      final SnippetDartdocParser sampleParser = SnippetDartdocParser(memoryFileSystem);
      final List<SourceLine> assumptions = sampleParser.parseAssumptions(inputFile);
      expect(assumptions.length, equals(1));
      expect(assumptions.first.text, equals('int integer = 3;'));
    });
  });
}

File _createSnippetSourceFile(Directory tmpDir, FileSystem filesystem) {
  return filesystem.file(path.join(tmpDir.absolute.path, 'snippet_in.dart'))
    ..createSync(recursive: true)
    ..writeAsStringSync(r'''
// Copyright

// @dart = 2.12

import 'foo.dart';

// Examples can assume:
// int integer = 3;

/// Top level variable comment
///
/// {@tool snippet}
/// Description
/// ```dart
/// String elementName = 'topLevelVariable';
/// ```
/// {@end-tool}
int topLevelVariable = 4;

/// Top level function comment
///
/// {@tool snippet}
/// Description
/// ```dart
/// String elementName = 'topLevelFunction';
/// ```
/// {@end-tool}
int topLevelFunction() {
  return integer;
}

/// Class comment
///
/// {@tool snippet}
/// Description
/// ```dart
/// String elementName = 'DocumentedClass';
/// ```
/// {@end-tool}
///
/// {@tool snippet}
/// Description2
/// ```dart
/// String elementName = 'DocumentedClass';
/// ```
/// {@end-tool}
class DocumentedClass {
  /// Constructor comment
  /// {@tool snippet}
  /// Description
  /// ```dart
  /// String elementName = 'DocumentedClass';
  /// ```
  /// {@end-tool}
  const DocumentedClass();

  /// Named constructor comment
  /// {@tool snippet}
  /// Description
  /// ```dart
  /// String elementName = 'DocumentedClass.name';
  /// ```
  /// {@end-tool}
  const DocumentedClass.name();

  /// Member variable comment
  /// {@tool snippet}
  /// Description
  /// ```dart
  /// String elementName = 'DocumentedClass.intMember';
  /// ```
  /// {@end-tool}
  int intMember;

  /// Member comment
  /// {@tool snippet}
  /// Description
  /// ```dart
  /// String elementName = 'DocumentedClass.member';
  /// ```
  /// {@end-tool}
  void member() {}
}
''');
}

File _createDartpadSourceFile(
  Directory tmpDir,
  FileSystem filesystem,
  Directory flutterRoot, {
  bool linked = false,
}) {
  final File linkedFile = filesystem.file(path.join(flutterRoot.absolute.path, 'linked_file.dart'))
    ..createSync(recursive: true)
    ..writeAsStringSync('''
// Copyright

import 'foo.dart';

// Description

void DocumentedClassSample() {
  String elementName = 'DocumentedClass';
}
''');

  final String source = linked
      ? '''
/// ** See code in ${path.relative(linkedFile.path, from: flutterRoot.absolute.path)} **'''
      : '''
/// ```dart
/// void DocumentedClassSample() {
///   String elementName = 'DocumentedClass';
/// }
/// ```''';

  return filesystem.file(path.join(tmpDir.absolute.path, 'snippet_in.dart'))
    ..createSync(recursive: true)
    ..writeAsStringSync('''
// Copyright

// @dart = 2.12

import 'foo.dart';

/// Class comment
///
/// {@tool dartpad --template=template}
/// Description
$source
/// {@end-tool}
class DocumentedClass {}
''');
}
