private List<PostmanRequest> GetPostmanRequests(IEnumerable<SwaggerOperationDescription> apis, string collectionId, string root,SwaggerToolSettings setting)
        {
         
            List<PostmanRequest> re = new List<PostmanRequest>();
            foreach (var item in apis)
            {
                var p = new PostmanRequest
                {
                    
                    id = PostMan.GetId(),
                    name = item.Operation.Summary,
                    description = item.Operation.Summary,
                    descriptionFormat = "html",
                    headers = setting.PostmanGen.headers,
                    method = item.Method.ToString().ToUpper(),
                    pathVariables = new Dictionary<string, string>(),
                    url =root+ item.Path,
                    collectionId = collectionId,
                    tagname = item.Operation.Tags.FirstOrDefault()
                };
                var datalist = item.Operation.Parameters
                    .Where(s => s.Kind == SwaggerParameterKind.Query)
                    .Select(s =>s.Name+"={{"+s.Name+"}}")
                    .ToList();

                if (datalist.Count>0)
                {
                    p.dataMode = "params";
                    //URL Query
                    p.url +="/?"+string.Join("&",datalist);

                }
                var rawdata = item.Operation.Parameters
                     .Where(s => s.Kind == SwaggerParameterKind.Body)
                     .SingleOrDefault();
                if (rawdata!=null)
                {
                   
                    p.dataMode = "raw";
                    p.rawModeData =new Schema4Json().ToSampleJson(rawdata.ActualSchema);
                    //美化
                    p.rawModeData = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(p.rawModeData),Formatting.Indented);

                    if (string.IsNullOrEmpty(p.headers)||(!string.IsNullOrEmpty(p.headers)&&!p.headers.Contains("Content-Type: application/json\n")))
                    {
                        p.headers = "Content-Type: application/json\n" + p.headers??"";
                    }
                }
                
               
                re.Add(p);
            }
            return re;
        }
        public string Gen(SwaggerDocument service, SwaggerToolSettings setting)
        {
            var settings = new SwaggerToCSharpClientGeneratorSettings
            {
                ClassName = setting.CSharpGen.ClassName,
                 CSharpGeneratorSettings=new NJsonSchema.CodeGeneration.CSharp.CSharpGeneratorSettings() {  Namespace= setting.CSharpGen.Namespace}
            };

            var generator = new SwaggerToCSharpClientGenerator(service, settings);
            var code = generator.GenerateFile();

            return code;
        }
        public string Gen(SwaggerDocument service,string root,SwaggerToolSettings setting)
        {
            var collectionId = PostMan.GetId();
            var apis = service.Operations;
            var requests = GetPostmanRequests(apis, collectionId, root,setting);
            var collection = new PostmanCollection
            {
                id = collectionId,
                name = setting.PostmanGen.name,
                description = "",
                //在文件夹出现的order Id不能出现该order中
               // order = requests.Select(x => x.id).ToList(),
                timestamp = DateTime.Now.DateTimeToStamp(),
                requests = requests
            };

            //按照tag分组
            List<Postfolder> folders = new List<Postfolder>();
                var groups = requests.GroupBy(s => s.tagname);
                foreach (var item in groups)
                {
                    Postfolder floder = new Postfolder();
                    floder.id = PostMan.GetId();
                if (service.Tags != null)
                {
                    var desc = service.Tags.Where(p => p.Name == item.Key).FirstOrDefault();
                    if (desc!=null)
                    {
                        floder.name = desc.Description;
                    }
                    else
                    {
                        floder.name = item.Key;
                    }
                   
                }
                else
                {
                    floder.name = item.Key;
                }
                floder.order = requests.Where(p => p.tagname == item.Key).Select(s => s.id).ToList();

                foreach (var req in requests.Where(p => p.tagname == item.Key).ToList())
                {
                    req.folder = floder.id;
                }
                folders.Add(floder);
            }
            collection.folders = folders;
            return JsonConvert.SerializeObject(collection);
        }
        public string Gen(SwaggerDocument service, SwaggerToolSettings setting, TypeScriptTemplate Template)
        {
            var settings = new SwaggerToTypeScriptClientGeneratorSettings
            {
                ClassName =setting.TypeScriptGen.ClassName,
                Template = Template,
                PromiseType=PromiseType.Promise,
                TypeScriptGeneratorSettings=new NJsonSchema.CodeGeneration.TypeScript.TypeScriptGeneratorSettings() { ModuleName= setting.TypeScriptGen.ModuleName }
            };
        

        var generator = new SwaggerToTypeScriptClientGenerator(service, settings);
        var code = generator.GenerateFile();
            return code;
    }
 public string Gen(string type, SwaggerDocument service, SwaggerToolSettings setting)
 {
     switch (type)
     {
         case "CSharp":
             { return new CSharpGen().Gen(service, setting); }
         case "JQueryCallbacks":
         case "JQueryPromises":
         case "AngularJS":
         case "Angular2":
             {
                 return new TypeScriptGen().Gen(service, setting,(TypeScriptTemplate)Enum.Parse(typeof(TypeScriptTemplate),type));
             }
         default:
             return "Don't support  "+type+" Keyword";
     }
 }