using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// QueryString 기반의 파라미터를 쉽게 액세스할 수 있는 메서드를 제공합니다.
/// </summary>
public class WebParam
{
    public WebParam()
    {
    }

    #region Conversion from QueryString parameter to primitive type

    /// <summary>
    /// Request.QueryString으로 전달되는 정수형 파라미터 값을 반환한다.
    /// </summary>
    /// <param name="index">파라미터 이름</param>
    /// <returns>파라미터 값을 반환</returns>
    public static int GetIntParamValue(string index)
    {
        int intValue;
        try
        {
            intValue = int.Parse(HttpContext.Current.Request.QueryString[index]);
        }
        catch
        {
            intValue = 0;
        }
        return intValue;
    }

    /// <summary>
    /// Request.QueryString으로 전달되는 정수형 파라미터 값을 반환한다.
    /// </summary>
    /// <param name="index">파라미터 이름</param>
    /// <returns>파라미터 값을 반환</returns>
    public static int GetIntParamValue(string index, int defaultValue)
    {
        int intValue;
        try
        {
            intValue = int.Parse(HttpContext.Current.Request.QueryString[index]);
        }
        catch
        {
            intValue = defaultValue;
        }
        return intValue;
    }

    /// <summary>
    /// Request.QueryString으로 전달되는 실수형 파라미터 값을 반환한다.
    /// </summary>
    /// <param name="index">파라미터 이름</param>
    /// <returns>파라미터 값을 반환</returns>
    public static double GetDoubleParamValue(string index)
    {
        double dblValue;
        try
        {
            dblValue = double.Parse(HttpContext.Current.Request.QueryString[index]);
        }
        catch
        {
            dblValue = 0.0;
        }
        return dblValue;
    }

    /// <summary>
    /// Request.QueryString으로 전달되는 문자형 파라미터 값을 반환한다.
    /// </summary>
    /// <param name="index">파라미터 이름</param>
    /// <returns>파라미터 값을 반환</returns>
    public static string GetStrParamValue(string index)
    {
        string strValue;
        try
        {
            strValue = HttpContext.Current.Request.QueryString[index];
            if (strValue == null) strValue = "";
        }
        catch
        {
            strValue = "";
        }
        return strValue;
    }

    /// <summary>
    /// Request.QueryString으로 전달되는 문자형 파라미터 값을 반환한다.
    /// </summary>
    /// <param name="index">파라미터 이름</param>
    /// <param name="defaultValue">값이 없거나 비어 있을 경우 반환될 기본값</param>
    /// <returns>파라미터 값을 반환</returns>
    public static string GetStrParamValue(string index, string defaultValue)
    {
        string strValue;
        try
        {
            strValue = HttpContext.Current.Request.QueryString[index];
            if (strValue == null || strValue == "") strValue = defaultValue;
        }
        catch
        {
            strValue = defaultValue;
        }
        return strValue;
    }

    /// <summary>
    /// Request.QueryString으로 전달되는 GUID 파라미터 값을 반환한다.
    /// </summary>
    /// <param name="index">파라미터 이름</param>
    /// <returns>파라미터 값을 반환</returns>
    public static Guid GetGuidParamValue(string index)
    {
        Guid guid;
        try
        {
            guid = new Guid(HttpContext.Current.Request.QueryString[index]);
        }
        catch
        {
            guid = Guid.Empty;
        }
        return guid;
    }

    public static bool GetBooleanParamValue(string index, bool defaultValue)
    {
        bool boolean;
        try
        {
            boolean = Boolean.Parse(HttpContext.Current.Request.QueryString[index]);
        }
        catch
        {
            boolean = defaultValue;
        }
        return boolean;
    }

    #endregion

    #region Web Path Utility

    /// <summary>
    /// 현재 페이지의 완전한 URL을 반환한다.
    ///  - 페이지 명은 제거된다.
    ///  - "http://webaccess.tabslab.local/Board/QnA/"로 반환
    /// </summary>
    /// <returns></returns>
    public static string GetCurrentPageFullUrl()
    {
        HttpRequest request = HttpContext.Current.Request;
        bool https = request.ServerVariables["HTTPS"].ToLower() == "on";
        string url = request.ServerVariables["URL"];
        string server = request.ServerVariables["SERVER_NAME"];
        string port = request.ServerVariables["SERVER_PORT"];

        string fullUrl;
        int pos = url.LastIndexOf('/');
        if (port == "80")
        {
            fullUrl = string.Format("{0}://{1}{2}/", https ? "https" : "http", server, url.Substring(0, pos));
        }
        else
        {
            fullUrl = string.Format("{0}://{1}:{2}{3}/", https ? "https" : "http", server, port, url.Substring(0, pos));
        }
        return fullUrl;
    }

    /// <summary>
    /// 현재 웹사이트 애플리케이션 URL을 반환한다.
    ///   - http://webaccess7.tabslab.com
    ///   - http://localhost:5996/WebAccess
    /// </summary>
    /// <returns></returns>
    public static string GetCurrentWebAppUrl()
    {
        HttpRequest request = HttpContext.Current.Request;
        bool https = request.ServerVariables["HTTPS"].ToLower() == "on";
        string server = request.ServerVariables["SERVER_NAME"];
        string port = request.ServerVariables["SERVER_PORT"];
        string appPath = (request.ApplicationPath == "/") ? "" : request.ApplicationPath;

        string appUrl;
        if (port == "80")
        {
            appUrl = string.Format("{0}://{1}{2}", https ? "https" : "http", server, appPath);
        }
        else
        {
            appUrl = string.Format("{0}://{1}:{2}{3}", https ? "https" : "http", server, port, appPath);
        }
        return appUrl;
    }

    #endregion
}
