using System.Collections.Generic;
using System;
using AyaNova.Util;
using System.Linq;

namespace AyaNova.Biz
{
    public static class TagUtil
    {
        //clean up tags from client submission
        //remove dupes, substitute dashes for spaces, lowercase and shorten if exceed 255 chars
        public static List<string> NormalizeTags(List<string> inTags)
        {
            if (inTags==null || inTags.Count == 0) return inTags;

            List<string> outTags = new List<string>();
            foreach (var tag in inTags)
            {
                outTags.Add(NormalizeTag(tag));
            }
            return outTags.Distinct().ToList();
        }


        public static string NormalizeTag(string inObj)
        {
            //Must be lowercase per rules 
            //This may be naive when we get international customers but for now supporting utf-8 and it appears it's safe to do this with unicode
            inObj = inObj.ToLowerInvariant();
            //No spaces in tags, replace with dashes
            inObj = inObj.Replace(" ", "-");
            //Remove multiple dash sequences
            inObj = System.Text.RegularExpressions.Regex.Replace(inObj, "-+", "-");
            //Ensure doesn't start or end with a dash
            inObj = inObj.Trim('-');
            //No longer than 255 characters
            inObj = StringUtil.MaxLength(inObj, 255);
            return inObj;
        }


        /*
        
        
          /////////////////////////////////////////////////////////////////////
        /// IMPORT v7 implementation
        public async Task<bool> ImportV7Async(JObject j, List<ImportAyaNova7MapItem> importMap, Guid jobId)
        {
            //NO TASK TYPE, IT'S ALL THE SAME, KEEPING THIS FOR POSSIBLE FUTURE PURPOSES LIKE APPENDING OBJECT TYPE OR SOMETHING
            string SourceType = j["V7_TYPE"].Value<string>();
            switch (SourceType)
            {
                case "GZTW.AyaNova.BLL.Region":
                case "GZTW.AyaNova.BLL.UnitModelCategory":
                case "GZTW.AyaNova.BLL.UnitServiceType":
                case "GZTW.AyaNova.BLL.WorkorderItemType":
                case "GZTW.AyaNova.BLL.ClientGroup":
                case "GZTW.AyaNova.BLL.WorkorderCategory":
                case "GZTW.AyaNova.BLL.PartCategory":
                case "GZTW.AyaNova.BLL.DispatchZone":
                case "GZTW.AyaNova.BLL.ScheduleableUserGroup":
                    {
                        switch (j["IMPORT_TASK"].Value<string>())
                        {
                            case "main":
                                {
                                    #region main import task
                                    var NewTagName = j["Name"].Value<string>();

                                    var ShortTypeName = string.Empty;
                                    switch (SourceType)
                                    {
                                        case "GZTW.AyaNova.BLL.Region":
                                            ShortTypeName = "rgn";
                                            break;
                                        case "GZTW.AyaNova.BLL.UnitModelCategory":
                                            ShortTypeName = "unitmdlctgry";
                                            break;
                                        case "GZTW.AyaNova.BLL.UnitServiceType":
                                            ShortTypeName = "unitsvtyp";
                                            break;
                                        case "GZTW.AyaNova.BLL.WorkorderItemType":
                                            ShortTypeName = "woitemtyp";
                                            break;
                                        case "GZTW.AyaNova.BLL.ClientGroup":
                                            ShortTypeName = "clntgrp";
                                            break;
                                        case "GZTW.AyaNova.BLL.WorkorderCategory":
                                            ShortTypeName = "woctgry";
                                            break;
                                        case "GZTW.AyaNova.BLL.PartCategory":
                                            ShortTypeName = "prtctgry";
                                            break;
                                        case "GZTW.AyaNova.BLL.DispatchZone":
                                            ShortTypeName = "dspchzn";
                                            break;
                                        case "GZTW.AyaNova.BLL.ScheduleableUserGroup":
                                            ShortTypeName = "schdusrgrp";
                                            break;
                                    }


                                    NewTagName += "." + ShortTypeName;
                                    var OldV7Id = new Guid(j["ID"].Value<string>());

                                    //Ensure it follows the rules
                                    NewTagName = CleanTagName(NewTagName);

                                    //There might already be a tag of the same name since so many different types of V7 objects are becoming tags
                                    //Weighed the pros and cons of uniquifying by object type versus just using the same name for different object types: 
                                    //it seems to me at this point that people might desire the same exact name because if they used it that way they probably
                                    //intended it that way, so decision is to check if it already exists and then use that ID in the importMap instead
                                    //for matching other objects imported to tags 

                                    //Already present?
                                    var ExistingTag = ct.Tag.Where(m => m.Name == NewTagName).FirstOrDefault();
                                    if (ExistingTag != null)
                                    {
                                        //map it to the existing tag of same name
                                        var mapItem = new ImportAyaNova7MapItem(OldV7Id, AyaType.Tag, ExistingTag.Id);
                                    }
                                    else
                                    {

                                        Tag o = await CreateAsync(NewTagName);
                                        if (HasErrors)
                                        {
                                            //If there are any validation errors, log in joblog and move on
                                            JobsBiz.LogJob(jobId, $"TagBiz::ImportV7Async -> import object \"{NewTagName}\" of type \"{SourceType}\" source id {OldV7Id.ToString()} failed validation and was not imported: {GetErrorsAsString()} ", ct);
                                            return false;
                                        }
                                        else
                                        {
                                            await ct.SaveChangesAsync();
                                            var mapItem = new ImportAyaNova7MapItem(OldV7Id, AyaType.Tag, o.Id);
                                            importMap.Add(mapItem);
                                            ImportAyaNova7Biz.LogEventCreatedModifiedEvents(j, importMap, AyaType.Tag, ct);
                                        }
                                    }
                                    #endregion
                                }
                                break;
                            case "scheduleableusergrouptags":
                                {
                                    #region attribute sched user group tags
                                    // 
                                    // {
                                    // "ID": "871e77b2-979a-4f26-930b-46f7c05fc19f",
                                    // "Created": "08/30/2018 08:12 AM",
                                    // "Modified": "08/30/2018 08:13 AM",
                                    // "Creator": "2ecc77fc-69e2-4a7e-b88d-bd0ecaf36aed",
                                    // "Modifier": "2ecc77fc-69e2-4a7e-b88d-bd0ecaf36aed",
                                    // "Name": "Yet another test group",
                                    // "Active": true,
                                    // "Description": "More testing yay!",
                                    // "ScheduleableUsers": [
                                    //     {
                                    //     "Created": "08/30/2018 08:13 AM",
                                    //     "Creator": "2ecc77fc-69e2-4a7e-b88d-bd0ecaf36aed",
                                    //     "Modified": "08/30/2018 08:13 AM",
                                    //     "Modifier": "2ecc77fc-69e2-4a7e-b88d-bd0ecaf36aed",
                                    //     "ID": "676475be-8301-47d0-bd54-af9dbd1fe7eb",
                                    //     "ScheduleableUserID": "1d859264-3f32-462a-9b0c-a67dddfdf4d3",
                                    //     "ScheduleableUserGroupID": "871e77b2-979a-4f26-930b-46f7c05fc19f"
                                    //     },
                                    //     {
                                    //     "Created": "08/30/2018 08:13 AM",
                                    //     "Creator": "2ecc77fc-69e2-4a7e-b88d-bd0ecaf36aed",
                                    //     "Modified": "08/30/2018 08:13 AM",
                                    //     "Modifier": "2ecc77fc-69e2-4a7e-b88d-bd0ecaf36aed",
                                    //     "ID": "173499c3-a616-42a0-b08c-74008f8fa352",
                                    //     "ScheduleableUserID": "42b282bb-100b-4b31-aa14-5c831d7cda66",
                                    //     "ScheduleableUserGroupID": "871e77b2-979a-4f26-930b-46f7c05fc19f"
                                    //     },
                                    //     {
                                    //     "Created": "08/30/2018 08:13 AM",
                                    //     "Creator": "2ecc77fc-69e2-4a7e-b88d-bd0ecaf36aed",
                                    //     "Modified": "08/30/2018 08:13 AM",
                                    //     "Modifier": "2ecc77fc-69e2-4a7e-b88d-bd0ecaf36aed",
                                    //     "ID": "19c9b3d6-eeb2-44ac-be4e-6ec93d15b02a",
                                    //     "ScheduleableUserID": "e6ff9bc6-a550-4242-8c41-857f740e2841",
                                    //     "ScheduleableUserGroupID": "871e77b2-979a-4f26-930b-46f7c05fc19f"
                                    //     }
                                    // ]
                                    // }
                                    //  
                                    var V7Id = new Guid(j["ID"].Value<string>());
                                    var RavenTagId = importMap.Where(m => m.V7ObjectId == V7Id).First().NewObjectAyaTypeId.ObjectId;

                                    foreach (JToken t in j["ScheduleableUsers"])
                                    {
                                        var techId = new Guid(t["ScheduleableUserID"].Value<String>());
                                        var RavenUserId = importMap.Where(m => m.V7ObjectId == techId).First().NewObjectAyaTypeId.ObjectId;
                                        var Creator = importMap.Where(m => m.V7ObjectId == new Guid(t["Creator"].Value<string>())).First().NewObjectAyaTypeId.ObjectId;

                                        TagMap tm = new TagMap();
                                        tm.TagToObjectId = RavenUserId;
                                        tm.TagToObjectType = AyaType.User;
                                        tm.TagId = RavenTagId;
                                        tm.OwnerId = Creator;
                                        ct.TagMap.Add(tm);
                                    }
                                    ct.SaveChanges();

                                    #endregion
                                }
                                break;
                        }

                    }
                    break;


            }

            //this is the equivalent of returning void for a Task signature with nothing to return
            return true;
        }
        
        
         */


    }//eoc
}//ens
