<?php

require_once dirname(__FILE__).'/accesscheck.php';

$subselectimp = ''; ## do not use subselect: https://mantis.phplist.com/view.php?id=16725
@ob_end_flush();

if (!ALLOW_IMPORT) {
    print '<p class="information">'.$GLOBALS['I18N']->get('import is not available').'</p>';

    return;
}

## most basic possible import: big text area to paste emails in
$selected_lists = array();

## this needs to be outside of anything, so that (ajaxed) addition of a list can be processed
$selected_lists = getSelectedLists('importlists');

$actionresult = '';
$content = '';

if (!empty($_POST['importcontent'])) {
    $lines = explode("\n", $_POST['importcontent']);
    $count['imported'] = 0;
    $count['duplicate'] = 0;
    $count['processed'] = 0;
    $count['addedtolist'] = 0;
    $count['invalid'] = 0;
    $count['foundonblacklist'] = 0;

    $rejectReport = array(
    'invalid' => '',
  );

    $total = count($lines);
    foreach ($lines as $line) {
        if (trim($line) == '') {
            continue;
        }

    ## do some basic clearing
    $line = cleanEmail($line);
        $uniqid = getUniqid();

        if (!empty($_POST['checkvalidity'])) {
            $isValid = validateEmail($line);
        } else {
            $isValid = true;
        }

        if ($isValid) {
            ## I guess everyone will import all their users wanting to receive HTML ....
      $query = sprintf('insert into %s (email,entered,htmlemail,confirmed,uniqid)
                values("%s",now(),1,1,"%s")', $tables['user'], $line, $uniqid);
            $result = Sql_query($query, 1);
            $userid = Sql_insert_id();
            if (empty($userid)) {
                ++$count['duplicate'];
        ## mark the subscriber confirmed, don't touch blacklisted
        ## hmm, maybe not, can be done on the reconcile page
     #   Sql_Query(sprintf('update %s set confirmed = 1 where email = "%s"', $tables["user"], $line));
        $idreq = Sql_Fetch_Row_Query(sprintf('select id from %s where email = "%s"', $tables['user'], $line));
                $userid = $idreq[0];
            } else {
                ++$count['imported'];
                addUserHistory($line, $GLOBALS['I18N']->get('import_by').' '.adminName(), '');
            }

      ## do not add them to the list(s) when blacklisted
      $isBlackListed = isBlackListed($line);
            if (!$isBlackListed) {
                ++$count['addedtolist'];
                foreach ($selected_lists as $k => $listid) {
                    $query = 'replace into '.$tables['listuser']." (userid,listid,entered) values($userid,$listid,now())";
                    $result = Sql_query($query);
                }
            } else {
                ## mark blacklisted, just in case ##17288
        Sql_Query(sprintf('update %s set blacklisted = 1 where id = %d', $tables['user'], $userid));
                ++$count['foundonblacklist'];
            }
        } else {
            ++$count['invalid'];
            $rejectReport['invalid'] .= "\n".$line; ## @TODO hmm, this can blow up
        }

        ++$count['processed'];
        if ($count['processed'] % 100 == 0) {
            print $count['processed'].' / '.$total.' '.$GLOBALS['I18N']->get('Imported').'<br/>';
            flush();
        }
    }
    $report =  s('%d lines processed', $count['processed']).PHP_EOL;
    $report .= s('%d email addresses added to the list(s)', $count['addedtolist']).PHP_EOL;
    $report .= s('%d new email addresses imported', $count['imported']).PHP_EOL;
    $report .= s('%d email addresses already existed in the database', $count['duplicate']).PHP_EOL;
    if (!empty($count['invalid'])) {
        $report .= s('%d invalid email addresses', $count['invalid']).PHP_EOL;
        $report .= s('Invalid addresses will be reported in the report that is sent to %s', getConfig('admin_address')).PHP_EOL;
    }
    if ($count['foundonblacklist']) {
        $report .= s('%d addresses were blacklisted and have not been subscribed to the list', $count['foundonblacklist']).PHP_EOL;
    }

    print ActionResult(nl2br($report));

    if ($_GET['page'] == 'importsimple') {
        if (!empty($_GET['list'])) {
            $toList = sprintf('&list=%d', $_GET['list']);
        } else {
            $toList = '';
        }
        print '<div class="actions">
    '
    .PageLinkButton('send&new=1'.$toList, s('Send a campaign'))
    .PageLinkButton('importsimple', s('Import some more emails'))

    .'</div>';
    }

    if (!empty($rejectReport['invalid'])) {
        $report .= "\n\n".s('Rejected email addresses').":\n";
        $report .= $rejectReport['invalid'];
    }

    sendMail(getConfig('admin_address'), s('phplist Import Results'), $report);
    foreach ($GLOBALS['plugins'] as $pluginname => $plugin) {
        $plugin->importReport($report);
    }

    return;
}

if ($GLOBALS['require_login'] && !isSuperUser()) {
    $access = accessLevel('import1');
    switch ($access) {
    case 'owner':
      $subselectimp = ' where owner = '.$_SESSION['logindetails']['id'];break;
    case 'all':
      $subselectimp = '';break;
    case 'none':
    default:
      $subselectimp = ' where id = 0';break;
  }
}

if (isset($_GET['list'])) {
    $id = sprintf('%d', $_GET['list']);
    if (!empty($subselectimp)) {
        $subselectimp .= ' and id = '.$id;
    } else {
        $subselectimp .= ' where id = '.$id;
    }
}
#print PageLinkDialog('addlist',$GLOBALS['I18N']->get('Add a new list'));
print FormStart(' enctype="multipart/form-data" name="import"');

$result = Sql_query('SELECT id,name FROM '.$tables['list']."$subselectimp ORDER BY listorder");
$total = Sql_Num_Rows($result);
$c = 0;
if ($total == 1) {
    $row = Sql_fetch_array($result);
    $content .= sprintf('<input type="hidden" name="listname[%d]" value="%s"><input type="hidden" name="importlists[%d]" value="%d">'.$GLOBALS['I18N']->get('Adding subscribers').' <b>%s</b>', $c, stripslashes($row['name']), $c, $row['id'], stripslashes($row['name']));
} else {
    $content .= '<p>'.$GLOBALS['I18N']->get('Select the lists to add the emails to').'</p>';

    $content .= ListSelectHTML($selected_lists, 'importlists', $subselectimp);
}

$content .= '<p class="information">'.
$GLOBALS['I18N']->get('Please enter the emails to import, one per line, in the box below and click "Import Emails"');
#$GLOBALS['I18N']->get('<b>Warning</b>: the emails you import will not be checked on validity. You can do this later on the "reconcile subscribers" page.');
$content .= '</p>';
$content .= '<div class="field"><input type="checkbox" name="checkvalidity" value="1" checked="checked" /> '.$GLOBALS['I18N']->get('Check to skip emails that are not valid').'</div>';
$content .= '<div class="field"><input type="submit" name="doimport" value="'.$GLOBALS['I18N']->get('Import emails').'" ></div>';
$content .= '<div class="field"><textarea name="importcontent" rows="10" cols="40"></textarea></div>';

$panel = new UIPanel('', $content);
print $panel->display();
print '</form>';
