use strict;
use warnings;

use List::MoreUtils qw/uniq zip/;

my @columns = qw/team env name dc id ipv4 ipv6 tunnelling instance sld tld/;

my @table = (
[qw{  0  prod   passport-i1.passport.yandex.net              i   10  -                2a02:6b8:c04:156:8000:635:0:5    1    passport       yandex       ru  }],
[qw{  0  prod   passport-i2.passport.yandex.net              i   12  -                2a02:6b8:c04:156:8000:635:0:6    1    passport       yandex       ru  }],
[qw{  0  prod   passport-i3.passport.yandex.net              i   14  -                2a02:6b8:c04:156:8000:635:0:7    1    passport       yandex       ru  }],
[qw{  0  prod   passport-i4.passport.yandex.net              i   16  -                2a02:6b8:c04:156:8000:635:0:8    1    passport       yandex       ru  }],
[qw{  0  prod   passport-i5.passport.yandex.net              i   1D  -                2a02:6b8:c04:1b8:8000:635:0:7    1    passport       yandex       ru  }],
[qw{  0  prod   passport-i6.passport.yandex.net              i   1E  -                2a02:6b8:c04:1b8:8000:635:0:8    1    passport       yandex       ru  }],
[qw{  0  prod   passport-i7.passport.yandex.net              i   02  -                2a02:6b8:c04:22a:8000:635:0:2    1    passport       yandex       ru  }],
[qw{  0  prod   passport-i8.passport.yandex.net              i   06  -                2a02:6b8:c04:22a:8000:635:0:3    1    passport       yandex       ru  }],
[qw{  0  prod   passport-i9.passport.yandex.net              i   07  -                2a02:6b8:c04:202:8000:635:0:4    1    passport       yandex       ru  }],
[qw{  0  prod   passport-i10.passport.yandex.net             i   08  -                2a02:6b8:c04:202:8000:635:0:5    1    passport       yandex       ru  }],
[qw{  0  prod   passport-i11.passport.yandex.net             i   83  -                2a02:6b8:c04:202:8000:635:0:6    1    passport       yandex       ru  }],
[qw{  0  prod   passport-i12.passport.yandex.net             i   84  -                2a02:6b8:c04:202:8000:635:0:7    1    passport       yandex       ru  }],
[qw{  0  prod   passport-api-i1.passport.yandex.net          i   34  -                2a02:6b8:c04:106:8000:635:0:2    1    passport       yandex       ru  }],
[qw{  0  prod   passport-m1.passport.yandex.net              m   20  -                2a02:6b8:c03:75b:8000:635:0:2    1    passport       yandex       ru  }],
[qw{  0  prod   passport-m2.passport.yandex.net              m   22  -                2a02:6b8:c03:75b:8000:635:0:3    1    passport       yandex       ru  }],
[qw{  0  prod   passport-m3.passport.yandex.net              m   7A  -                2a02:6b8:c03:75b:8000:635:0:4    1    passport       yandex       ru  }],
[qw{  0  prod   passport-m4.passport.yandex.net              m   85  -                2a02:6b8:c03:77d:8000:635:0:3    1    passport       yandex       ru  }],
[qw{  0  prod   passport-m5.passport.yandex.net              m   86  -                2a02:6b8:c03:77d:8000:635:0:4    1    passport       yandex       ru  }],
[qw{  0  prod   passport-m6.passport.yandex.net              m   87  -                2a02:6b8:c03:77d:8000:635:0:5    1    passport       yandex       ru  }],
[qw{  0  prod   passport-m7.passport.yandex.net              m   50  -                2a02:6b8:c03:712:8000:635:0:2    1    passport       yandex       ru  }],
[qw{  0  prod   passport-m8.passport.yandex.net              m   51  -                2a02:6b8:c03:712:8000:635:0:3    1    passport       yandex       ru  }],
[qw{  0  prod   passport-m9.passport.yandex.net              m   52  -                2a02:6b8:c03:712:8000:635:0:4    1    passport       yandex       ru  }],
[qw{  0  prod   passport-m10.passport.yandex.net             m   53  -                2a02:6b8:c03:712:8000:635:0:5    1    passport       yandex       ru  }],
[qw{  0  prod   passport-m11.passport.yandex.net             m   26  -                2a02:6b8:c03:712:8000:635:0:6    1    passport       yandex       ru  }],
[qw{  0  prod   passport-m12.passport.yandex.net             m   4F  -                2a02:6b8:c03:712:8000:635:0:7    1    passport       yandex       ru  }],
[qw{  0  prod   passport-api-m1.passport.yandex.net          m   36  -                2a02:6b8:c03:713:8000:635:0:2    1    passport       yandex       ru  }],
[qw{  0  prod   passport-s1.passport.yandex.net              s   4A  -                2a02:6b8:c02:700:8000:635:0:2    1    passport       yandex       ru  }],
[qw{  0  prod   passport-s2.passport.yandex.net              s   4B  -                2a02:6b8:c02:700:8000:635:0:3    1    passport       yandex       ru  }],
[qw{  0  prod   passport-s3.passport.yandex.net              s   4C  -                2a02:6b8:c02:700:8000:635:0:4    1    passport       yandex       ru  }],
[qw{  0  prod   passport-s4.passport.yandex.net              s   4D  -                2a02:6b8:c02:700:8000:635:0:5    1    passport       yandex       ru  }],
[qw{  0  prod   passport-s5.passport.yandex.net              s   56  -                2a02:6b8:c02:5b2:8000:635:0:2    1    passport       yandex       ru  }],
[qw{  0  prod   passport-s6.passport.yandex.net              s   82  -                2a02:6b8:c02:5b2:8000:635:0:3    1    passport       yandex       ru  }],
[qw{  0  prod   passport-s7.passport.yandex.net              s   0F  -                2a02:6b8:c02:78f:8000:635:0:2    1    passport       yandex       ru  }],
[qw{  0  prod   passport-s8.passport.yandex.net              s   1A  -                2a02:6b8:c02:78f:8000:635:0:3    1    passport       yandex       ru  }],
[qw{  0  prod   passport-s9.passport.yandex.net              s   1B  -                2a02:6b8:c02:78f:8000:635:0:4    1    passport       yandex       ru  }],
[qw{  0  prod   passport-s10.passport.yandex.net             s   1C  -                2a02:6b8:c02:78f:8000:635:0:5    1    passport       yandex       ru  }],
[qw{  0  prod   passport-s11.passport.yandex.net             s   41  -                2a02:6b8:c02:78f:8000:635:0:6    1    passport       yandex       ru  }],
[qw{  0  prod   passport-s12.passport.yandex.net             s   43  -                2a02:6b8:c02:78f:8000:635:0:7    1    passport       yandex       ru  }],
[qw{  0  prod   passport-s13.passport.yandex.net             s   45  -                2a02:6b8:c02:78f:8000:635:0:8    1    passport       yandex       ru  }],
[qw{  0  prod   passport-s14.passport.yandex.net             s   48  -                2a02:6b8:c02:78f:8000:635:0:9    1    passport       yandex       ru  }],
[qw{  0  prod   passport-s15.passport.yandex.net             s   7E  -                2a02:6b8:c02:78f:8000:635:0:a    1    passport       yandex       ru  }],
[qw{  0  prod   passport-api-s1.passport.yandex.net          s   35  -                2a02:6b8:c02:78d:8000:635:0:13   1    passport       yandex       ru  }],
[qw{  0  prod   passport-f1.passport.yandex.net              f   CA  -                2a02:6b8:c01:73:8000:635:0:2     1    passport       yandex       ru  }],
[qw{  0  prod   passport-f2.passport.yandex.net              f   CB  -                2a02:6b8:c01:54:8000:635:0:2c    1    passport       yandex       ru  }],
[qw{  0  prod   passport-f3.passport.yandex.net              f   CC  -                2a02:6b8:c01:54:8000:635:0:2d    1    passport       yandex       ru  }],
[qw{  0  prod   passport-f4.passport.yandex.net              f   CD  -                2a02:6b8:c01:54:8000:635:0:2e    1    passport       yandex       ru  }],
[qw{  0  prod   passport-f5.passport.yandex.net              f   CE  -                2a02:6b8:c01:54:8000:635:0:2f    1    passport       yandex       ru  }],
[qw{  0  prod   passport-f6.passport.yandex.net              f   CF  -                2a02:6b8:c01:54:8000:635:0:30    1    passport       yandex       ru  }],
[qw{  0  prod   passport-f7.passport.yandex.net              f   0D  -                2a02:6b8:c01:71c:8000:635:0:3    1    passport       yandex       ru  }],
[qw{  0  prod   passport-f8.passport.yandex.net              f   5A  -                2a02:6b8:c01:71c:8000:635:0:5    1    passport       yandex       ru  }],
[qw{  0  prod   passport-f9.passport.yandex.net              f   5B  -                2a02:6b8:c01:71c:8000:635:0:8    1    passport       yandex       ru  }],
[qw{  0  prod   passport-f10.passport.yandex.net             f   5D  -                2a02:6b8:c01:71c:8000:635:0:9    1    passport       yandex       ru  }],
[qw{  0  prod   passport-f11.passport.yandex.net             f   58  -                2a02:6b8:c01:70d:8000:635:0:6    1    passport       yandex       ru  }],
[qw{  0  prod   passport-f12.passport.yandex.net             f   18  -                2a02:6b8:c01:70d:8000:635:0:7    1    passport       yandex       ru  }],
[qw{  0  prod   passport-f13.passport.yandex.net             f   19  -                2a02:6b8:c01:70d:8000:635:0:8    1    passport       yandex       ru  }],
[qw{  0  prod   passport-f14.passport.yandex.net             f   31  -                2a02:6b8:c01:70d:8000:635:0:9    1    passport       yandex       ru  }],
[qw{  0  prod   passport-f15.passport.yandex.net             f   32  -                2a02:6b8:c01:70d:8000:635:0:a    1    passport       yandex       ru  }],
[qw{  0  prod   passport-api-f1.passport.yandex.net          f   33  -                2a02:6b8:c01:71c:8000:635:0:2    1    passport       yandex       ru  }],
[qw{  0  prod   webadmin-s1.passport.yandex.net              s   3B  -                2a02:6b8:c02:764:8000:635:0:b    1    passport       yandex       ru  }],
[qw{  0  prod   webadmin-f1.passport.yandex.net              f   3F  -                2a02:6b8:c01:54:8000:635:0:1e    1    passport       yandex       ru  }],
[qw{  0  prod   webadmin-m1.passport.yandex.net              m   42  -                2a02:6b8:c03:78b:8000:635:0:a    1    passport       yandex       ru  }],
[qw{  0  rc     passport-rc-s1.passport.yandex.net           s   E2  -                2a02:6b8:c02:78d:8000:635:0:b    1    passport-rc    yandex       ru  }],
[qw{  0  rc     passport-rc-f1.passport.yandex.net           f   E3  -                2a02:6b8:c01:54:8000:635:0:4     1    passport-rc    yandex       ru  }],
[qw{  0  stress passport-load.passport.yandex.net            i   5F  -                2a02:6b8:c04:202:8000:611::89    0    passport-load  yandex       ru  }],
[qw{  0  test   adm-test.yandex-team.ru                      m   3A  -                2a02:6b8:c0e:a0e:8000:611:0:8    0    adm-test       yandex-team  ru  }],
[qw{  0  dev    python-dev1.passport.yandex.net              m   7F  -                2a02:6b8:c03:337:8000:611:0:3    0    passportdev    yandex       ru  }],
[qw{  0  dev    python-dev2.passport.yandex.net              i   7F  -                2a02:6b8:c04:106:8000:611:0:3    0    passportdev2   yandex       ru  }],
[qw{  1  prod   passport-yateam-i1.passport.yandex.net       i   39  -                2a02:6b8:c04:1d3:8000:692:0:11   1    passport       yandex-team  ru  }],
[qw{  1  prod   passport-yateam-m1.passport.yandex.net       m   4E  -                2a02:6b8:c03:77d:8000:692:0:12   1    passport       yandex-team  ru  }],
[qw{  1  prod   passport-yateam-s1.passport.yandex.net       s   88  -                2a02:6b8:c02:562:8000:692:0:15   1    passport       yandex-team  ru  }],
[qw{  1  prod   passport-yateam-f1.passport.yandex.net       f   89  -                2a02:6b8:c01:54:8000:692:0:18    1    passport       yandex-team  ru  }],
[qw{  1  prod   passport-yateam-v1.passport.yandex.net       v   38  -                2a02:6b8:c0e:102:8000:692:0:13   1    passport       yandex-team  ru  }],
[qw{  0  test   passport-test-s1.passport.yandex.net         s   09  -                2a02:6b8:c02:500:8000:611:0:d    1    passport-test  yandex       ru  }],
[qw{  0  test   passport-test-m1.passport.yandex.net         m   8B  -                2a02:6b8:c03:763:8000:611:0:17   1    passport-test  yandex       ru  }],
[qw{  0  test   passport-test-f1.passport.yandex.net         f   47  -                2a02:6b8:c01:710:8000:611:0:11   1    passport-test  yandex       ru  }],
[qw{  1  test   passport-yateam-test-s1.passport.yandex.net  s   54  -                2a02:6b8:c02:500:8000:611:0:6    1    passport-test  yandex-team  ru  }],
[qw{  1  test   passport-yateam-test-f1.passport.yandex.net  f   55  -                2a02:6b8:c01:710:8000:611:0:9    1    passport-test  yandex-team  ru  }],
);

my @hosts;
for my $row (@table) {
    my %stash = zip @columns, @$row;
    my $host = {
        name  => delete $stash{name},
        stash => \%stash,
    };
    push @hosts, $host;
}

my %bygroup;
for my $host (@hosts) {
    my $group = "$host->{stash}{team}-$host->{stash}{env}";
    $host->{group} = $group;
    push @{ $bygroup{$group} }, $host;
}

for my $host (@hosts) {
    my $name   = $host->{name};
    my $prefix = (split /\./, $name)[0];
    my $alias  = $prefix;
    $alias     =~ s/^passport-?//;
    my @keys   = uniq grep { $_ ? $_ : () } $name, $prefix, $alias;

    $host->{keys} = \@keys;

    my $stash = $host->{stash};

    $stash->{ipv4} = undef
      if $stash->{ipv4} eq '-';

    $stash->{ipv6} = undef
      if $stash->{ipv6} eq '-';

    $stash->{hosts}       = $bygroup{ $host->{group} };

    $stash->{is_team}     =  $stash->{team};
    $stash->{is_internet} = !$stash->{team};

    $stash->{is_prod}     = $stash->{env} eq 'prod';
    $stash->{is_rc}       = $stash->{env} eq 'rc';
    $stash->{is_stress}   = $stash->{env} eq 'stress';
    $stash->{is_test}     = $stash->{env} eq 'test';
    $stash->{is_dev}      = $stash->{env} eq 'dev';

    $stash->{is_adminka}  = $name =~ /\b(?:webadmin|adm)\b/;
    $stash->{is_plus}     = $name =~ /\b(?:api)\b/;
    $stash->{is_frontend} = !($stash->{is_adminka} || $stash->{is_plus});

    $stash->{path}        = '/opt/www/passport';
}

return \@hosts;
