using SparkClient.Model.Entity.Base;
using System.Reflection;
using System.Runtime.CompilerServices;

namespace SparkClient.Model.Entity;

/// <summary>
/// 系统设置实体
/// </summary>

public class AlgorithmConfigEntity
{
    public static readonly string TableName = "ALGORITHM_CONFIG";
    [DbField("GUID")]
    public Guid GUID { get; set; }
    /// <summary>
    /// json内容
    /// </summary>
    [DbField("JSON")]
    public required string Json { get; set; }
    /// <summary>
    /// Json排序
    /// </summary>
    [DbField("JSON_ORDER")]
    public required int JsonOrder { get; set; }
   
    private static Dictionary<string, string> GetFieldMappings()
    {
        var properties = typeof(AlgorithmConfigEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        return properties
            .Where(p => Attribute.IsDefined(p, typeof(DbFieldAttribute)))
            .ToDictionary(
                p => p.Name,
                p => ((DbFieldAttribute)p.GetCustomAttribute(typeof(DbFieldAttribute))).FieldName
            );
    }

    // 生成 Insert 语句
    public string GenerateInsertSQL()
    {
        var mappings = GetFieldMappings();
        var columns = string.Join(", ", mappings.Values);
        var values = string.Join(", ", mappings.Keys.Select(k => $"@{k}"));
        return $"INSERT INTO {TableName} ({columns}) VALUES ({values});";
    }

    // 生成 Update 语句
    public string GenerateUpdateSQL(Dictionary<string, object> fieldsToUpdate = null)
    {
        if (fieldsToUpdate == null || fieldsToUpdate.Count == 0)
        {
            // 默认根据 ID 更新所有字段
            var mappings = GetFieldMappings();
            var setClause = string.Join(", ", mappings.Values.Select(f => $"{f} = @{f}"));
            return $"UPDATE {TableName} SET {setClause} WHERE GUID = " + GUID.ToString() + ";";
        }
        else
        {
            // 根据传入的字段更新
            var setClause = string.Join(", ", fieldsToUpdate.Keys.Select(f => $"{f} = @{f}"));
            return $"UPDATE {TableName} SET {setClause} WHERE GUID = " + GUID.ToString() + ";";
        }
    }

    // 生成 Delete 语句
    public string GenerateDeleteSQL(Dictionary<string, object> conditions = null)
    {
        if (conditions == null || conditions.Count == 0)
        {
            // 默认根据 ID 删除
            return $"DELETE FROM {TableName} WHERE GUID =" + GUID.ToString() + ";";
        }
        else
        {
            // 根据传入条件删除
            var whereClause = string.Join(" AND ", conditions.Keys.Select(f => $"{f} = @{f}"));
            return $"DELETE FROM {TableName} WHERE {whereClause};";
        }
    }
    // 生成 Select 语句
    public string GenerateSelectSQL(List<string> fields = null, Dictionary<string, object> conditions = null)
    {
        var mappings = GetFieldMappings();

        // 如果没有指定字段,则选择所有字段
        if (fields == null || fields.Count == 0)
        {
            fields = mappings.Values.ToList();
        }
        else
        {
            // 确保指定的字段存在于映射中
            fields = fields.Where(f => mappings.ContainsValue(f)).ToList();
        }

        var columns = string.Join(", ", fields);

        var sql = $"SELECT {columns} FROM {TableName}";

        if (conditions != null && conditions.Count > 0)
        {
            var whereClause = string.Join(" AND ", conditions.Keys.Select(f => $"{mappings[f]} = @{f}"));
            sql += $" WHERE {whereClause}";
        }

        sql += ";";

        return sql;
    }
}