library fileapi;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_individual_config.dart';
import 'dart:html';
import 'dart:async';

class FileAndDir {
  FileEntry file;
  DirectoryEntry dir;
  FileAndDir(this.file, this.dir);
}

FileSystem fs;

main() {
  useHtmlIndividualConfiguration();

  group('supported', () {
    test('supported', () {
      expect(FileSystem.supported, true);
    });
  });

  getFileSystem() {
    return window.requestFileSystem(100)
      .then((FileSystem fileSystem) {
        fs = fileSystem;
      });
  }

  group('unsupported_throws', () {
    test('requestFileSystem', () {
      var expectation = FileSystem.supported ? returnsNormally : throws;
      expect(() {
        window.requestFileSystem(100);
      }, expectation);
    });
  });

  group('getDirectory', () {
    if (FileSystem.supported) {
      test('getFileSystem', getFileSystem);

      test('directoryDoesntExist', () {
        return fs.root.getDirectory(
            'directory2')
              .catchError((error) {
                expect(error.code, equals(FileError.NOT_FOUND_ERR));
              }, test: (e) => e is FileError);
        });

      test('directoryCreate', () {
        return fs.root.createDirectory(
            'directory3')
              .then((DirectoryEntry e) {
                expect(e.name, equals('directory3'));
              });
        });
    }
  });

  group('getFile', () {
    if (FileSystem.supported) {
      test('getFileSystem', getFileSystem);

      test('fileDoesntExist', () {
        return fs.root.getFile(
            'file2')
          .catchError((error) {
            expect(error.code, equals(FileError.NOT_FOUND_ERR));
          }, test: (e) => e is FileError);
      });

      test('fileCreate', () {
        return fs.root.createFile(
            'file4')
          .then((FileEntry e) {
            expect(e.name, equals('file4'));
            expect(e.isFile, isTrue);
            return e.getMetadata();
          }).then((Metadata metadata) {
            var changeTime = metadata.modificationTime;
            // Upped because our Windows buildbots can sometimes be particularly
            // slow.
            expect(new DateTime.now().difference(changeTime).inMinutes,
                lessThan(4));
            expect(metadata.size, equals(0));
          });
        });
    }
  });

  // Do the boilerplate to get several files and directories created to then
  // test the functions that use those items.
  Future doDirSetup() {
    return fs.root.createFile(
      'file4')
        .then((FileEntry file) {
          return fs.root.createDirectory(
              'directory3')
            .then((DirectoryEntry dir) {
              return new Future.value(new FileAndDir(file, dir));
            });
        });
  }

  group('directoryReader', () {
    if (FileSystem.supported) {
      test('getFileSystem', getFileSystem);

      test('readEntries', () {
        return doDirSetup()
          .then((fileAndDir) {
            var reader = fileAndDir.dir.createReader();
            return reader.readEntries();
          }).then((entries) {
            expect(entries is List, true);
          });
      });
    }
  });

  group('entry', () {
    if (FileSystem.supported) {
      test('getFileSystem', getFileSystem);

      test('copyTo', () {
        return doDirSetup()
          .then((fileAndDir) {
            return fileAndDir.file.copyTo(fileAndDir.dir, name: 'copiedFile');
          }).then((entry) {
            expect(entry.isFile, true);
            expect(entry.name, 'copiedFile');
          });
      });

      test('getParent', () {
        return doDirSetup()
          .then((fileAndDir) {
             return fileAndDir.file.getParent();
          }).then((entry) {
            expect(entry.name, '');
            expect(entry.isFile, false);
          });
      });

      test('moveTo', () {
        return doDirSetup()
          .then((fileAndDir) {
            return fileAndDir.file.moveTo(fileAndDir.dir, name: 'movedFile');
          }).then((entry) {
            expect(entry.name, 'movedFile');
            expect(entry.fullPath, '/directory3/movedFile');
            return fs.root.getFile('file4');
          }).catchError((error) {
            expect(error.code, equals(FileError.NOT_FOUND_ERR));
          }, test: (e) => e is FileError);
      });

      test('remove', () {
        return doDirSetup()
          .then((fileAndDir) {
            return fileAndDir.file.remove().then((_) {});
          });
      });
    }
  });

  group('fileEntry', () {
    if (FileSystem.supported) {
      test('getFileSystem', getFileSystem);

      test('createWriter', () {
        return doDirSetup()
          .then((fileAndDir) {
            return fileAndDir.file.createWriter();
          }).then((writer) {
            expect(writer.position, 0);
            expect(writer.readyState, FileWriter.INIT);
            expect(writer.length, 0);
          });
      });

      test('file', () {
        return doDirSetup()
          .then((fileAndDir) {
            return fileAndDir.file.file()
              .then((fileObj) {
                expect(fileObj.name, fileAndDir.file.name);
                expect(fileObj.relativePath, '');
                expect(new DateTime.now().difference(
                    fileObj.lastModifiedDate).inSeconds, lessThan(60));
              });
          });
      });
    }
  });
}
