using System.Reflection;

namespace SparkClient.Model.Entity.Base;

public abstract class BaseEntity
{
    public Guid GUID { get; set; }
    public static string TableName => throw new NotImplementedException("Table name is not implemented.");
    // 获取字段映射的实际名称
    private static Dictionary<string, string> GetFieldMappings()
    {
        var properties = typeof(BaseEntity).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 id = @id;";
        }
        else
        {
            // 根据传入的字段更新
            var setClause = string.Join(", ", fieldsToUpdate.Keys.Select(f => $"{f} = @{f}"));
            return $"UPDATE {TableName} SET {setClause} WHERE id = @id;";
        }
    }

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

[AttributeUsage(AttributeTargets.Property)]
public class DbFieldAttribute : Attribute
{
    public string FieldName { get; }

    public DbFieldAttribute(string fieldName)
    {
        FieldName = fieldName;
    }
}