#!/usr/bin/perl -w

use strict;
use Term::Query qw(query);
use Net::SCP qw(iscp);
use FS::UID qw(adminsuidsetup datasrc);
use FS::Record qw(qsearch qsearchs);
##use FS::svc_acct_sm;
#use FS::svc_domain;
#use FS::domain_record;
use FS::svc_acct;
##use FS::part_svc;
use FS::svc_forward;
use FS::svc_domain;

my $user = shift or die &usage;
adminsuidsetup $user;

#$FS::svc_Common::noexport_hack = 1;
#$FS::domain_record::noserial_hack = 1;

use vars qw($defaultdomain);
$defaultdomain = '295.ca';

use vars qw(@svcpart $forward_svcpart);
@svcpart = qw( 2 4 );
$forward_svcpart = 7;

use vars qw($spooldir);
$spooldir = "/usr/local/etc/freeside/export.". datasrc. "/sendmail";
mkdir($spooldir, 0755) unless -d $spooldir;

print "\n\n", <<END;
Enter the location and name of your Sendmail aliases file, for example
"mail.isp.com:/etc/mail/aliases"
END
my($aliases)=&getvalue(":");

use vars qw($aliases_machine $aliases_prefix);
$aliases_machine = (split(/:/, $aliases))[0];
$aliases_prefix = "$spooldir/$aliases_machine";
mkdir($aliases_prefix, 0755) unless -d $aliases_prefix;

#iscp("root\@$aliases","$aliases_prefix/aliases.import");
iscp("ivan\@$aliases","$aliases_prefix/aliases.import");

print "\n\n", <<END;
Enter the location and name of your Sendmail virtusertable directory, for example
"mail.isp.com:/etc/mail/virtusertable"
END
my($virtusertable)=&getvalue(":");

use vars qw($virtusertable_machine $virtusertable_prefix);
$virtusertable_machine = (split(/:/, $virtusertable))[0];
$virtusertable_prefix = "$spooldir/$virtusertable_machine";
mkdir($virtusertable_prefix, 0755) unless -d $virtusertable_prefix;
mkdir("$virtusertable_prefix/virtusertable.import", 0755)
  unless -d "$virtusertable_prefix/virtusertable.import";

#iscp("root\@$virtusertable/*","$aliases_prefix/virtusertable.import/");
iscp("ivan\@$virtusertable/*","$aliases_prefix/virtusertable.import/");

sub getvalue {
  my $prompt = shift;
  $^W=0; # Term::Query isn't -w-safe
  my $return = query $prompt, '';
  $^W=1;
  $return;
}

print "\n\n";

##

foreach my $file ( 
  "$aliases_prefix/aliases.import",
  glob("$aliases_prefix/virtusertable.import/*"),
) {

  warn "importing $file\n";
  
  open(FILE,"<$file") or die $!;
  while (<FILE>) {
    next if /^\s*#/ || /^\s*$/; #skip comments & blank lines
  
    unless ( /^([\w\@\.\-]+)[:\s]\s*(.*\S)\s*$/ ) {
      warn "Unparsable line: $_";
      next;
    }
    my($rawusername, $rawdest) = ($1, $2);
  
    my($username, $domain);
    if ( $rawusername =~ /^([\w\-\.\&]*)\@([\w\.\-]+)$/ ) {
      $username = $1;
      $domain = $2;
    } elsif ( $rawusername =~ /\@/ ) {
      die "Unparsable username: $rawusername\n";
    } else {
      $username = $rawusername;
      $domain = $defaultdomain;
    }
  
    #find svc_acct record or set $src
    my($srcsvc, $src) = &svcnum_or_literal($username, $domain);

    foreach my $dest ( split(/,/, $rawdest) ) {

      my($dusername, $ddomain);
      if ( $dest =~ /^([\w\-\.\&]+)\@([\w\.\-]+)$/ ) {
        $dusername = $1;
        $ddomain = $2;          
      } elsif ( $dest =~ /\@/ ) {
        die "Unparsable username: $dest\n";
      } else {                 
        $dusername = $dest;
        $ddomain = $defaultdomain;
      }
      my($dstsvc, $dst) = &svcnum_or_literal($dusername, $ddomain);

      my $svc_forward = new FS::svc_forward ({
        svcpart => $forward_svcpart,
        srcsvc => $srcsvc,
        src    => $src,
        dstsvc => $dstsvc,
        dst    => $dst,
      });
      my $error = $svc_forward->insert;
      #my $error = $svc_forward->check;
      if ( $error ) {
        die "$rawusername: $rawdest: $error\n";
      }
    }


  } #next entry

} #next file
  
##

sub svcnum_or_literal {
  my($username, $domain) = @_;

  my $svc_domain = qsearchs('svc_domain', { 'domain' => $domain } );
  my $domsvc = $svc_domain ? $svc_domain->svcnum : '';

  my @svc_acct = grep { my $svc_acct = $_;
                        grep { $svc_acct->cust_svc->svcpart == $_ } @svcpart
                      }
                   qsearch('svc_acct', {
                     'username' => $username,
                     'domsvc'   => $domsvc,
                   });

  if ( scalar(@svc_acct) > 1 ) {
    die "multiple sources found for $username\@$domain !\n";
  }

  my( $svcnum, $literal ) = ('', '');
  if ( @svc_acct ) {
    my $svc_acct = $svc_acct[0];
    $svcnum = $svc_acct->svcnum;
  } else {
    $literal = "$username\@$domain";
  }

  return( $svcnum, $literal );

}

sub usage {
  die "Usage:\n\n  sendmail.import user\n";
}