#!/usr/bin/perl -w

use strict;
use File::Path;

our $output_dir = "tsified";

sub print_line
{
  my ($output, $line, $from, $lineno) = @_;

  # Warn if the resulting line is >80 characters wide.
  if (length($line) > 80)
  {
    if ($from =~ /\.[chi]pp$/)
    {
      print("Warning: $from:$lineno: output >80 characters wide.\n");
    }
  }

  # Write the output.
  print($output $line . "\n");
}

sub source_contains_asio_thread_usage
{
  my ($from) = @_;

  # Open the input file.
  open(my $input, "<$from") or die("Can't open $from for reading");

  # Check file for use of asio::thread.
  while (my $line = <$input>)
  {
    chomp($line);
    if ($line =~ /asio::thread/)
    {
      close($input);
      return 1;
    }
    elsif ($line =~ /^ *thread /)
    {
      close($input);
      return 1;
    }
  }

  close($input);
  return 0;
}

sub source_contains_asio_include
{
  my ($from) = @_;

  # Open the input file.
  open(my $input, "<$from") or die("Can't open $from for reading");

  # Check file for inclusion of asio.hpp.
  while (my $line = <$input>)
  {
    chomp($line);
    if ($line =~ /# *include [<"]asio\.hpp[>"]/)
    {
      close($input);
      return 1;
    }
  }

  close($input);
  return 0;
}

sub copy_source_file
{
  my ($from, $to) = @_;

  # Ensure the output directory exists.
  my $dir = $to;
  $dir =~ s/[^\/]*$//;
  mkpath($dir);

  # First determine whether the file makes any use of asio::thread.
  my $uses_asio_thread = source_contains_asio_thread_usage($from);

  my $includes_asio = source_contains_asio_include($from);

  my $is_asio_hpp = 0;
  $is_asio_hpp = 1 if ($from =~ /asio\.hpp/);

  my $needs_doc_link = 0;
  $needs_doc_link = 1 if ($is_asio_hpp);

  my $is_config_hpp = 0;
  $is_config_hpp = 1 if ($from =~ /asio\/detail\/config\.hpp/);

  my $is_error_hpp = 0;
  $is_error_hpp = 1 if ($from =~ /asio\/error\.hpp/);

  my $is_impl_src_hpp = 0;
  $is_impl_src_hpp = 1 if ($from =~ /asio\/impl\/src\.hpp/);

  my $is_test = 0;
  $is_test = 1 if ($from =~ /tests\/unit/);

  # Open the files.
  open(my $input, "<$from") or die("Can't open $from for reading");
  open(my $output, ">$to") or die("Can't open $to for writing");

  # Copy the content.
  my $lineno = 1;
  while (my $line = <$input>)
  {
    chomp($line);

    # Unconditional replacements.
    $line =~ s/[\\@]ref boost_bind/std::bind()/g;
    if ($from =~ /.*\.txt$/)
    {
      $line =~ s/[\\@]ref async_read/std::experimental::net::async_read()/g;
      $line =~ s/[\\@]ref async_write/std::experimental::net::async_write()/g;
    }
    if ($line =~ /asio_detail_posix_thread_function/)
    {
      $line =~ s/asio_detail_posix_thread_function/networking_ts_detail_posix_thread_function/g;
    }
    if ($line =~ /asio_signal_handler/)
    {
      $line =~ s/asio_signal_handler/networking_ts_signal_handler/g;
    }
    if ($line =~ /ASIO_/ && !($line =~ /NET_TS_/))
    {
      $line =~ s/ASIO_/NET_TS_/g;
    }
    if ($line =~ /asio_handler_/)
    {
      $line =~ s/asio_handler_/networking_ts_handler_/g;
    }
    if ($line =~ /asio_true_handler_/)
    {
      $line =~ s/asio_true_handler_/networking_ts_true_handler_/g;
    }

    # Lines skipped in asio/impl/src.hpp.
    if ($is_impl_src_hpp)
    {
      next if
        (
             $line =~ /serial_port/
          or $line =~ /\/local\//
          or $line =~ /\/generic\//
          or $line =~ /signal_set/
        );
    }

    # Conditional replacements.
    if ($line =~ /^(.* *)namespace asio {/)
    {
      print_line($output, $1 . "namespace std {", $from, $lineno);
      print_line($output, $1 . "namespace experimental {", $from, $lineno);
      print_line($output, $1 . "namespace net {", $from, $lineno);
      print_line($output, $1 . "inline namespace v1 {", $from, $lineno);
    }
    elsif ($line =~ /^(.* *)} \/\/ namespace asio$/)
    {
      print_line($output, $1 . "} // inline namespace v1", $from, $lineno);
      print_line($output, $1 . "} // namespace net", $from, $lineno);
      print_line($output, $1 . "} // namespace experimental", $from, $lineno);
      print_line($output, $1 . "} // namespace std", $from, $lineno);
    }
    elsif ($line =~ /^(# *include )[<"](asio\.hpp)[>"]$/)
    {
      print_line($output, $1 . "<net>", $from, $lineno);
      if ($uses_asio_thread)
      {
        print_line($output, $1 . "<thread>", $from, $lineno) if (!$is_test);
        $uses_asio_thread = 0;
      }
    }
    elsif ($line =~ /^(# *include )[<"]boost\/.*[>"].*$/)
    {
      if (!$includes_asio && $uses_asio_thread)
      {
        print_line($output, $1 . "<thread>", $from, $lineno) if (!$is_test);
        $uses_asio_thread = 0;
      }
      print_line($output, $line, $from, $lineno);
    }
    elsif ($line =~ /^(# *include )[<"]asio\/thread\.hpp[>"]/)
    {
      if ($is_test)
      {
        print_line($output, $1 . "<experimental/__net_ts/detail/thread.hpp>", $from, $lineno);
      }
      else
      {
        # Line is removed.
      }
    }
    elsif ($line =~ /(# *include )[<"]asio\/error_code\.hpp[>"]/)
    {
      if ($is_asio_hpp)
      {
        # Line is removed.
      }
      else
      {
        print_line($output, $1 . "<cerrno>", $from, $lineno) if ($is_error_hpp);
        print_line($output, $1 . "<system_error>", $from, $lineno);
      }
    }
    elsif ($line =~ /# *include [<"]asio\/impl\/error_code\.[hi]pp[>"]/)
    {
      # Line is removed.
    }
    elsif ($line =~ /(# *include )[<"]asio\/system_error\.hpp[>"]/)
    {
      if ($is_asio_hpp)
      {
        # Line is removed.
      }
      else
      {
        print_line($output, $1 . "<system_error>", $from, $lineno);
      }
    }
    elsif ($line =~ /(^.*# *include )[<"]asio\/([^>"]*)[>"](.*)$/)
    {
      print_line($output, $1 . "<experimental/__net_ts/" . $2 . ">" . $3, $from, $lineno);
    }
    elsif ($line =~ /#.*defined\(.*ASIO_HAS_STD_SYSTEM_ERROR\)$/)
    {
      # Line is removed.
    }
    elsif ($line =~ /asio::thread/)
    {
      if ($is_test)
      {
        $line =~ s/asio::thread/std::experimental::net::v1::detail::thread/g;
      }
      else
      {
        $line =~ s/asio::thread/std::thread/g;
      }
      print_line($output, $line, $from, $lineno);
    }
    elsif ($line =~ /^( *)thread( .*)$/)
    {
      if ($is_test)
      {
        print_line($output, $1 . "std::experimental::net::v1::detail::thread" . $2, $from, $lineno);
      }
      else
      {
        print_line($output, $1 . "std::thread" . $2, $from, $lineno);
      }
    }
    elsif ($line =~ /asio::/ && !($line =~ /boost::asio::/))
    {
      $line =~ s/asio::error_code/std::error_code/g;
      $line =~ s/asio::error_category/std::error_category/g;
      $line =~ s/asio::system_category/std::system_category/g;
      $line =~ s/asio::system_error/std::system_error/g;
      $line =~ s/asio::/std::experimental::net::/g;
      print_line($output, $line, $from, $lineno);
    }
    elsif ($line =~ /using namespace asio/)
    {
      $line =~ s/using namespace asio/using namespace std::experimental::net/g;
      print_line($output, $line, $from, $lineno);
    }
    elsif ($line =~ /[\\@]ref boost_bind/)
    {
      $line =~ s/[\\@]ref boost_bind/std::bind()/g;
      print_line($output, $line, $from, $lineno);
    }
    elsif ($line =~ /define.*DETAIL_CONFIG_HPP/)
    {
      print_line($output, $line, $from, $lineno);
      print_line($output, "", $from, $lineno);
      print_line($output, "#define NET_TS_STANDALONE 1", $from, $lineno);
      print_line($output, "#define NET_TS_NO_DEPRECATED 1", $from, $lineno);
      print_line($output, "#define NET_TS_NO_EXTENSIONS 1", $from, $lineno);
    }
    else
    {
      print_line($output, $line, $from, $lineno);
    }
    ++$lineno;
  }

  # Ok, we're done.
  close($input);
  close($output);
}

sub find_include_files
{
  my @root_includes = (
      "asio/ts/buffer.hpp",
      "asio/ts/executor.hpp",
      "asio/ts/internet.hpp",
      "asio/ts/io_context.hpp",
      "asio/ts/net.hpp",
      "asio/ts/netfwd.hpp",
      "asio/ts/socket.hpp",
      "asio/ts/timer.hpp");

  my @excluded_includes = (
      "asio/basic_deadline_timer.hpp",
      "asio/deadline_timer.hpp",
      "asio/deadline_timer_service.hpp",
      "asio/io_context_strand.hpp",
      "asio/detail/strand_service.hpp",
      "asio/detail/impl/strand_service.hpp",
      "asio/detail/impl/strand_service.ipp",
      "asio/time_traits.hpp");

  my @include_files = ();
  my %known_includes = ();

  foreach my $include (@root_includes)
  {
    $known_includes{$include} = 1;
    push(@include_files, "include/" . $include);
  }

  foreach my $include (@excluded_includes)
  {
    $known_includes{$include} = 1;
  }

  my @unprocessed_includes = sort keys %known_includes;
  while (scalar(@unprocessed_includes) > 0)
  {
    my $include = pop(@unprocessed_includes);

    open(my $input, "<include/$include") or die("Can't open include/$include for reading");
    while (my $line = <$input>)
    {
      chomp($line);
      if ($line =~ /^\s*#\s*include\s*"(asio\/[^"]*)"/)
      {
        if (not defined($known_includes{$1}))
        {
          $known_includes{$1} = 1;
          push(@include_files, "include/" . $1);
          push(@unprocessed_includes, $1);
        }
      }
    }
    close($input);
  }

  return @include_files;
}

sub copy_include_files
{
  my @files = find_include_files();
  push(@files, "include/asio/impl/src.hpp");

  foreach my $file (@files)
  {
    if ($file ne "include/asio/thread.hpp"
        and $file ne "include/asio/error_code.hpp"
        and $file ne "include/asio/system_error.hpp"
        and $file ne "include/asio/impl/error_code.hpp"
        and $file ne "include/asio/impl/error_code.ipp")
    {
      my $from = $file;
      my $to = $file;
      $to =~ s/^include\/asio\//$output_dir\/include\/experimental\/__net_ts\//;
      copy_source_file($from, $to);
    }
  }
}

sub create_top_level_includes
{
  my @includes = (
      "buffer",
      "executor",
      "internet",
      "io_context",
      "net",
      "netfwd",
      "socket",
      "timer");

  our $output_dir;
  mkpath("$output_dir/include/experimental");
  foreach my $include (@includes)
  {
    open(my $output, ">$output_dir/include/experimental/$include")
      or die("Can't open $output_dir/include/experimental/$include for writing");

    my $guard = "NET_TS_" . uc($include) . "_INCLUDED";

    print($output "//\n");
    print($output "// experimental/$include\n");
    print($output "// " . '~' x length("experimental/" . $include) . "\n");
    print($output "//\n");
    print($output "// Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com)\n");
    print($output "//\n");
    print($output "// Distributed under the Boost Software License, Version 1.0. (See accompanying\n");
    print($output "// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n");
    print($output "//\n");
    print($output "\n");
    print($output "#ifndef $guard\n");
    print($output "#define $guard\n");
    print($output "\n");
    print($output "#include <experimental/__net_ts/ts/$include.hpp>\n");
    print($output "\n");
    print($output "#endif // $guard\n");

    close($output);
  }
}

copy_include_files();
create_top_level_includes();
