#!perl -w
# Copyright (C) 2020-2021 all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
use strict;
use v5.10.1;
use PublicInbox::TestCommon;
use PublicInbox::Eml;
use PublicInbox::IPC;
use File::Path qw(mkpath);
use IO::Handle (); # autoflush
use POSIX qw(_exit);
use Cwd qw(getcwd abs_path);
use File::Spec;
my $many_root = $ENV{TEST_MANY_ROOT} or
	plan skip_all => 'TEST_MANY_ROOT not defined';
my $cwd = getcwd();
mkpath($many_root);
-d $many_root or BAIL_OUT "$many_root: $!";
$many_root = abs_path($many_root);
$many_root =~ m!\A\Q$cwd\E/! and BAIL_OUT "$many_root must not be in $cwd";
require_git 2.6;
require_mods(qw(DBD::SQLite Xapian));
use_ok 'PublicInbox::V2Writable';
my $nr_inbox = $ENV{NR_INBOX} // 10;
my $nproc = $ENV{NPROC} || PublicInbox::IPC::detect_nproc() || 2;
my $indexlevel = $ENV{TEST_INDEXLEVEL} // 'basic';
diag "NR_INBOX=$nr_inbox NPROC=$nproc TEST_INDEXLEVEL=$indexlevel";
diag "TEST_MANY_ROOT=$many_root";
my $level_cfg = $indexlevel eq 'full' ? '' : "\tindexlevel = $indexlevel\n";
my $pfx = "$many_root/$nr_inbox-$indexlevel";
mkpath($pfx);
open my $cfg_fh, '>>', "$pfx/config" or BAIL_OUT $!;
$cfg_fh->autoflush(1);
my $v2_init_add = sub {
	my ($i) = @_;
	my $ibx = PublicInbox::Inbox->new({
		inboxdir => "$pfx/test-$i",
		name => "test-$i",
		newsgroup => "inbox.comp.test.foo.test-$i",
		address => [ "test-$i\@example.com" ],
		url => [ "//example.com/test-$i" ],
		version => 2,
		-no_fsync => 1,
	});
	$ibx->{indexlevel} = $indexlevel if $level_cfg ne '';
	my $entry = <<EOF;
[publicinbox "$ibx->{name}"]
	address = $ibx->{-primary_address}
	url = $ibx->{url}->[0]
	newsgroup = $ibx->{newsgroup}
	inboxdir = $ibx->{inboxdir}
EOF
	$entry .= $level_cfg;
	print $cfg_fh $entry or die $!;
	my $v2w = PublicInbox::V2Writable->new($ibx, { nproc => 0 });
	$v2w->init_inbox(0);
	$v2w->add(PublicInbox::Eml->new(<<EOM));
Date: Sat, 02 Oct 2010 00:00:00 +0000
From: Lorelei <l\@example.com>
To: test-$i\@example.com
Message-ID: <20101002-000000-$i\@example.com>
Subject: hello world $i

hi
EOM
	$v2w->done;
};

my @children;
for my $i (1..$nproc) {
	my ($r, $w);
	pipe($r, $w) or BAIL_OUT $!;
	my $pid = fork // BAIL_OUT "fork: $!";
	if ($pid == 0) {
		close $w;
		while (my $i = <$r>) {
			chomp $i;
			$v2_init_add->($i);
		}
		_exit(0);
	}
	close $r or BAIL_OUT $!;
	push @children, [ $w, $pid ];
	$w->autoflush(1);
}

for my $i (0..$nr_inbox) {
	print { $children[$i % @children]->[0] } "$i\n" or BAIL_OUT $!;
}

for my $c (@children) {
	close $c->[0] or BAIL_OUT "close $!";
}
my $i = 0;
for my $c (@children) {
	my $pid = waitpid($c->[1], 0);
	is($?, 0, ++$i.' exited ok');
}
ok(close($cfg_fh), 'config written');
done_testing;
