﻿//Copyright( c) 2010 Bevan Arps

//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions:

//The above copyright notice and this permission notice shall be included in all
//copies or substantial portions of the Software.

//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
//SOFTWARE.

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace GSD.Converters
{
	public class TextToFlowDocumentConverter : DependencyObject, IValueConverter
	{
		/// <summary>
		///     Converts a value.
		/// </summary>
		/// <returns>
		///     A converted value. If the method returns null, the valid null value is used.
		/// </returns>
		/// <param name="value">The value produced by the binding source.</param>
		/// <param name="targetType">The type of the binding target property.</param>
		/// <param name="parameter">The converter parameter to use.</param>
		/// <param name="culture">The culture to use in the converter.</param>
		public object Convert( object value, Type targetType, object parameter, CultureInfo culture )
		{
			if( value == null )
			{
				return DependencyProperty.UnsetValue;
			}

			var text = (string)value;

			var engine = Markdown ?? _Markdown.Value;

			return engine.Transform( text );
		}

		/// <summary>
		///     Converts a value.
		/// </summary>
		/// <returns>
		///     A converted value. If the method returns null, the valid null value is used.
		/// </returns>
		/// <param name="value">The value that is produced by the binding target.</param>
		/// <param name="targetType">The type to convert to.</param>
		/// <param name="parameter">The converter parameter to use.</param>
		/// <param name="culture">The culture to use in the converter.</param>
		public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
		{
			throw new NotSupportedException();
		}

		public Markdown Markdown
		{
			get { return (Markdown)GetValue( MarkdownProperty ); }
			set { SetValue( MarkdownProperty, value ); }
		}

		// Using a DependencyProperty as the backing store for Markdown.  This enables animation, styling, binding, etc...
		public static readonly DependencyProperty MarkdownProperty =
			DependencyProperty.Register( "Markdown", typeof( Markdown ), typeof( TextToFlowDocumentConverter ), new PropertyMetadata( null ) );

		private readonly Lazy<Markdown> _Markdown = new Lazy<Markdown>( () => new Markdown() );
	}
}