#if Nancy
using Nancy;
using Nancy.ModelBinding;
using Nancy.Swagger;
using Nancy.Swagger.Annotations.Attributes;
using Swagger.ObjectModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using 电子展板.Base;
using 电子展板.Models;
using 电子展板.Utility;
using 电子展板.Utility.Other;

namespace 电子展板.WebModule
{
    public class HomeModule : NancyModule
    {
        public HomeModule(ISwaggerModelCatalog modelCatalog)
        {
            //涉及到哪些Model
            modelCatalog.AddModel<MyConfig>();
            modelCatalog.AddModel<RetValue<string>>();

            //默认页面
            Get("", _ => Index());
            Get("/", _ => Index());
            Get("/index.html", _ => Index());
            //全局静态资源
            Get("/static/{name*}", dynamic => StaticResource(dynamic.name ?? ""));
            //获得配置
            Get("/getConfig", _ => GetConfig(), null, "getConfig");
            //获得上传的文件
            Get("/upload/{id}", dynamic => GetUploadFiles(dynamic.id ?? ""));
            //上传图片
            Post("/uploadImage", dynamic =>
            {
                IEnumerable<HttpFile> files = Request.Files;
                if (files == null || files.Count() == 0)
                    return UploadImage(null);
                return UploadImage(files.FirstOrDefault());
            }, null, "uploadImage");
            //保存配置
            Post("/save", dynamic =>
            {
                MyConfig config = this.Bind<MyConfig>();
                return SaveConfig(config);
            }, null, "save");
        }


        /// <summary>
        /// 默认页面
        /// </summary>
        /// <param name="dynamic"></param>
        /// <returns></returns>
        private object Index()
        {
            return Resouce("Views/Index.html");
        }


        /// <summary>
        /// 全局静态资源
        /// </summary>
        /// <param name="dynamic"></param>
        /// <returns></returns>
        private object StaticResource(string name)
        {
            return Resouce(name);
        }


        /// <summary>
        /// 获得配置
        /// </summary>
        /// <param name="dynamic"></param>
        /// <returns></returns>
        [Route("getConfig")]//Name
        [Route(HttpMethod.Get, "/getConfig")]//Method And Path
        [Route(Summary = "获得配置数据")]
        [SwaggerResponse(HttpStatusCode.OK, typeof(MyConfig))]
        [Route(Tags = new[] { "获得配置数据" })]
        private object GetConfig()
        {
            return Response.AsJson(GlobalVariable.Config);
        }



        /// <summary>
        /// 获得上传的文件
        /// </summary>
        /// <param name="dynamic"></param>
        /// <returns></returns>
        private object GetUploadFiles(string id)
        {
            string contentType = MimeTypes.GetMimeType(id);
            //return Response.AsFile(MyEnvironment.Root("/Upload/" + id), contentType);
            UploadFiles uploadFiles = GlobalVariable.Config.FileUploadList.FirstOrDefault(x => x.Name == id);
            if (uploadFiles == null)
                return null;
            return Response.FromStream(new MemoryStream(uploadFiles.Bin), contentType);
        }

        /// <summary>
        /// 上传图片
        /// </summary>
        /// <param name="dynamic"></param>
        /// <returns></returns>
        [Route("uploadImage")]//Name
        [Route(HttpMethod.Post, "/uploadImage")]//Method And Path
        [Route(Summary = "上传图片")]
        [SwaggerResponse(HttpStatusCode.OK, typeof(RetValue<string>))]
        [Route(Tags = new[] { "上传图片" })]
        private object UploadImage([RouteParam(ParamIn = ParameterIn.Form, Name = "file", Description = "图片文件", ParamType = typeof(SwaggerFile), Required = true)] HttpFile file)
        {
            //string uploadPath = MyEnvironment.Root("/Upload/");
            //if (!Directory.Exists(uploadPath))
            //{
            //    Directory.CreateDirectory(uploadPath);
            //}
            string ext = Path.GetExtension(file.Name);
            string fileName = UUID.StrSnowId + ext;

            //var filePath = uploadPath + fileName;
            //using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
            //{
            //    file.Value.CopyTo(fileStream);
            //}


            ByteArrayStream stream = new ByteArrayStream();
            file.Value.CopyTo(stream);
            byte[] data = stream.ToByteArray();
            GlobalVariable.Config.FileUploadList.Add(new UploadFiles { Name = fileName, Bin = data });
            GlobalVariable.SaveConfig();
            RetValue<string> result = new RetValue<string> { state = 1, message = "上传成功", data = $"/upload/{fileName}" };
            return Response.AsJson(result);
        }


        [Route("save")]//Name
        [Route(HttpMethod.Post, "/save")]//Method And Path
        [Route(Summary = "保存配置")]
        [SwaggerResponse(HttpStatusCode.OK, typeof(RetValue<string>))]
        [Route(Tags = new[] { "保存配置" })]
        private object SaveConfig([RouteParam(ParamIn = ParameterIn.Body, Name = "parms", Description = "保存参数", Required = true)] MyConfig config)
        {
            //保存
            PropertyInfo[] propertyInfos = typeof(MyConfig).GetProperties();
            foreach (PropertyInfo propertyInfo in propertyInfos)
            {
                if (propertyInfo.Name == "FileUploadList")
                {
                    continue;
                }
                object value = propertyInfo.GetValue(config);
                propertyInfo.SetValue(GlobalVariable.Config, value);
            }
            GlobalVariable.SaveConfig();
            //保存并修改界面
            EventBus.Instance.Publish("save", "");
            RetValue<string> result = new RetValue<string> { state = 1, message = "保存成功" };
            return Response.AsJson(result);
        }

        private object Resouce(string resourcePath)
        {
            string packUri = $"pack://application:,,,/Assets/{resourcePath}";
            string contentType = MimeTypes.GetMimeType(packUri);
            return Response.FromStream(System.Windows.Application.GetResourceStream(new Uri(packUri, UriKind.RelativeOrAbsolute)).Stream, contentType);
        }
    }
}
#endif