using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Text;

namespace UniMarc
{
    /// <summary>
    /// 도서관별 지연시간 설정을 관리하는 클래스
    /// </summary>
    public class Helper_LibraryDelaySettings
    {
        private static readonly string SettingsFileName = "LibraryDelaySettings.xml";
        private static readonly string SettingsFilePath = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
            "UniMarc",
            SettingsFileName
        );

        private Dictionary<string, int> _libraryDelaySettings;

        public Helper_LibraryDelaySettings()
        {
            _libraryDelaySettings = new Dictionary<string, int>();
            LoadSettings();
        }

        /// <summary>
        /// 도서관별 지연시간 설정을 로드
        /// </summary>
        private void LoadSettings()
        {
            try
            {
                if (File.Exists(SettingsFilePath))
                {
                    var xmlDoc = new XmlDocument();
                    xmlDoc.Load(SettingsFilePath);

                    var libraryNodes = xmlDoc.SelectNodes("//LibraryDelaySettings/Library");
                    if (libraryNodes != null)
                    {
                        foreach (XmlNode node in libraryNodes)
                        {
                            var name = node.Attributes?["Name"]?.Value;
                            var delayStr = node.Attributes?["Delay"]?.Value;

                            if (!string.IsNullOrEmpty(name) && int.TryParse(delayStr, out int delay))
                            {
                                _libraryDelaySettings[name] = delay;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"도서관 지연시간 설정 로드 오류: {ex.Message}");
                _libraryDelaySettings = new Dictionary<string, int>();
            }
        }

        /// <summary>
        /// 도서관별 지연시간 설정을 저장
        /// </summary>
        private void SaveSettings()
        {
            try
            {
                // 디렉토리 생성
                var directory = Path.GetDirectoryName(SettingsFilePath);
                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }

                // XML 파일로 저장
                var xmlDoc = new XmlDocument();
                var declaration = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null);
                xmlDoc.AppendChild(declaration);

                var root = xmlDoc.CreateElement("LibraryDelaySettings");
                xmlDoc.AppendChild(root);

                foreach (var kvp in _libraryDelaySettings)
                {
                    var libraryElement = xmlDoc.CreateElement("Library");
                    libraryElement.SetAttribute("Name", kvp.Key);
                    libraryElement.SetAttribute("Delay", kvp.Value.ToString());
                    root.AppendChild(libraryElement);
                }

                xmlDoc.Save(SettingsFilePath);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"도서관 지연시간 설정 저장 오류: {ex.Message}");
            }
        }

        /// <summary>
        /// 특정 도서관의 지연시간 설정을 가져옴
        /// </summary>
        /// <param name="libraryName">도서관 이름</param>
        /// <returns>지연시간(초), 설정이 없으면 0</returns>
        public int GetDelay(string libraryName)
        {
            if (string.IsNullOrEmpty(libraryName))
                return 0;

            return _libraryDelaySettings.TryGetValue(libraryName, out int delay) ? delay : 0;
        }

        /// <summary>
        /// 특정 도서관의 지연시간 설정을 저장
        /// </summary>
        /// <param name="libraryName">도서관 이름</param>
        /// <param name="delaySeconds">지연시간(초)</param>
        public void SetDelay(string libraryName, int delaySeconds)
        {
            if (string.IsNullOrEmpty(libraryName))
                return;

            if (delaySeconds < 0)
                delaySeconds = 0;

            _libraryDelaySettings[libraryName] = delaySeconds;
            SaveSettings();

            Console.WriteLine($"도서관 지연시간 설정 저장: {libraryName} = {delaySeconds}초");
        }

        /// <summary>
        /// 모든 도서관 지연시간 설정을 가져옴
        /// </summary>
        /// <returns>도서관명-지연시간 딕셔너리</returns>
        public Dictionary<string, int> GetAllSettings()
        {
            return new Dictionary<string, int>(_libraryDelaySettings);
        }

        /// <summary>
        /// 특정 도서관의 지연시간 설정을 제거
        /// </summary>
        /// <param name="libraryName">도서관 이름</param>
        public void RemoveDelay(string libraryName)
        {
            if (string.IsNullOrEmpty(libraryName))
                return;

            if (_libraryDelaySettings.ContainsKey(libraryName))
            {
                _libraryDelaySettings.Remove(libraryName);
                SaveSettings();
                Console.WriteLine($"도서관 지연시간 설정 제거: {libraryName}");
            }
        }

        /// <summary>
        /// 모든 지연시간 설정을 초기화
        /// </summary>
        public void ClearAllSettings()
        {
            _libraryDelaySettings.Clear();
            SaveSettings();
            Console.WriteLine("모든 도서관 지연시간 설정 초기화");
        }
    }
}