/*
 * File    : ReportUtils.java
 * Created : 05-feb-2003 17:17
 * By      : fbusquets
 *
 * JClic - Authoring and playing system for educational activities
 *
 * Copyright (C) 2000 - 2018 Francesc Busquets & Departament
 * d'Educacio de la Generalitat de Catalunya
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details (see the LICENSE file).
 */

package edu.xtec.jclic.report;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.StringTokenizer;

/**
 * @author Francesc Busquets (fbusquets@xtec.cat)
 * @version 13.08.09
 */
public abstract class ReportUtils {

  public static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd");

  // Convert dates of type "yyyy/MM/dd" to Date objects
  public static Date strToDate(String s) throws Exception {
    return strToDate(s, false);
  }

  public static Date strToDate(String s, boolean atMidnight) throws Exception {
    GregorianCalendar gc = null;
    if (s.indexOf('/') > 0 || s.indexOf('-') > 0) {
      StringTokenizer st = new StringTokenizer(s, "/- ");
      gc = new GregorianCalendar(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()) - 1,
          Integer.parseInt(st.nextToken()), atMidnight ? 23 : 0, atMidnight ? 59 : 0, atMidnight ? 59 : 0);
    } else if (s.length() >= 8) {
      gc = new GregorianCalendar(Integer.parseInt(s.substring(0, 4)), Integer.parseInt(s.substring(4, 6)) - 1,
          Integer.parseInt(s.substring(6, 8)), atMidnight ? 23 : 0, atMidnight ? 59 : 0, atMidnight ? 59 : 0);
    } else
      throw new Exception("Bad date: " + s);

    return gc.getTime();
  }

  public static String dateToStr(Date d) throws Exception {
    return SDF.format(d);
  }

  public static final String ALPHANUM_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  public static final String VALID_URL_CHARS = "-_.!~*'()";

  public static String urlEncode(String src, boolean strict, boolean spaces) {
    if (src == null || src.length() < 1)
      return src;

    int len = src.length();
    StringBuilder sb = new StringBuilder(src.length() * 2);
    for (int i = 0; i < len; i++) {
      char ch = src.charAt(i);
      if (ALPHANUM_CHARS.indexOf(ch) >= 0 || (!strict && VALID_URL_CHARS.indexOf(ch) >= 0) || (spaces && ch == ' '))
        sb.append(ch);
      else {
        String s = Integer.toHexString(ch);
        if (ch < 16)
          sb.append("%0").append(s);
        else if (ch > 255)
          sb.append("%26%23").append(s).append("%3B");
        else
          sb.append("%").append(s);
      }
    }
    return sb.substring(0);
  }
}
