#!/usr/bin/perl

use strict;
use warnings;

use 5.010;

use Getopt::Long;
use Pod::Usage;
use Path::Class 'dir';
use meon::Web::Config;
use meon::Web::env;
use meon::Web::Util;
use Spreadsheet::ParseExcel;
use meon::Web::Data::CategoryProduct;

exit main();

sub main {
    my $help;
    my $hostname_dir;
    my $master_category;
    GetOptions(
        'help|h'              => \$help,
        'hostname-dir|d=s'    => \$hostname_dir,
        'master-category|m=s' => \$master_category,
    ) or pod2usage;
    pod2usage if $help;
    pod2usage unless $hostname_dir;

    meon::Web::env->clear;
    meon::Web::env->hostname_dir(
        dir(
            meon::Web::SPc->srvdir, 'www', 'meon-web', $hostname_dir
        )
    );

    my $filename = shift(@ARGV);
    pod2usage unless $filename;

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

    if ( !defined $workbook ) {
        die $filename.' '.$parser->error(), ".\n";
    }

    my @ws_items_all = $workbook->worksheets();

    my @all_categories;
    foreach my $ws_items (@ws_items_all) {
        my $worksheet = $ws_items;
        my $worksheet_name = $worksheet->get_name;
        my ( $row_min, $row_max ) = $worksheet->row_range();
        my ( $col_min, $col_max ) = $worksheet->col_range();

        my %cident_to_col;
        my %col_to_cident;
        for my $row ( $row_min .. $row_min ) {
            for my $col ( $col_min .. $col_max ) {
                my $cell = $worksheet->get_cell( $row, $col );
                next unless $cell;
                $cident_to_col{meon::Web::Util->fix_cell_value($cell)} = $col;
                $col_to_cident{$col} = meon::Web::Util->fix_cell_value($cell);
            }
        }

        my $is_missing = 0;
        foreach my $req_column (qw(ordering-ident ident title)) {
            warn 'missing mandatory column '.$req_column.' in '.$worksheet_name
                unless exists $cident_to_col{$req_column};
        }
        next if $is_missing;

        my $current_category;
        my @sub_category_products;
        for my $row ( $row_min+1 .. $row_max ) {
            my %row_data;
            for my $col ( $col_min .. $col_max ) {
                my $ident = $col_to_cident{$col};
                next unless $ident;

                my $cell = $worksheet->get_cell( $row, $col );
                next unless $cell;

                if ($ident eq 'part') {
                    $row_data{$ident} //= [];
                    push(@{$row_data{$ident}}, meon::Web::Util->fix_cell_value($cell));
                }
                else {
                    $row_data{$ident} = meon::Web::Util->fix_cell_value($cell);
                }
            }
            next unless $row_data{ident};

            my $ident            = meon::Web::Util->to_ident($row_data{'ident'});
            my $ordering_ident   = $row_data{'ordering-ident'};
            my $title            = $row_data{'title'};
            my $category_product = meon::Web::Data::CategoryProduct->new(
                ident => $ident,
            );
            $category_product->set_element('title' => $title);
            if ($ordering_ident) {
                $category_product->set_element('ordering-ident' => $ordering_ident);
                $category_product->set_element('description'    => 'TODO')
                    unless $category_product->get_element('description');
                $category_product->store();
                push(@sub_category_products,$ident);
            }
            else {
                if ($current_category) {
                    $current_category->set_sub_category_products_element(
                        'subcategory-products' => \@sub_category_products
                    );
                    @sub_category_products = ();
                    $current_category->store();
                }
                $current_category = $category_product;
                push(@all_categories,$ident);
            }
        }
        if ($current_category) {
            $current_category->set_sub_category_products_element(
                'subcategory-products' => \@sub_category_products
            );
            @sub_category_products = ();
            $current_category->store();
        }
    }

    say 'all categories:';
    foreach my $cat (@all_categories) {
        say $cat;
    }
    if ($master_category) {
        my $category_product = meon::Web::Data::CategoryProduct->new(
            ident => $master_category,
        );
        $category_product->set_sub_category_products_element(
            'subcategory-products' => \@all_categories
        );
        $category_product->store;
    }

    return 0;
}

=head1 NAME

meon-web-generate-product-categories - generate products and categories from spreadsheet

=head1 SYNOPSIS

    meon-web-generate-product-categories --hostname-dir my-b2b-web --master-category cat import.xls

=head1 DESCRIPTION


=cut
