using System.Collections.Generic;
using System;
using System.Globalization;
using System.Text;
using Newtonsoft.Json.Linq;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;

namespace AyaNova.DataList
{
    internal static class DataListSqlSelectBuilder
    {

        //Build the SELECT portion of a list query based on the template, mini or full and the object key in question 
        internal static string Build(List<AyaDataListFieldDefinition> objectFieldsList, string template, bool mini)
        {

            //parse the template
            var jtemplate = JObject.Parse(template);


            //convert to strings array (https://stackoverflow.com/a/33836599/8939)
            string[] templateFieldList;
            if (mini)
            {
                templateFieldList = ((JArray)jtemplate["mini"]).ToObject<string[]>();
            }
            else
            {
                templateFieldList = ((JArray)jtemplate["full"]).ToObject<string[]>();
            }

            StringBuilder sb = new StringBuilder();
            sb.Append("SELECT ");

            //Default ID column for each row (always is aliased as df)
            AyaDataListFieldDefinition def = objectFieldsList.FirstOrDefault(x => x.FieldKey == "df");
            if (def == null)
            {
                throw new System.ArgumentNullException("DataListSqlSelectBuilder: objectFieldList is missing the df default field");
            }
            if (string.IsNullOrEmpty(def.SqlIdColumnName))
            {
                sb.Append("id");//default when no alternate column is specified
            }
            else
            {
                sb.Append(def.SqlIdColumnName);
            }

            sb.Append(" AS df");

            foreach (string ColumnName in templateFieldList)
            {
                AyaDataListFieldDefinition o = objectFieldsList.FirstOrDefault(x => x.FieldKey == ColumnName);
#if (DEBUG)
                //Developers little helper
                if (o == null)
                {
                    throw new System.ArgumentNullException($"DEV ERROR in DataListSqlSelectBuilder.cs: field {ColumnName} specified in template was NOT found in ObjectFields list");
                }
#endif
                if (o != null)
                {//Ignore missing fields in production

                    sb.Append(", ");
                    sb.Append(o.GetSqlValueColumnName());

                    //does it also have an ID column?
                    if (!string.IsNullOrWhiteSpace(o.SqlIdColumnName))
                    {
                        sb.Append(", ");
                        sb.Append(o.SqlIdColumnName);
                    }
                }
            }

            return sb.ToString();
        }



    }//eoc
}//ens
