using SlnMesnac.Generate.Templates.Service;
using SlnMesnac.Generate.Templates.Service.Impl;
using SqlSugar;
using System;

#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* 版权所有 (c) 2024 WenJY 保留所有权利。
* CLR版本：4.0.30319.42000
* 机器名称：LAPTOP-E0N2L34V
* 命名空间：SlnMesnac.Generate
* 唯一标识：78595105-fab6-40f0-97b4-1272dc3e0e86
*
* 创建者：WenJY
* 电子邮箱：wenjy@mesnac.com
* 创建时间：2024-04-11 13:35:01
* 版本：V1.0.0
* 描述：
*
*--------------------------------------------------------------------
* 修改人：
* 时间：
* 修改说明：
*
* 版本：V1.0.0
*--------------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
namespace SlnMesnac.Generate
{
    /// <summary>
    /// 生成代码
    /// </summary>
    public class GenerateCode
    {
        private readonly ISqlSugarClient _sqlSugarClient;

        public GenerateCode(ISqlSugarClient sqlSugarClient)
        {
            _sqlSugarClient = sqlSugarClient;
        }

        public bool CreateCode(string configId,string tableName,string savePath,string nameSpace)
        {
            if (string.IsNullOrEmpty(configId))
            {
                throw new ArgumentNullException($"代码生成异常:configId参数为空");
            }

            if (string.IsNullOrEmpty(tableName))
            {
                throw new ArgumentNullException($"代码生成异常:表格名称参数为空");
            }

            if (string.IsNullOrEmpty(savePath))
            {
                throw new ArgumentNullException($"代码生成异常:文件存储路径参数为空");
            }

            if (string.IsNullOrEmpty(nameSpace))
            {
                throw new ArgumentNullException($"代码生成异常:命名空间参数为空");
            }

            try
            {
                savePath += $"\\{tableName}";

                var scope = _sqlSugarClient.AsTenant().GetConnectionScope(configId);

                scope.DbFirst.IsCreateAttribute()
                    .FormatPropertyName(it=> ToCamelCase(it)).Where(p => p == tableName).CreateClassFile($"{savePath}\\Entity", nameSpace);

                var isc = new IServiceCreate();
                bool iscRes = isc.Create(tableName, nameSpace, savePath);
                if (!iscRes)
                {
                    throw new InvalidOperationException($"Service接口生成失败");
                }

                var sc = new ServiceCreate();
                var scRes = sc.Create(tableName, nameSpace, savePath);

                if (!scRes)
                {
                    throw new InvalidOperationException($"Service实现类生成失败");
                }

                return true;
            }catch (Exception ex)
            {
                throw new InvalidOperationException($"代码生成异常:{ex.Message}");
            }
        }

        private static string ToCamelCase(string input)
        {
            // 将字符串转换为驼峰格式，但保持每个单词的首字母大写
            string[] words = input.Split('_');
            for (int i = 0; i < words.Length; i++)
            {
                if (i > 0)
                {
                    words[i] = char.ToUpper(words[i][0]) + words[i].Substring(1).ToLower();
                }
                else
                {
                    words[i] = words[i].ToLower();
                }
            }
            return string.Join("", words);
        }
    }
}
