using System.Diagnostics;
using System.Globalization;
using System.Text.RegularExpressions;


namespace DragonVideoPlayer
{

    public static class SrtTimeShifter
    {
        /// <summary>
        /// 現在のsub-delay秒をSRTに焼き込む
        /// 元ファイルは _backup.srt で保存
        /// </summary>
        public static bool ApplySubDelayToSrt(string srtPath, double subDelaySeconds)
        {
            if (!File.Exists(srtPath))
            {
                MessageBox.Show("字幕ファイルが見つかりません");
                return false;
            }

            string fileName = Path.GetFileName(srtPath);
            string backupPath = Path.Combine(
                Path.GetDirectoryName(srtPath)!,
                Path.GetFileNameWithoutExtension(srtPath) + "_backup.srt");

            var result = MessageBox.Show(
                $"現在の字幕遅延 {subDelaySeconds:0.###} 秒を\n" +
                $"{fileName} に書き込みます。\n\n" +
                $"元ファイルは\n{Path.GetFileName(backupPath)}\n" +
                $"として保存されます。\n\n続行しますか？",
                "字幕時間を書き込み",
                MessageBoxButtons.YesNo,
                MessageBoxIcon.Question);

            if (result != DialogResult.Yes)
                return false;

            string originalText = File.ReadAllText(srtPath);
            if (!File.Exists(backupPath) == false)
            {
                try
                {
                    // 元字幕をバックアップ
                    File.WriteAllText(backupPath, originalText);


                }
                catch (Exception ex)
                {
                    error.write_error_log(ex.Message + ex.StackTrace);
                    Debug.WriteLine(ex.Message + ex.StackTrace);

                }
            }
            int shiftMs = (int)(subDelaySeconds * 1000);

            string shiftedText = Regex.Replace(
                originalText,
                @"(\d{2}:\d{2}:\d{2},\d{3})\s*-->\s*(\d{2}:\d{2}:\d{2},\d{3})",
                match =>
                {
                    TimeSpan start = ParseSrtTime(match.Groups[1].Value);
                    TimeSpan end = ParseSrtTime(match.Groups[2].Value);

                    start = start.Add(TimeSpan.FromMilliseconds(shiftMs));
                    end = end.Add(TimeSpan.FromMilliseconds(shiftMs));

                    if (start < TimeSpan.Zero) start = TimeSpan.Zero;
                    if (end < TimeSpan.Zero) end = TimeSpan.Zero;

                    return $"{ToSrtTime(start)} --> {ToSrtTime(end)}";
                });
            try
            {
                // 元ファイルへ上書き
                File.WriteAllText(srtPath, shiftedText);
            }
            catch (Exception ex)
            {
                error.write_error_log(ex.Message + ex.StackTrace);
                Debug.WriteLine(ex.Message + ex.StackTrace);

            }

            return true;
        }

        private static TimeSpan ParseSrtTime(string s)
        {
            return TimeSpan.ParseExact(
                s.Replace(',', '.'),
                @"hh\:mm\:ss\.fff",
                CultureInfo.InvariantCulture);
        }

        private static string ToSrtTime(TimeSpan ts)
        {
            return $"{(int)ts.TotalHours:00}:{ts.Minutes:00}:{ts.Seconds:00},{ts.Milliseconds:000}";
        }
    }
}