package jp.co.y_net.amm.common;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jp.co.y_net.amm.dao.AppDef;
import jp.co.y_net.amm.dao.Usr;

import org.apache.commons.lang.StringUtils;

// TODO メッセージ取得部品の作成と利用

public class AppUtils {

    public static String urlDecode(String str) {
        try {
            str = URLDecoder.decode(str, "UTF-8"); // URLデコード
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        return str;
    }
    
    
    private static final DateFormat DF_LONG = new SimpleDateFormat("yyyyMMddHHmmss");
    private static final DateFormat DF_SHORT = new SimpleDateFormat("yyyyMMdd");


    /**
     * @return 現在日付
     */
    public static Integer createNowShort() {
        Date d = new Date();
        String s = DF_SHORT.format(d);
        Integer n = Integer.parseInt(s);
        return n;
    }
    /**
     * @return 現在日時
     */
    public static Long createNowLong() {
        Date d = new Date();
        String s = DF_LONG.format(d);
        Long n = Long.parseLong(s);
        return n;
    }
    /**
     * @param offset 加算する[秒]
     * @return 現在日時に offset を加算した時間
     */
    public static Long createNowLong(int offset) {
        Calendar c = Calendar.getInstance();
        c.add(Calendar.SECOND, offset);
        Date d = c.getTime();
        String s = DF_LONG.format(d);
        Long n = Long.parseLong(s);
        return n;
    }
    
    public static Date toDate(Long longDate) {
        try {
            String s = String.valueOf(longDate);
            Date d = DF_LONG.parse(s);
            return d;
        } catch (Exception e) {
            return null;
        }
    }

    public static Integer toInteger(String str) {
        try {
            return Integer.parseInt(str);
        } catch (NumberFormatException e) {
            return -1;
        }
    }
    public static boolean toBoolean(Integer integer) {
        return AppDef.TRUE.equals(integer);
    }
    public static String toStr(Number num) {
        if(num == null) {
            return "";
        }
        return String.valueOf(num);
    }
    public static String toStrYyyyMMdd(Integer integer) {
        String str = toStr(integer);
        if(str.length() == 8) {
            str = str.substring(0, 4) + "/" + str.substring(4, 6) + "/" + str.substring(6, 8);
        }
        return str;
    }
    public static String toStrYyyyMMdd(Long integer) {
        String str = toStr(integer);
        if(str.length() >= 8) {
            str = str.substring(0, 4) + "/" + str.substring(4, 6) + "/" + str.substring(6, 8);
        }
        return str;
    }
    public static String toStrYyyyMMdd_HHmmss(Long integer) {
        String str = toStr(integer);
        if(str.length() >= 14) {
            str = str.substring(0, 4) + "/" + str.substring(4, 6) + "/" + str.substring(6, 8)
                    + " " + str.substring(8, 10) + ":" + str.substring(10, 12) + ":" + str.substring(12, 14);
        }
        return str;
    }
    private static final DateFormat DF_YYYYMMDD = new SimpleDateFormat("yyyy/MM/dd");
    public static String toStrYyyyMMdd(Date date) {
        if(date == null) return "";
        return DF_YYYYMMDD.format(date);
    }
    
    /** ID-04900,ID-05242 二つのBooleanを比較する */
    public static boolean equals(Boolean a, Boolean b) {
        if(a == null && b == null) return true;
        if(a == null && b != null) return false;
        if(a != null && b == null) return false;
        return a.equals(b);
    }
    /** ID-04900,ID-05242 二つのIntegerを比較する */
    public static boolean equals(Integer a, Integer b) {
        if(a == null && b == null) return true;
        if(a == null && b != null) return false;
        if(a != null && b == null) return false;
        return a.equals(b);
    }
    /** ID-04900,ID-05242 二つのStringを比較する */
    public static boolean equals(String a, String b) {
        if(a == null && b == null) return true;
        if(a == null && b != null) return false;
        if(a != null && b == null) return false;
        return a.equals(b);
    }
    
    public static void main(String[] args) {
        Map<String, String> param = new HashMap<String, String>();
        param.put("loginid", "test@example.com");
        param.put("parame2", "()=~");
        int result = httpRequest("http://www.y-net.co.jp/abc", param);
        
        if(result == 200) {
            AppLogger.debug("送信成功");
        } else {
            AppLogger.error("送信失敗 " + result);
        }
    }
    
    /**
     * 外部APIに退会者のログインIDを通知
     * @param usr 
     */
    public static void callDeleteNotice(Usr usr) {
        List<Usr> list = new ArrayList<Usr>();
        list.add(usr);
        callDeleteNotice(list);
    }
    /**
     * 外部APIに退会者のログインIDを通知
     * @param users 
     */
    public static void callDeleteNotice(List<Usr> users) {
        Map<String, String> param = new HashMap<String, String>();
        param.put("size", String.valueOf(users.size()));
        for (int i = 0; i < users.size(); i++) {
            param.put("loginid" + i, users.get(i).getLoginid());
        }
        String urlApiDeletecall = ResourceReader.getStringQuick("api.deletenotice");
        int r = AppUtils.httpRequest(urlApiDeletecall, param);
        if(r >= 400) {
            AppLogger.error(
                    "外部APIに退会者のログインIDを通知する処理が失敗しました。"
                    + " URL=" + urlApiDeletecall 
                    + " HTTPステータスコード=" + r);
        }
    }
    public static int httpRequest(String url, Map<String, String> params) {
        
        if(params != null && params.isEmpty() == false) {
            String queryString = "";
            for(Map.Entry<String, String> param: params.entrySet()) {
                if(StringUtils.isEmpty(queryString) == false) {
                    queryString += "&";
                }
                String value;
                try {
                    value = URLEncoder.encode(param.getValue(), "UTF-8");
                } catch (UnsupportedEncodingException e) {
                    throw new RuntimeException(e);
                }
                queryString += param.getKey() + "=" + value;
            }
            url += "?" + queryString;
        }
        AppLogger.debug("http request:" + url);
        try {
            URL urlObj = new URL(url);
            HttpURLConnection urlCon = (HttpURLConnection) urlObj.openConnection();
            urlCon.setRequestMethod("GET");
            urlCon.connect();
            int status = urlCon.getResponseCode();
            
//            InputStream is = urlCon.getInputStream();
//            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
//            String s;
//            while ((s = reader.readLine()) != null) {
//                System.out.println(s);
//            }
//            reader.close();
            
            return status;
            
        } catch (MalformedURLException e) {
            AppLogger.error(e);
            return -1;
        } catch (ProtocolException e) {
            AppLogger.error(e);
            return -1;
        } catch (IOException e) {
            AppLogger.error(e);
            return -1;
        }
        
    }
//    /** 
//     * 入力されたURLが実在するかチェックする処理
//     * 実在するとき、エラーコードブランクでリターン　実在しないときエラーコードにエラーの理由をセットしてリターン
//     * @param url url
//     * @return errorCode エラーの理由
//     *  */
//    public static String urlChecker(String url) {
//        String errorCode = "";
//
//        try {
//            /* httpsのページは表示できないため、httpで目的のページを閲覧する */
//            if(url.startsWith("https") == true) {
//                url.replace("https", "http");
//            }
//            URL u = new URL(url);
//            HttpURLConnection urlCon = null;
//            try {
//                urlCon = (HttpURLConnection) u.openConnection();
//                try {
//                    urlCon.setRequestMethod("GET");
//                    try {
//                        urlCon.connect();
//                        int status = urlCon.getResponseCode();
//                        if(status == 200) {
//                            errorCode = "";
//                        } else {
//                            errorCode = "リンクが切れています。";
//                        }
//                    } catch (UnknownHostException e) {
//                        /* ホスト名に誤り */
//                        errorCode = "入力したURLに誤りがあります。";
//                    } catch (NullPointerException e) {
//                        /* コネクションなどでエラー */
//                        errorCode = "入力したURLに誤りがあります。";
//                        e.printStackTrace();
//                    }
//                } catch (ProtocolException e) {
//                    /* プロトコルでエラー */
//                    errorCode = "ネットワークに問題があります。";
//                } finally {
//                    /* コネクションの切断 */
//                    urlCon.disconnect();
//                }
//            } catch (IOException e) {
//                /* コネクションなどでエラー */
//                errorCode = "入力したURLに誤りがあります。";
//                e.printStackTrace();
//            }
//        } catch (MalformedURLException e) {
//            /* URLの構文が不正 */
//            errorCode = "入力したURLに誤りがあります。";
//        }
//        return errorCode;
//    }



}
