using System;
using System.IO;
using Newtonsoft.Json;

namespace AGVMapEditor.Models
{
    /// <summary>
    /// AGV 맵 에디터의 환경설정을 관리하는 클래스
    /// </summary>
    public class EditorSettings
    {
        #region Properties

        /// <summary>
        /// 마지막으로 열었던 맵 파일의 경로
        /// </summary>
        public string LastMapFilePath { get; set; } = string.Empty;

        /// <summary>
        /// 프로그램 시작시 마지막 맵 파일을 자동으로 로드할지 여부
        /// </summary>
        public bool AutoLoadLastMapFile { get; set; } = true;

        /// <summary>
        /// 설정이 마지막으로 저장된 시간
        /// </summary>
        public DateTime LastSaved { get; set; } = DateTime.Now;

        /// <summary>
        /// 기본 맵 파일 저장 디렉토리
        /// </summary>
        public string DefaultMapDirectory { get; set; } = string.Empty;

        #endregion

        #region Constants

        private static readonly string SettingsFileName = "EditorSettings.json";
        private static readonly string SettingsDirectory = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
            "AGVMapEditor");

        private static readonly string SettingsFilePath = Path.Combine(SettingsDirectory, SettingsFileName);

        #endregion

        #region Static Instance

        private static EditorSettings _instance;
        private static readonly object _lock = new object();

        /// <summary>
        /// 싱글톤 인스턴스
        /// </summary>
        public static EditorSettings Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (_lock)
                    {
                        if (_instance == null)
                        {
                            _instance = LoadSettings();
                        }
                    }
                }
                return _instance;
            }
        }

        #endregion

        #region Methods

        /// <summary>
        /// 설정을 파일에서 로드
        /// </summary>
        private static EditorSettings LoadSettings()
        {
            try
            {
                if (File.Exists(SettingsFilePath))
                {
                    string jsonContent = File.ReadAllText(SettingsFilePath);
                    var settings = JsonConvert.DeserializeObject<EditorSettings>(jsonContent);
                    return settings ?? new EditorSettings();
                }
            }
            catch (Exception ex)
            {
                // 설정 로드 실패시 기본 설정 사용
                System.Diagnostics.Debug.WriteLine($"설정 로드 실패: {ex.Message}");
            }

            return new EditorSettings();
        }

        /// <summary>
        /// 설정을 파일에 저장
        /// </summary>
        public void Save()
        {
            try
            {
                // 디렉토리가 없으면 생성
                if (!Directory.Exists(SettingsDirectory))
                {
                    Directory.CreateDirectory(SettingsDirectory);
                }

                LastSaved = DateTime.Now;
                string jsonContent = JsonConvert.SerializeObject(this, Formatting.Indented);
                File.WriteAllText(SettingsFilePath, jsonContent);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine($"설정 저장 실패: {ex.Message}");
            }
        }

        /// <summary>
        /// 마지막 맵 파일 경로 업데이트
        /// </summary>
        /// <param name="filePath">맵 파일 경로</param>
        public void UpdateLastMapFile(string filePath)
        {
            if (!string.IsNullOrEmpty(filePath) && File.Exists(filePath))
            {
                LastMapFilePath = filePath;

                // 기본 디렉토리도 업데이트
                DefaultMapDirectory = Path.GetDirectoryName(filePath);

                Save();
            }
        }

        /// <summary>
        /// 마지막 맵 파일이 존재하는지 확인
        /// </summary>
        public bool HasValidLastMapFile()
        {
            return !string.IsNullOrEmpty(LastMapFilePath) && File.Exists(LastMapFilePath);
        }

        /// <summary>
        /// 설정 초기화
        /// </summary>
        public void Reset()
        {
            LastMapFilePath = string.Empty;
            AutoLoadLastMapFile = true;
            DefaultMapDirectory = string.Empty;
            LastSaved = DateTime.Now;
            Save();
        }

        #endregion
    }
}