/**
   * Method for invoking subscriptions via the command line
   *
   * @param argv command-line arguments, none used yet
   */
  public static void main(String[] argv) {
    log.info("#### START DELETE: -----" + new Date() + " ----- ####");
    String usage =
        "it.cilea.hku.authority.ScriptRPSubscribe [-t] or nothing to send out subscriptions.";

    Options options = new Options();
    HelpFormatter formatter = new HelpFormatter();
    CommandLine line = null;

    {
      Option opt = new Option("t", "test", false, "Run test session");
      opt.setRequired(false);
      options.addOption(opt);
    }

    {
      Option opt = new Option("h", "help", false, "Print this help message");
      opt.setRequired(false);
      options.addOption(opt);
    }

    try {
      line = new PosixParser().parse(options, argv);
    } catch (Exception e) {
      // automatically generate the help statement
      formatter.printHelp(usage, e.getMessage(), options, "");
      System.exit(1);
    }

    if (line.hasOption("h")) {
      // automatically generate the help statement
      formatter.printHelp(usage, options);
      System.exit(1);
    }

    boolean test = line.hasOption("t");

    if (test) log.setLevel(Level.DEBUG);
    Context context = null;
    try {
      context = new Context();
      Researcher researcher = new Researcher();
      ApplicationService applicationService = researcher.getApplicationService();

      List<CrisComponentsService> serviceComponent = researcher.getAllCrisComponents();
      for (CrisComponentsService service : serviceComponent) {
        for (ICRISComponent component : service.getComponents().values()) {
          RelationConfiguration relationConfiguration = component.getRelationConfiguration();
          if (Item.class.isAssignableFrom(relationConfiguration.getRelationClass())) {
            Integer key = CrisConstants.getEntityType(component.getTarget());
            String query = relationConfiguration.getQuery();
            if (!mapRelationFields.containsKey(key)) {
              List<String> rels = new LinkedList<String>();
              rels.add(query);
              mapRelationFields.put(key, rels);
            } else {
              mapRelationFields.get(key).add(query);
            }
          }
        }
      }
      processDaily(researcher, applicationService, context, test);
    } catch (Exception e) {
      log.error(e.getMessage(), e);
    } finally {
      if (context != null && context.isValid()) {
        // Nothing is actually written
        context.abort();
      }
    }
    log.info("#### END: -----" + new Date() + " ----- ####");
    System.exit(0);
  }
  /**
   * Sends an email to the given e-person with details of new items in the given dspace object (MUST
   * be a community or a collection), items that appeared yesterday. No e-mail is sent if there
   * aren't any new items in any of the dspace objects.
   *
   * @param context DSpace context object
   * @param eperson eperson to send to
   * @param rpkeys List of DSpace Objects
   * @param test
   * @throws SearchServiceException
   */
  public static void sendEmail(
      Researcher researcher,
      Context context,
      EPerson eperson,
      List<String> rpkeys,
      boolean test,
      List<String> relationFields)
      throws IOException, MessagingException, SQLException, SearchServiceException {

    CrisSearchService searchService = researcher.getCrisSearchService();

    // Get a resource bundle according to the eperson language preferences
    Locale supportedLocale = I18nUtil.getEPersonLocale(eperson);

    StringBuffer emailText = new StringBuffer();
    boolean isFirst = true;

    for (String rpkey : rpkeys) {
      SolrQuery query = new SolrQuery();
      query.setFields("search.resourceid");
      query.addFilterQuery(
          "{!field f=search.resourcetype}" + Constants.ITEM, "{!field f=inarchive}true");

      for (String tmpRelations : relationFields) {
        String fq = "{!field f=" + tmpRelations + "}" + rpkey;
        query.addFilterQuery(fq);
      }

      query.setRows(Integer.MAX_VALUE);

      if (ConfigurationManager.getBooleanProperty("eperson.subscription.onlynew", false)) {
        // get only the items archived yesterday
        query.setQuery("dateaccessioned:(NOW/DAY-1DAY)");
      } else {
        // get all item modified yesterday but not published the day
        // before
        // and all the item modified today and archived yesterday
        query.setQuery(
            "(item.lastmodified:(NOW/DAY-1DAY) AND dateaccessioned:(NOW/DAY-1DAY)) OR ((item.lastmodified:(NOW/DAY) AND dateaccessioned:(NOW/DAY-1DAY)))");
      }

      QueryResponse qResponse = searchService.search(query);
      SolrDocumentList results = qResponse.getResults();

      // Only add to buffer if there are new items
      if (results.getNumFound() > 0) {

        if (!isFirst) {
          emailText.append("\n---------------------------------------\n");
        } else {
          isFirst = false;
        }

        emailText
            .append(I18nUtil.getMessage("org.dspace.eperson.Subscribe.new-items", supportedLocale))
            .append(" ")
            .append(rpkey)
            .append(": ")
            .append(results.getNumFound())
            .append("\n\n");

        for (SolrDocument solrDoc : results) {

          Item item = Item.find(context, (Integer) solrDoc.getFieldValue("search.resourceid"));

          DCValue[] titles = item.getDC("title", null, Item.ANY);
          emailText
              .append("      ")
              .append(I18nUtil.getMessage("org.dspace.eperson.Subscribe.title", supportedLocale))
              .append(" ");

          if (titles.length > 0) {
            emailText.append(titles[0].value);
          } else {
            emailText.append(
                I18nUtil.getMessage("org.dspace.eperson.Subscribe.untitled", supportedLocale));
          }

          DCValue[] authors = item.getDC("contributor", Item.ANY, Item.ANY);

          if (authors.length > 0) {
            emailText
                .append("\n    ")
                .append(
                    I18nUtil.getMessage("org.dspace.eperson.Subscribe.authors", supportedLocale))
                .append(" ")
                .append(authors[0].value);

            for (int k = 1; k < authors.length; k++) {
              emailText.append("\n             ").append(authors[k].value);
            }
          }

          emailText
              .append("\n         ")
              .append(I18nUtil.getMessage("org.dspace.eperson.Subscribe.id", supportedLocale))
              .append(" ")
              .append(HandleManager.getCanonicalForm(item.getHandle()))
              .append("\n\n");
          context.removeCached(item, item.getID());
        }
      }
    }

    // Send an e-mail if there were any new items
    if (emailText.length() > 0) {

      if (test) {
        log.info(LogManager.getHeader(context, "subscription:", "eperson=" + eperson.getEmail()));
        log.info(LogManager.getHeader(context, "subscription:", "text=" + emailText.toString()));

      } else {

        Email email =
            ConfigurationManager.getEmail(
                I18nUtil.getEmailFilename(supportedLocale, "subscription"));
        email.addRecipient(eperson.getEmail());
        email.addArgument(emailText.toString());
        email.send();

        log.info(
            LogManager.getHeader(context, "sent_subscription", "eperson_id=" + eperson.getID()));
      }
    }
  }