﻿/*
   Copyright 2013 Peter Stephens

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

using System.IO;
using System.Web;

namespace PoshWebGen.Razor
{
    /// <summary>
    /// A template base class that functions similarly to an MVC Razor View.
    /// </summary>
    public abstract class TemplateBase
    {
        private TextWriter _writer;

        public void Render(TextWriter writer, PageContext context)
        {
            _writer = writer;
            try
            {
                Execute();
            }
            finally
            {
                _writer = null;
            }
        }

        public abstract void Execute();

        public virtual TextWriter Writer
        {
            get { return _writer; }
        }

        public virtual void Write(ILazyHtmlString content)
        {
            WriteTo(Writer, content);
        }

        public virtual void Write(object content)
        {
            WriteTo(Writer, content);
        }

        public virtual void WriteLiteral(object content)
        {
            WriteLiteralTo(Writer, content);
        }

        public virtual void WriteTo(TextWriter writer, ILazyHtmlString content)
        {
            if(content != null)
                content.WriteTo(writer);
        }

        public virtual void WriteTo(TextWriter writer, object content)
        {
            writer.Write(HttpUtility.HtmlEncode(content));
        }

        public virtual void WriteLiteralTo(TextWriter writer, object content)
        {
            writer.Write(content);
        }
    }
}