// Copyright 2015 The Chromium 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:_mojo/application.dart';
import 'dart:_mojo/bindings.dart';
import 'dart:_mojo/core.dart';
import 'dart:_mojo/mojo/network_error.mojom.dart';
import 'dart:_mojo_services/mojo/host_resolver.mojom.dart';
import 'dart:_mojo_services/mojo/net_address.mojom.dart';
import 'dart:_mojo_services/mojo/network_service.mojom.dart';
import 'dart:_mojo_services/mojo/tcp_bound_socket.mojom.dart';
import 'dart:_mojo_services/mojo/tcp_connected_socket.mojom.dart';
import 'dart:_mojo_services/mojo/tcp_server_socket.mojom.dart';
import 'dart:_mojo_services/mojo/files/file.mojom.dart';
import 'dart:_mojo_services/mojo/files/files.mojom.dart';
import 'dart:_mojo_services/mojo/files/directory.mojom.dart';
import 'dart:_mojo_services/mojo/files/ioctl.mojom.dart';
import 'dart:_mojo_services/mojo/files/types.mojom.dart' as types;

// When developing, set fileSystemDeveloper to true and the file system will
// persist under ~/MojoAppPersistentCaches/.
const bool fileSystemDeveloper = false;
const String fileSystemName =
    fileSystemDeveloper ? 'app_persistent_cache' : null;

// System temp path relative to the root directory.
const String systemTempPath = 'tmp';

//
// Mojo objects and helper functions used by the 'dart:io' library.
//
int _networkServiceHandle;
int _filesServiceHandle;
NetworkServiceProxy _networkService;
HostResolverProxy _hostResolver;
FilesProxy _files;
DirectoryProxy _rootDirectory;
DirectoryProxy _systemTempDirectory;

void _initialize(int networkServiceHandle, int filesServiceHandle) {
  if (networkServiceHandle != MojoHandle.INVALID) {
    _networkServiceHandle = networkServiceHandle;
  }
  if (filesServiceHandle != MojoHandle.INVALID) {
    _filesServiceHandle = filesServiceHandle;
  }
}

void _shutdown() {
  if (_networkServiceHandle != null) {
    // Network service proxies were never initialized. Create a handle
    // and close it.
    var handle = new MojoHandle(_networkServiceHandle);
    _networkServiceHandle = null;
    handle.close();
  }
  if (_filesServiceHandle != null) {
    // File system proxies were never initialized. Create a handle and close it.
    var handle = new MojoHandle(_filesServiceHandle);
    _filesServiceHandle = null;
    handle.close();
  }
  _closeProxies();
}

/// Close any active proxies.
_closeProxies() {
  if (_networkService != null) {
    _networkService.close(immediate: true);
    _networkService = null;
  }
  if (_hostResolver != null) {
    _hostResolver.close(immediate: true);
    _hostResolver = null;
  }
  if (_files != null) {
    _files.close(immediate: true);
    _files = null;
  }
  if (_rootDirectory != null) {
    _rootDirectory.close(immediate: true);
    _rootDirectory = null;
  }
  if (_systemTempDirectory != null) {
    _systemTempDirectory.close(immediate: true);
    _systemTempDirectory = null;
  }
}

/// Get the singleton NetworkServiceProxy.
NetworkServiceProxy _getNetworkService() {
  if (_networkService != null) {
    return _networkService;
  }
  _networkService = new NetworkServiceProxy.fromHandle(
      new MojoHandle(_networkServiceHandle).pass());
  _networkServiceHandle = null;
  return _networkService;
}

/// Get the singleton HostResolverProxy.
HostResolverProxy _getHostResolver() {
  if (_hostResolver != null) {
    return _hostResolver;
  }
  var networkService = _getNetworkService();
  if (networkService == null) {
    return null;
  }
  _hostResolver = new HostResolverProxy.unbound();
  networkService.ptr.createHostResolver(_hostResolver);
  // Remove the host resolver's handle from the open set because it is not
  // under application control and does not affect isolate shutdown.
  _hostResolver.impl.endpoint.handle.pass();
  return _hostResolver;
}

/// Get the singleton FilesProxy.
FilesProxy _getFiles() {
  if (_files != null) {
    return _files;
  }
  _files = new FilesProxy.fromHandle(
      new MojoHandle(_filesServiceHandle).pass());
  _filesServiceHandle = null;
  return _files;
}

/// Get the singleton DirectoryProxy for the root directory.
Future<DirectoryProxy> _getRootDirectory() async {
  if (_rootDirectory != null) {
    return _rootDirectory;
  }
  FilesProxy files = _getFiles();
  assert(files != null);
  _rootDirectory = new DirectoryProxy.unbound();
  var response =
      await files.ptr.openFileSystem(fileSystemName, _rootDirectory);
  // Remove the root directory's handle from the open set because it is not
  // under application control and does not affect isolate shutdown.
  _rootDirectory.impl.endpoint.handle.pass();

  // Ensure system temporary directory exists before returning the root
  // directory.
  await _getSystemTempDirectory();
  return _rootDirectory;
}

/// Get the singleton DirectoryProxy for the system temp directory.
Future<DirectoryProxy> _getSystemTempDirectory() async {
  if (_systemTempDirectory != null) {
    return _systempTempDirectory;
  }
  DirectoryProxy rootDirectory = await _getRootDirectory();
  int flags = types.kOpenFlagRead |
              types.kOpenFlagWrite |
              types.kOpenFlagCreate;
  _systemTempDirectory = new DirectoryProxy.unbound();
  var response =
      await rootDirectory.ptr.openDirectory(systemTempPath,
                                            _systemTempDirectory,
                                            flags);
  assert(response.error == types.Error.ok);
  // Remove the system temp directory's handle from the open set because it
  // is not under application control and does not affect isolate shutdown.
  _systemTempDirectory.impl.endpoint.handle.pass();
  return _systemTempDirectory;
}

/// Static utility methods for converting between 'dart:io' and
/// 'mojo:network_service' structs.
class _NetworkServiceCodec {
  /// Returns a string representation of an ip address encoded in [address].
  /// Supports both IPv4 and IPv6.
  static String _addressToString(List<int> address) {
    String r = '';
    if (address == null) {
      return r;
    }
    bool ipv4 = address.length == 4;
    if (ipv4) {
      for (var i = 0; i < 4; i++) {
        var digit = address[i].toString();
        var divider = (i != 3) ? '.' : '';
        r += '${digit}${divider}';
      }
    } else {
      for (var i = 0; i < 16; i += 2) {
        var first = '';
        if (address[i] != 0) {
          first = address[i].toRadixString(16).padLeft(2, '0');
        }
        var second = address[i + 1].toRadixString(16).padLeft(2, '0');
        var digit = '$first$second';
        var divider = (i != 14) ? ':' : '';
        r += '${digit}${divider}';
      }
    }
    return r;
  }

  /// Convert from [NetAddress] to [InternetAddress].
  static InternetAddress _fromNetAddress(NetAddress netAddress) {
    if (netAddress == null) {
      return null;
    }
    var address;
    if (netAddress.family == NetAddressFamily.ipv4) {
      address = netAddress.ipv4.addr;
    } else if (netAddress.family == NetAddressFamily.ipv6) {
      address = netAddress.ipv6.addr;
    } else {
      return null;
    }
    assert(address != null);
    var addressString = _addressToString(address);
    return new InternetAddress(addressString);
  }

  static int _portFromNetAddress(NetAddress netAddress) {
    if (netAddress == null) {
      return null;
    }
    if (netAddress.family == NetAddressFamily.ipv4) {
      return netAddress.ipv4.port;
    } else if (netAddress.family == NetAddressFamily.ipv6) {
      return netAddress.ipv6.port;
    } else {
      return null;
    }
  }

  /// Convert from [InternetAddress] to [NetAddress].
  static NetAddress _fromInternetAddress(InternetAddress internetAddress,
                                         [port]) {
    if (internetAddress == null) {
      return null;
    }
    var netAddress = new NetAddress();
    var rawAddress = internetAddress.rawAddress;
    if (rawAddress.length == 4) {
      netAddress.family = NetAddressFamily.ipv4;
      netAddress.ipv4 = new NetAddressIPv4();
      netAddress.ipv4.addr = new List.from(rawAddress, growable: false);
      if (port != null) {
        netAddress.ipv4.port = port;
      }
    } else {
      assert(rawAddress.length == 16);
      netAddress.family = NetAddressFamily.ipv6;
      netAddress.ipv6 = new NetAddressIPv6();
      netAddress.ipv6.addr = new List.from(rawAddress, growable: false);
      if (port != null) {
        netAddress.ipv6.port = port;
      }
    }
    return netAddress;
  }
}

/// Static utility methods for dealing with 'mojo:network_service'.
class _NetworkService {
  /// Return a [NetAddress] for localhost:port.
  static NetAddress _localhostIpv4([int port = 0]) {
    var addr = new NetAddress();
    addr.family = NetAddressFamily.ipv4;
    addr.ipv4 = new NetAddressIPv4();
    addr.ipv4.addr = [127, 0, 0, 1];
    addr.ipv4.port = port;
    return addr;
  }

  /// Return a [NetAddress] for localhost:port.
  static NetAddress _localHostIpv6([int port = 0]) {
    var addr = new NetAddress();
    addr.family = NetAddressFamily.ipv6;
    addr.ipv6 = new NetAddressIPv6();
    addr.ipv6.addr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1];
    addr.ipv6.port = port;
    return addr;
  }

  static bool _okay(NetworkError error) {
    if (error == null) {
      return true;
    }
    return error.code == 0;
  }

  static _throwOnError(NetworkError error) {
    if (_okay(error)) {
      return;
    }
    throw new OSError(error.description, error.code);
  }
}

