using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Sockeye.Biz;
using System.Linq;

namespace Sockeye.PickList
{
    internal class CustomerPickList : AyaPickList, IAyaPickListVariant
    {
        public CustomerPickList()
        {

            DefaultListAType = SockType.Customer;
            SQLFrom = "from acustomer ";
            AllowedRoles = BizRoles.GetRoleSet(DefaultListAType).Select;
            dynamic dTemplate = new JArray();

            dynamic cm = new JObject();
            cm.fld = "customername";
            dTemplate.Add(cm);

            cm = new JObject();
            cm.fld = "customertags";
            dTemplate.Add(cm);

            base.DefaultTemplate = dTemplate.ToString(Newtonsoft.Json.Formatting.None);

            //NOTE: Due to the join, all the sql id and name fields that can conflict with the joined table need to be specified completely
            ColumnDefinitions = new List<AyaPickListFieldDefinition>();
            ColumnDefinitions.Add(new AyaPickListFieldDefinition
            {
                TKey = "Active",
                FieldKey = "customeractive",
                ColumnDataType = UiFieldDataType.Bool,
                SqlValueColumnName = "acustomer.active",
                IsActiveColumn = true
            });
            ColumnDefinitions.Add(new AyaPickListFieldDefinition
            {
                TKey = "Name",
                FieldKey = "customername",
                ColumnDataType = UiFieldDataType.Text,
                SqlIdColumnName = "acustomer.id",
                SqlValueColumnName = "acustomer.name",
                IsRowId = true
            });

            ColumnDefinitions.Add(new AyaPickListFieldDefinition
            {
                TKey = "Tags",
                FieldKey = "customertags",
                ColumnDataType = UiFieldDataType.Tags,
                SqlValueColumnName = "acustomer.tags"
            });

        }
        public string GetVariantCriteria(string variant)
        {
            //Currently the only variant is a object type and id to indicate headoffice

            //ClientCriteria format for this list is "OBJECTID,AYATYPE" 
            var crit = (variant ?? "").Split(',').Select(z => z.Trim()).ToArray();
            if (crit.Length > 1)
            {
                int nType = 0;
                if (!int.TryParse(crit[1], out nType)) return string.Empty;
                SockType forType = (SockType)nType;
                if (forType != SockType.HeadOffice) return string.Empty;

                long lId = 0;
                if (!long.TryParse(crit[0], out lId)) return string.Empty;
                if (lId == 0) return string.Empty;

                //Have valid type, have an id, so filter away
                switch (forType)
                {
                    case SockType.HeadOffice:
                        {
                            return $"acustomer.headofficeid = {lId}";
                        }
                }
            }
            return string.Empty;
        }
    }//eoc
}//eons