using System;
using System.IO;
using System.Net;
using System.Text;
using System.Windows.Forms;

namespace RyzStudio.Net
{
	public class HttpWeb
	{
		public string defaultUserAgent = "Momozilla/5.0 (" + Environment.OSVersion.Platform.ToString() + " ; " + Environment.OSVersion.VersionString + "; " + Application.CurrentCulture.TwoLetterISOLanguageName + ")";
		public int defaultTimeout = 6000;
		public int defaultMaxRedirect = 8;
		public bool defaultAllowRedirect = true;
		public CookieContainer defaultCookierContainer = null;

		public HttpWeb()
		{
		}

		public HttpWebRequest CreateRequest(string url)
		{
			return this.CreateRequest(url, url);
		}

		public HttpWebRequest CreateRequest(string url, string referrerURL)
		{
			if (defaultCookierContainer == null)
			{
				defaultCookierContainer = new CookieContainer();
			}

			HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
			webRequest.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore);
			webRequest.MaximumAutomaticRedirections = defaultMaxRedirect;
			webRequest.CookieContainer = defaultCookierContainer;
			webRequest.UserAgent = defaultUserAgent;
			webRequest.AllowAutoRedirect = defaultAllowRedirect;
			webRequest.Timeout = defaultTimeout;

			return webRequest;
		}

		public int GetResponse(out string sourceCode, string url, string referrerURL = "")
		{
			HttpWebRequest webRequest = this.CreateRequest(url, referrerURL);

			return GetResponse(out sourceCode, webRequest);
		}

		public int GetResponse(out string sourceCode, HttpWebRequest webRequest)
		{
			sourceCode = string.Empty;

			int rv = 0;

			try
			{
				HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();

				rv = (int)webResponse.StatusCode;

				StreamReader readContent = new StreamReader(webResponse.GetResponseStream());
				sourceCode = readContent.ReadToEnd();

				webResponse.Close();
				webResponse = null;
			}
			catch (WebException xc)
			{
				if (xc.Response is HttpWebResponse)
				{
					HttpWebResponse rs = xc.Response as HttpWebResponse;
					StreamReader readContent = new StreamReader(rs.GetResponseStream());
					if (readContent != null)
					{
						sourceCode = readContent.ReadToEnd();
					}

					rv = (int)rs.StatusCode;
				}
				else
				{
					rv = (int)xc.Status;
					sourceCode = xc.Message;
				}
			}
			catch (Exception xc)
			{
				sourceCode = xc.Message;
			}

			return rv;
		}

		public static HttpWebRequest AddBasicAuthentication(HttpWebRequest webRequest, string username, string password)
		{
			webRequest.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes(string.Concat(username, ":", password)));
			webRequest.PreAuthenticate = true;

			return webRequest;
		}


		public int GetPOSTResponse(out string sourceCode, HttpWebRequest webRequest, string postData)
		{
			sourceCode = "";
			int rv = 0;
			byte[] buffer = Encoding.UTF8.GetBytes(postData);

			webRequest.ContentLength = buffer.Length;

			try
			{
				Stream dataStream = webRequest.GetRequestStream();
				dataStream.Write(buffer, 0, buffer.Length);
				dataStream.Close();
			}
			catch (Exception xc)
			{
				sourceCode = xc.Message;
				return rv;
			}

			return this.GetResponse(out sourceCode, webRequest);
		}

		public int GetHeader(out WebHeaderCollection headerCollection, string url, string referrerURL = "")
		{
			headerCollection = null;

			int rv = 0;

			HttpWebRequest webRequest = this.CreateRequest(url, referrerURL);
			webRequest.Method = "HEAD";

			try
			{
				HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
				headerCollection = webResponse.Headers;

				rv = (int)webResponse.StatusCode;

				webResponse.Close();
				webResponse = null;
			}
			catch (WebException xc)
			{
				if (xc.Response is HttpWebResponse)
				{
					HttpWebResponse rs = xc.Response as HttpWebResponse;

					rv = (int)rs.StatusCode;
				}
				else
				{
					rv = (int)xc.Status;
				}
			}
			catch (Exception xc)
			{
				// do nothing
			}

			return rv;
		}
	}
}