namespace AxCopilot.Services.Agent;

public partial class AgentLoopService
{
    /// <summary>LLM 텍스트 응답을 HTML 보고서 파일로 자동 저장합니다.</summary>
    private string? AutoSaveAsHtml(string textContent, string userQuery, AgentContext context)
    {
        try
        {
            // 파일명 생성 — 동사/명령어를 제거하여 깔끔한 파일명 만들기
            var title = userQuery.Length > Defaults.QueryTitleMaxLength ? userQuery[..Defaults.QueryTitleMaxLength] : userQuery;
            // 파일명에 불필요한 동사/명령어 제거
            var removeWords = new[] { "작성해줘", "작성해 줘", "만들어줘", "만들어 줘", "써줘", "써 줘",
                "생성해줘", "생성해 줘", "작성해", "만들어", "생성해", "해줘", "해 줘", "부탁해" };
            var safeTitle = title;
            foreach (var w in removeWords)
                safeTitle = safeTitle.Replace(w, "", StringComparison.OrdinalIgnoreCase);
            foreach (var c in System.IO.Path.GetInvalidFileNameChars())
                safeTitle = safeTitle.Replace(c, '_');
            safeTitle = safeTitle.Trim().TrimEnd('.').Trim();

            var fileName = $"{safeTitle}.html";
            var fullPath = FileReadTool.ResolvePath(fileName, context.WorkFolder);
            if (context.ActiveTab == "Cowork")
                fullPath = AgentContext.EnsureTimestampedPath(fullPath);

            var dir = System.IO.Path.GetDirectoryName(fullPath);
            if (!string.IsNullOrEmpty(dir)) System.IO.Directory.CreateDirectory(dir);

            // 텍스트 → HTML 변환
            var css = TemplateService.GetCss("professional");
            var htmlBody = ConvertTextToHtml(textContent);

            var html = $@"<!DOCTYPE html>
<html lang=""ko"">
<head>
<meta charset=""utf-8"">
<title>{EscapeHtml(title)}</title>
<style>
{css}
.doc {{ max-width: 900px; margin: 0 auto; padding: 40px 30px 60px; }}
.doc h1 {{ font-size: 28px; margin-bottom: 8px; border-bottom: 3px solid var(--accent, #4B5EFC); padding-bottom: 10px; }}
.doc h2 {{ font-size: 22px; margin-top: 36px; margin-bottom: 12px; border-bottom: 2px solid var(--accent, #4B5EFC); padding-bottom: 6px; }}
.doc h3 {{ font-size: 18px; margin-top: 24px; margin-bottom: 8px; }}
.doc .meta {{ color: #888; font-size: 13px; margin-bottom: 24px; }}
.doc p {{ line-height: 1.8; margin-bottom: 12px; }}
.doc ul, .doc ol {{ line-height: 1.8; margin-bottom: 16px; }}
.doc table {{ border-collapse: collapse; width: 100%; margin: 16px 0; }}
.doc th {{ background: var(--accent, #4B5EFC); color: #fff; padding: 10px 14px; text-align: left; }}
.doc td {{ padding: 8px 14px; border-bottom: 1px solid #e5e7eb; }}
.doc tr:nth-child(even) {{ background: #f8f9fa; }}
</style>
</head>
<body>
<div class=""doc"">
<h1>{EscapeHtml(title)}</h1>
<div class=""meta"">작성일: {DateTime.Now:yyyy-MM-dd} | AX Copilot 자동 생성</div>
{htmlBody}
</div>
</body>
</html>";

            System.IO.File.WriteAllText(fullPath, html, System.Text.Encoding.UTF8);
            LogService.Info($"[AgentLoop] 문서 자동 저장 완료: {fullPath}");
            return fullPath;
        }
        catch (Exception ex)
        {
            LogService.Warn($"[AgentLoop] 문서 자동 저장 실패: {ex.Message}");
            return null;
        }
    }

    /// <summary>LLM 텍스트(마크다운 형식)를 HTML로 변환합니다.</summary>
    private static string ConvertTextToHtml(string text)
    {
        var sb = new System.Text.StringBuilder();
        var lines = text.Split('\n');
        var inList = false;
        var listType = "ul";

        foreach (var rawLine in lines)
        {
            var line = rawLine.TrimEnd();

            // 빈 줄
            if (string.IsNullOrWhiteSpace(line))
            {
                if (inList) { sb.AppendLine($"</{listType}>"); inList = false; }
                continue;
            }

            // 마크다운 제목
            if (line.StartsWith("### "))
            {
                if (inList) { sb.AppendLine($"</{listType}>"); inList = false; }
                sb.AppendLine($"<h3>{EscapeHtml(line[4..])}</h3>");
                continue;
            }
            if (line.StartsWith("## "))
            {
                if (inList) { sb.AppendLine($"</{listType}>"); inList = false; }
                sb.AppendLine($"<h2>{EscapeHtml(line[3..])}</h2>");
                continue;
            }
            if (line.StartsWith("# "))
            {
                if (inList) { sb.AppendLine($"</{listType}>"); inList = false; }
                sb.AppendLine($"<h2>{EscapeHtml(line[2..])}</h2>");
                continue;
            }

            // 번호 리스트 (1. 2. 등) - 대제목급이면 h2로
            if (System.Text.RegularExpressions.Regex.IsMatch(line, @"^\d+\.\s+\S"))
            {
                var content = System.Text.RegularExpressions.Regex.Replace(line, @"^\d+\.\s+", "");
                // 짧고 제목 같으면 h2, 길면 리스트
                if (content.Length < 80 && !content.Contains('.') && !line.StartsWith("  "))
                {
                    if (inList) { sb.AppendLine($"</{listType}>"); inList = false; }
                    sb.AppendLine($"<h2>{EscapeHtml(line)}</h2>");
                }
                else
                {
                    if (!inList) { sb.AppendLine("<ol>"); inList = true; listType = "ol"; }
                    sb.AppendLine($"<li>{EscapeHtml(content)}</li>");
                }
                continue;
            }

            // 불릿 리스트
            if (line.TrimStart().StartsWith("- ") || line.TrimStart().StartsWith("* ") || line.TrimStart().StartsWith("• "))
            {
                var content = line.TrimStart()[2..].Trim();
                if (!inList) { sb.AppendLine("<ul>"); inList = true; listType = "ul"; }
                sb.AppendLine($"<li>{EscapeHtml(content)}</li>");
                continue;
            }

            // 일반 텍스트
            if (inList) { sb.AppendLine($"</{listType}>"); inList = false; }
            sb.AppendLine($"<p>{EscapeHtml(line)}</p>");
        }

        if (inList) sb.AppendLine($"</{listType}>");
        return sb.ToString();
    }

    private static string EscapeHtml(string text)
        => text.Replace("&", "&amp;").Replace("<", "&lt;").Replace(">", "&gt;");
}
