#!/usr/bin/perl

use strict;
use warnings;
use FS::UID qw( adminsuidsetup );
use Spreadsheet::ParseXLSX;
use FS::part_pkg_taxproduct;

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

my $dbh = adminsuidsetup($user);
$FS::UID::AutoCommit = 0;
$FS::UID::AutoCommit = 0;

my $parser = Spreadsheet::ParseXLSX->new;
my $workbook = $parser->parse($filename);

###
# Import Product Codes
###

my %category = (
  'C' => 'COMPUTER',
  'G' => 'GENERAL MERCHANDISE',
  'N' => 'NON-TAXABLE AND EXEMPT',
  'S' => 'SATELLITE',
  'T' => 'TELECOM',
  'V' => 'VOIP',
  'W' => 'WIRELESS',
);

my $num_prodcode = 0;
my %prodcode2desc = ();

my $product_sheet = $workbook->worksheet('Product Codes');
my( $prod_min, $prod_max ) = $product_sheet->row_range();

foreach my $prod_rownum ( $prod_min+1 .. $prod_max ) {
  my $product_code = $product_sheet->get_cell($prod_rownum, 0)->value;
  my $product_desc = $product_sheet->get_cell($prod_rownum, 1)->value;

  #print "$product_code: $product_desc\n";

  my $part_pkg_taxproduct = new FS::part_pkg_taxproduct {
    data_vendor => 'compliance_solutions',
    taxproduct  => $product_code,
    description => join(' : ', $category{ substr($product_code,0,1) },
                               $product_desc,
                       ),
  };
  my $error = $part_pkg_taxproduct->insert;
  if ( $error ) {
    $dbh->rollback;# or die dbh->errstr;
    die $error;
  }

  $prodcode2desc{ $product_code } = $part_pkg_taxproduct->description;

  $num_prodcode++;

}

###
# Import Service Codes
###

my $num_servcode = 0;

my $service_sheet = $workbook->worksheet('Service Codes');
my( $serv_min, $serv_max ) = $service_sheet->row_range();

foreach my $serv_rownum ( $serv_min+1 .. $serv_max ) {
  my $product_code = $service_sheet->get_cell($serv_rownum, 0)->value;
  my $service_code = $service_sheet->get_cell($serv_rownum, 1)->value;
  my $service_desc = $service_sheet->get_cell($serv_rownum, 2)->value;

  my $part_pkg_taxproduct = new FS::part_pkg_taxproduct {
    data_vendor => 'compliance_solutions',
    taxproduct  => $product_code. sprintf('%03d', $service_code),
    description => join(' : ', $prodcode2desc{ $product_code },
                               $service_desc,
                       ),
  };
  my $error = $part_pkg_taxproduct->insert;
  if ( $error ) {
    $dbh->rollback;# or die dbh->errstr;
    die $error;
  }
  $num_servcode++;

}

print "Imported $num_prodcode product codes and $num_servcode service codes\n";

$dbh->commit;

sub usage {
  "Usage: \n  freeside-compliance_solutions-import username \"products and services.xlsx\"\n"
}

1;
