﻿/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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;
using System.IO;
using System.Linq;
using System.Text;

namespace JavaDocToMarkdownConverter.Formatters
{
    public class DemoCodeFormatter
    {
        public static void ProcessDemoFiles(ConvertedDocument convertedDoc)
        {
            //custom processor for processing the Demo *.cs files so that when the docs build the csharp is visible directly in the docs without requiring
            //to navigate to the GitHub source. This is done by extracting just the code part of the *.cs files and creating docfx override files for those
            //classes.

            var demoCsFolder = convertedDoc.OutputFile.Directory;
            var apiDocsFolder = Path.Combine(demoCsFolder.Parent.Parent.FullName, "websites\\apidocs");
            if (!Directory.Exists(apiDocsFolder))
                throw new InvalidOperationException($"The folder {apiDocsFolder} does not exist");
            var apiSpecFolder = Path.Combine(apiDocsFolder, "apiSpec");
            Directory.CreateDirectory(apiSpecFolder);
            foreach (var folder in demoCsFolder.EnumerateDirectories().Where(x => x.Name != "Properties" && x.Name != "obj" && x.Name != "bin"))
            {
                foreach (var file in folder.EnumerateFiles("*.cs"))
                {
                    var code = CodeExtractor.ExtractCode(file);
                    var ns = CodeExtractor.ExtractNamespace(code);
                    var c = CodeExtractor.ExtractClassName(code);
                    var type = $"{ns}.{c}";
                    //naming is based on a docfx convention - not a strict convention but we might as well be consistent
                    var overrideFileName = $"{ns.Replace(".", "_")}_{c}.md";
                    File.WriteAllText(Path.Combine(apiSpecFolder, overrideFileName), AppendYamlHeader(type, code));
                }
            }
            
        }

        private static string AppendYamlHeader(string typeName, string fileContent)
        {
            var sb = new StringBuilder();
            sb.AppendLine("---");
            sb.Append("uid: ");
            sb.AppendLine(typeName);
            // This is special syntax to denote an 'array' of strings since that is what the 'example' metadata requires, 
            // see:https://dotnet.github.io/docfx/tutorial/intro_overwrite_files.html#managed-reference-model
            // This syntax doesn't seem to be documented anywhere except in the issue tracker
            //  see https://github.com/dotnet/docfx/issues/375#issuecomment-225407949
            //  see https://github.com/dotnet/docfx/issues/1685#issuecomment-303644744
            sb.AppendLine("example: [*content]");
            //sb.Append("summary: ");
            //sb.AppendLine(summary);
            sb.AppendLine("---");
            sb.AppendLine();
            sb.AppendLine("```");
            sb.AppendLine(fileContent);
            sb.AppendLine("```");

            return sb.ToString();
        }
    }
}
