#!/usr/local/bin/perl

#
# Authentic Theme (https://github.com/authentic-theme/authentic-theme)
# Copyright Ilia Rostovtsev <ilia@virtualmin.com>
# Licensed under MIT (https://github.com/authentic-theme/authentic-theme/blob/master/LICENSE)
#
use strict;

our (%text, %in, %userconfig, %config, $special_folder_id);

do($ENV{'THEME_ROOT'} . "/extensions/mail/mail-lib.pl");

my %mails;

mailbox::open_dsn_hash();

# Get all available folders
my @folders = mailbox::list_folders_sorted();

# Get current folder
if (defined($in{'id'}) && length $in{'id'}) {
    my $id = mailbox::find_named_folder($in{'id'}, \@folders);
    if ($id) {
        $in{'folder'} = $id->{'index'};
    }
} elsif (!defined($in{'folder'}) && $userconfig{'default_folder'}) {
    my $df = mailbox::find_named_folder($userconfig{'default_folder'}, \@folders);
    if ($df) {
        $in{'folder'} = $df->{'index'};
    }

}
my ($folder) = grep {$_->{'index'} == $in{'folder'}} @folders;

# Check mail quota
my ($qtotal, $qcount, $totalquota, $countquota) = mailbox::get_user_quota();
if ($totalquota) {
    $mails{'quota'} =
      text('extensions_mail_quota', theme_nice_size_local($qtotal), (int($qtotal * 100 / $totalquota)), theme_nice_size_local($totalquota));
}

# Work out start from jump page
my $perpage = $folder->{'perpage'} || $userconfig{'perpage'} || 20;
$mails{'perpage'} = $perpage;

# Work out displayed range
my $start = int($in{'start'});
my $end   = int($start + $perpage - 1);

if ($in{'jump'} =~ /^\d+$/ && $in{'jump'} > 0) {

    $start = ($in{'jump'} - 1) * $perpage;
}

# Get email to show, in order
my @fetch_mail_error;
my ($start, @mail) = messages_fetch($start, $end, $perpage, $in{'jump'}, $folder, !$userconfig{'show_body'}, \@fetch_mail_error);

if ($end >= scalar(@mail)) {
    $end = scalar(@mail) - 1;
}
if ($end < $start) {
    $start = 0;
    $end   = int($start + $perpage - 1);
    ($start, @mail) = messages_fetch($start, $end, $perpage, $in{'jump'}, $folder, !$userconfig{'show_body'}, \@fetch_mail_error);
}

# Store default folders data
my $folder_index = $folder->{'index'};
my $folder_id    = $folder->{'id'};
my $folder_file  = $folder->{'file'};
my $folder_name  = $folder->{'name'};

# Searched messages
my %searched;
if ($in{'searched'}) {
    %searched = ('searched'              => $in{'searched'},
                 'searched_message'      => $in{'searched_message'},
                 'searched_folder_index' => $in{'searched_folder_index'},
                 'searched_folder_name'  => $in{'searched_folder_name'},
                 'searched_folder_id'    => $in{'searched_folder_id'},
                 'searched_folder_file'  => $in{'searched_folder_file'},);

    $mails{'searched'}              = $searched{'searched'};
    $mails{'searched_message'}      = $searched{'searched_message'};
    $mails{'searched_folder_index'} = $searched{'searched_folder_index'};
    $mails{'searched_folder_name'}  = $searched{'searched_folder_name'};
    $mails{'searched_folder_id'}    = folders_key_escape($searched{'searched_folder_id'});
    $mails{'searched_folder_file'}  = $searched{'searched_folder_file'};
}

# Refresh timeout
$mails{'refresh'} = $userconfig{'refresh'} || 5;

#Folder index
$mails{'folder_index'} = int($folder_index);

#Folder id
$mails{'folder_id'} = folders_key_escape(($folder_id || $folder_file));

# Folder breadcrumb
my @folders_breadcrumb = split(/\./, $folder_name);
$mails{'folder_breadcrumb'} = \@folders_breadcrumb;

# Folder title
$mails{'folder_title'} = $folder_name;

# Folder name
$mails{'folder_name'} = $folders_breadcrumb[-1];

# Folder counts
my ($total, $unread, $special, $folder_counts_allowed) = folder_counts($folder);
if ($total || $unread || $special) {
    $mails{'total'}   = $total;
    $mails{'unread'}  = $unread;
    $mails{'special'} = $special;
}
$total                          = scalar(@mail);
$mails{'total'}                 = $total;
$mails{'folder_counts_allowed'} = $folder_counts_allowed;

# Folders select
my $folders_select_by_id = folders_select(\@folders, $folder);

# Pagination
$mails{'pagination_start'}   = $start;
$mails{'pagination_end'}     = $end;
$mails{'pagination_current'} = int($start / $perpage) + 1;

my $link       = "index.cgi?folder=" . $in{'folder'};
my $initial    = @mail - $start - $perpage + 1;
my $percurrent = ($mails{'pagination_current'} * $perpage);
$mails{'pagination_arrow_left'} =
  message_pagination_link('left', $start ? $link . "&start=" . ($start - $perpage) : undef);
$mails{'pagination_arrow_right'} =
  message_pagination_link('right', $start + $perpage < @mail ? $link . "&start=" . ($start + $perpage) : undef);
$mails{'pagination_arrow_first'} = message_pagination_link('first', $start ? $link . "&start=0" : undef);
$mails{'pagination_arrow_last'} =
  message_pagination_link('last',
                   $start + $perpage < @mail ? $link . "&start=" . (int(($total - $perpage - 1) / $perpage + 1) * $perpage) :
                                     undef);
$mails{'pagination_message'} =
  @mail ?
  text('extensions_mail_current_position',
       $initial < 1 ? ($start ? $start + 1 : 1) : ($percurrent + 1 - $perpage),
       ($total < $percurrent  ? $total     : $percurrent),
       scalar(@mail)) :
  text('mail_none', $mails{'folder_name'});

# Buttons for managing mail
my $form_list_buttons;
if (@mail) {
    my $folders_count   = scalar(@folders);
    my $can_report_spam = (mailbox::can_report_spam($folder) || $folder->{'spam'} ? 1 : 0);  #&& $userconfig{'spam_buttons'} =~ /list/
    my $can_report_ham  = (mailbox::can_report_ham($folder) || $folder->{'spam'} ? 1 : 0);   #&& $userconfig{'ham_buttons'} =~ /list/

    $form_list_buttons = {
        'submit' => {
            'buttons'   => [['delete' => $text{'mail_delete'}], ['forward' => $text{'mail_forward'}]],
            'dropdowns' => [
                [
                 'move' => [
                      ['move1' => $folders_select_by_id],
                      ['copy1' =>
                         ui_span(
                                 theme_ui_checkbox_local('copy_only', undef, $text{'extensions_mail_move_copy_only'},
                                                         undef, "data-copy-only"
                                 ),
                                 'pull-left'
                         )
                         .
                         ui_span(
                           ui_btn($text{'theme_xhred_global_move'}, 'default disabled', 'data-transfer-submit'), 'pull-right'
                         )
                      ],
                 ]
                ],
                [
                 'more' => [
                     ['markas1' => $text{'extensions_mail_mark_read'}],
                     ['markas0' => $text{'extensions_mail_mark_unread'}],

                     # ['markas2' => $text{'extensions_mail_mark_special'}],
                     ($can_report_ham ?
                        [ 'white' => ($userconfig{'white_move'} && $folder->{'spam'}) ?
                            $text{'extensions_mail_mark_spam_mail_whitemove'} :
                            $text{'extensions_mail_mark_spam_mail_white'}
                        ] :
                        []
                     ),
                     ($can_report_spam ? ['black' => $text{'extensions_mail_mark_spam_mail_black'}] : []),
                     ($can_report_spam ?
                        [ 'razor' => $userconfig{'spam_del'} ? $text{'extensions_mail_mark_spam_view_razordel'} :
                            $text{'extensions_mail_mark_spam_view_razor'}
                        ] :
                        []
                     ),
                     (($can_report_ham) ?
                        [ 'ham' => ($userconfig{'ham_move'} && $folder->{'spam'}) ?
                            $text{'extensions_mail_mark_spam_view_hammove'} :
                            $text{'extensions_mail_mark_spam_view_ham'}
                        ] :
                        []
                     ),
                 ]
                ],

            ],

        },
        'select' => {
              'all'    => message_select_link("d", undef, undef, undef, undef, 5, $text{'extensions_mail_select_all'}),
              'none'   => message_select_link("d", undef, undef, undef, undef, 4, $text{'extensions_mail_select_none'}),
              'invert' => message_select_link("d", undef, undef, undef, undef, 3, $text{'extensions_mail_select_invert'}),
              'read'   => message_select_link("d", $folder, \@mail, $start, $end, 2, $text{'extensions_mail_select_read'}),
              'unread' => message_select_link("d", $folder, \@mail, $start, $end, 1, $text{'extensions_mail_select_unread'}),
              'special' => message_select_link("d", $folder, \@mail, $start, $end, 0, $text{'theme_xhred_global_starred'}),
        } };
}

# Form for managing mail
$mails{'form_list'} = { 'target' => 'delete_mail.cgi',
                        (
                         'hidden' => { 'id'      => folders_key_escape(($folder_id || $folder_file)),
                                       'folder'  => $folder_index,
                                       'mod'     => modification_time($folder),
                                       'start'   => $start || defined,
                                       'confirm' => 1,
                         }
                        ),
                        'buttons' => $form_list_buttons // defined };

# Assign errors
if (@fetch_mail_error) {
    my $fetch_mail_error = "@fetch_mail_error";
    my $mail_system = $config{'mail_system'};
    my $mail_err = $fetch_mail_error;
    if ($fetch_mail_error =~ /\[AUTH/) {
        if ($mail_system == 4) {
            $mail_err = text('save_elogin2', $fetch_mail_error);
        } elsif ($mail_system == 2) {
            $mail_err = text('save_elogin', $fetch_mail_error);
        }
        $mails{'redirect'} = 'inbox_login_error.cgi';
    }
    $mails{'error'} = text('mail_err', $mail_err);
}
my $errors = $mails{'error'};
if ($in{'error_fatal'} eq '1' || $errors) {
    my $error_message = $in{'error'};
    if ($errors) {
        $mails{'error'} = { error => ($error_message ? [$errors, $error_message] : [$errors]) };
    } elsif ($error_message) {
        $mails{'error'} = { error => [$error_message] };
    }
}

# Mail list sorter
my ($sorted) = mailbox::get_sort_field($folder);
my $showfrom = $folder->{'show_from'};
my $list_sort_from;
if ($showfrom) {
    $list_sort_from = messages_sort_link($text{'extensions_mail_sort_by_sender'}, "from", $folder, $start, %searched);
}
my $showto = $folder->{'show_to'};
my $list_sort_to;

if ($showto) {
    $list_sort_to = messages_sort_link($text{'extensions_mail_sort_by_recipient'}, "to", $folder, $start, %searched);
}
my $list_sort_spam;
if ($folder->{'spam'}) {
    $list_sort_spam = messages_sort_link($text{'extensions_mail_sort_by_spam'}, "x-spam-status", $folder, $start, %searched);
}

# Mail list content
my $list_mails;
if (@mail) {
    $list_mails = messages_list($start, $end, $showfrom, $showto, $folder, @mail);
}

$mails{'list'} = {
    'sort' => {
        'from'    => $list_sort_from,
        'to'      => $list_sort_to,
        'date'    => messages_sort_link($text{'extensions_mail_sort_by_date'}, "date", $folder, $start, %searched),
        'size'    => messages_sort_link($text{'extensions_mail_sort_by_size'}, "size", $folder, $start, %searched),
        'spam'    => $list_sort_spam,
        'subject' => messages_sort_link($text{'extensions_mail_sort_by_subject'}, "subject", $folder, $start, %searched),

    },
    'messages' => $list_mails,
    'sorted'   => (
        $sorted ?
"<a @{[ui_tooltip($text{'extensions_mail_search_filter_reset'})]} data-href='sort.cgi?returned_format=json&folder=$folder_index&start=$start@{[hash_to_query('&', %searched)]}' class=\"fa fa-fw fa-filter-clear text-danger\"></a>"
        :
          undef
    ) };

$mails{'mail_system'} = $config{'mail_system'};
$mails{'config'} = { 'g' => \%config,
                     'u' => \%userconfig, };

mailbox::save_last_folder_id($folder);
mailbox::pop3_logout();

print_json([\%mails]);
