using System.IO;
using IniParser;
using IniParser.Model;

namespace DualScreenDemo
{
    public partial class PrimaryForm
    {
        // 拼音歌曲的 PictureBox
        private PictureBox pictureBoxPinYinSongs;
        // 存放拼音按鈕的陣列
        private Button[] letterButtonsForPinYinSongs;
        // 特殊功能按鈕（修改、清除、關閉）
        private Button modifyButtonPinYinSongs;
        private Button clearButtonPinYinSongs;
        private Button closeButtonPinYinSongs;
        // 用於顯示輸入文字的輸入框
        private RichTextBox inputBoxPinYinSongs;
        /// <summary>
        /// 拼音歌曲搜尋按鈕點擊事件
        /// </summary>
        private void PinyinSearchSongsButton_Click(object sender, EventArgs e)
        {
            // 更新搜尋模式按鈕的背景圖
            zhuyinSearchSongButton.BackgroundImage = zhuyinSearchSongNormalBackground;
            englishSearchSongButton.BackgroundImage = englishSearchSongNormalBackground;
            pinyinSearchSongButton.BackgroundImage = pinyinSearchSongActiveBackground;
            wordCountSearchSongButton.BackgroundImage = wordCountSearchSongNormalBackground;
            handWritingSearchSongButton.BackgroundImage = handWritingSearchSongNormalBackground;
            numberSearchSongButton.BackgroundImage = numberSearchSongNormalBackground;

            // 讀取 config.ini 並獲取拼音圖片的路徑
            var configData = LoadConfigData();
            string pinyinImagePath = Path.Combine(Application.StartupPath, configData["ImagePaths"]["PinYinSongs"]);
            // 顯示拼音歌曲圖片
            ShowImageOnPictureBoxPinYinSongs(Path.Combine(Application.StartupPath, pinyinImagePath));

            
            // 鍵盤UI介面顯示設定
            SetWordCountSongsAndButtonsVisibility(false);       
            SetEnglishSongsAndButtonsVisibility(false);
            SetPinYinSongsAndButtonsVisibility(true);
            SetHandWritingForSongsAndButtonsVisibility(false);
            SetSongIDSearchAndButtonsVisibility(false);                  
            SetZhuYinSongsAndButtonsVisibility(false);
            
            ResetinputBox();
            pictureBoxPinYinSongs.Visible = true;
        }
        /// <summary>
        /// 初始化拼音按鈕
        /// </summary>
        private void InitializeLetterButtonsForPinYinSongs()
        {
            // 從設定檔 (config.ini) 讀取配置數據
            var data = LoadConfigData();

            // 從配置數據中載入拼音字母按鈕的影像 (包含正常、點擊、滑鼠懸停三種狀態)
            var buttonImages = LoadButtonImages(data, "PinYinLetterButtonImages", 26);

            // 定義 QWERTY 鍵盤排列的字母順序
            string qwertyLayout = "QWERTYUIOPASDFGHJKLZXCVBNM";

            // 初始化拼音按鈕陣列，長度為 26（對應英文字母）
            letterButtonsForPinYinSongs = new Button[26];

            // 迴圈遍歷 26 個字母，依序建立按鈕
            for (int i = 0; i < 26; i++)
            {
                // 從配置檔案讀取當前按鈕的座標資訊 (X, Y, Width, Height)
                var coords = data["PinYinLetterButtonCoordinates"][$"button{i}"].Split(',');

                // 建立拼音按鈕，並設定名稱、座標、影像與事件處理函式
                letterButtonsForPinYinSongs[i] = CreateButton(
                    $"letterButton_{qwertyLayout[i]}", // 按鈕名稱，例如 "letterButton_Q"
                    (int.Parse(coords[0]), int.Parse(coords[1]), int.Parse(coords[2]), int.Parse(coords[3])), // 解析座標數據
                    buttonImages[$"button{i}"].normal,    // 正常狀態影像
                    buttonImages[$"button{i}"].mouseDown, // 按下狀態影像
                    buttonImages[$"button{i}"].mouseOver, // 滑鼠懸停狀態影像
                    LetterButtonPinYinSongs_Click        // 點擊事件處理函式
                );

                // 設定按鈕的標籤 (Tag) 為對應的字母，例如 Q、W、E...
                letterButtonsForPinYinSongs[i].Tag = qwertyLayout[i];

                // 將按鈕新增到表單的控制項集合中，讓其顯示在介面上
                this.Controls.Add(letterButtonsForPinYinSongs[i]);
            }
        }
        /// <summary>
        /// 處理拼音按鈕點擊事件
        /// </summary>
        /// <param name="sender">觸發事件按鈕</param>
        /// <param name="e">事件參數</param>
        private void LetterButtonPinYinSongs_Click(object sender, EventArgs e)
        {
            // 嘗試將觸發事件的物件轉換為 Button 類型
            var button = sender as Button;

            // 檢查按鈕是否為 null，並確保該按鈕的 Tag 屬性不為 null
            if (button != null && button.Tag != null)
            {
                // 確保輸入框 (inputBoxPinYinSongs) 是可見狀態
                if (inputBoxPinYinSongs.Visible)
                {
                    // 將按鈕的標籤 (Tag) 轉換為字串，並附加到輸入框的文字內容中
                    inputBoxPinYinSongs.Text += button.Tag.ToString();
                }
            }
        }

        /// <summary>
        /// 初始化拼音輸入相關的 UI 控件，包括字母按鈕、特殊功能按鈕（修改、清除、關閉），以及拼音輸入框。
        /// </summary>
        private void InitializeButtonsForPinYinSongs()
        {
            // 初始化拼音字母按鈕，根據 QWERTY 鍵盤佈局建立對應的按鈕
            InitializeLetterButtonsForPinYinSongs();

            // 初始化特殊功能按鈕（修改、清除、關閉）
            InitializeSpecialButtonsForPinYinSongs();

            // 初始化拼音輸入框，使用者可透過輸入拼音來搜尋歌曲
            InitializeInputBoxPinYinSongs();
        }

        /// <summary>
        /// 初始化拼音輸入的特殊功能按鈕，包括：
        /// <para>1. 修改按鈕 - 刪除輸入框中的最後一個字母</para>
        /// <para>2. 清除按鈕 - 清空輸入框的內容</para>
        /// <para>3. 關閉按鈕 - 隱藏拼音輸入的 UI 元件</para>
        /// </summary>
        private void InitializeSpecialButtonsForPinYinSongs()
        {
            // 初始化「修改」按鈕（刪除輸入框最後一個字母）
            InitializeModifyButtonPinYinSongs();

            // 初始化「清除」按鈕（清空輸入框內容）
            InitializeClearButtonPinYinSongs();

            // 初始化「關閉」按鈕（關閉拼音輸入 UI）
            InitializeCloseButtonPinYinSongs();
        }


        /// <summary>
        /// 初始化「修改」按鈕，提供刪除拼音輸入框最後一個字母的功能。
        /// </summary>
        private void InitializeModifyButtonPinYinSongs()
        {
            // 讀取設定檔，載入特殊按鈕的配置資料
            var data = LoadConfigData();

            // 從設定檔取得「修改按鈕」的座標與大小
            modifyButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "modifyButtonPinYinSongs");

            // 讀取「修改按鈕」的圖片資源（一般狀態、滑鼠懸停、按下）
            var buttonImages = LoadButtonImages(data, "ModifyButtonImagesPinYin");

            // 創建「修改」按鈕，並綁定點擊事件
            modifyButtonPinYinSongs = CreateSpecialButton(
                "btnModifyPinYinSongs",      // 按鈕名稱
                modifyButtonPinYinCoords,    // 設定按鈕的座標與大小
                buttonImages.normal,         // 設定按鈕的正常狀態圖片
                buttonImages.mouseOver,      // 設定按鈕的滑鼠懸停圖片
                buttonImages.mouseDown,      // 設定按鈕的按下狀態圖片
                ModifyButtonPinYinSongs_Click // 綁定按鈕的點擊事件處理函式
            );
        }

        /// <summary>
        /// 「修改」按鈕點擊事件：刪除拼音輸入框 (inputBoxPinYinSongs) 中的最後一個字母。
        /// </summary>
        private void ModifyButtonPinYinSongs_Click(object sender, EventArgs e)
        {
            // 確保 inputBoxPinYinSongs 存在於視窗控制項集合內，且輸入框內有文字
            if (this.Controls.Contains(inputBoxPinYinSongs) && inputBoxPinYinSongs.Text.Length > 0)
            {
                // 刪除輸入框內的最後一個字母
                inputBoxPinYinSongs.Text = inputBoxPinYinSongs.Text.Substring(0, inputBoxPinYinSongs.Text.Length - 1);
            }
        }


        /// <summary>
        /// 初始化「清除」按鈕 (clearButtonPinYinSongs)，用於清空拼音輸入框 (inputBoxPinYinSongs)。
        /// </summary>
        private void InitializeClearButtonPinYinSongs()
        {
            // 從設定檔載入資料
            var data = LoadConfigData();

            // 讀取「清除」按鈕的座標配置 (X, Y, Width, Height)
            clearButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "clearButtonPinYinSongs");

            // 載入「清除」按鈕的圖片 (一般狀態、滑鼠懸停、按下時的圖片)
            var buttonImages = LoadButtonImages(data, "ClearButtonImagesPinYin");

            // 建立「清除」按鈕，設定對應的座標與圖片，並綁定點擊事件
            clearButtonPinYinSongs = CreateSpecialButton(
                "btnClearPinYinSongs",              // 按鈕名稱
                clearButtonPinYinCoords,            // 設定按鈕的座標與大小
                buttonImages.normal,                // 設定按鈕的正常狀態圖片
                buttonImages.mouseOver,             // 設定按鈕的滑鼠懸停圖片
                buttonImages.mouseDown,             // 設定按鈕的按下狀態圖片
                ClearButtonPinYinSongs_Click        // 綁定按鈕的點擊事件處理函式
            );
        }

        /// <summary>
        /// 清空拼音輸入框的內容。
        /// 當使用者點擊清除按鈕時，若輸入框存在且有內容，則將其清空。
        /// </summary>
        private void ClearButtonPinYinSongs_Click(object sender, EventArgs e)
        {            
            // 檢查視窗內是否包含 inputBoxPinYinSongs 控制項，且輸入框內是否有文字
            if (this.Controls.Contains(inputBoxPinYinSongs) && inputBoxPinYinSongs.Text.Length > 0)
            {
                // 清空拼音輸入框的內容
                inputBoxPinYinSongs.Text = "";
            }
        }

        /// <summary>
        /// 初始化「關閉」按鈕 (closeButtonPinYinSongs)，用於隱藏拼音輸入介面。
        /// </summary>
        private void InitializeCloseButtonPinYinSongs()
        {
            // 讀取設定檔中的按鈕配置數據
            var data = LoadConfigData();
            
            // 從設定檔中取得「關閉」按鈕的座標 (X, Y, Width, Height)
            closeButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "closeButtonPinYinSongs");

            // 從設定檔中讀取「關閉」按鈕的圖片 (一般狀態、滑鼠懸停、按下時的圖片)
            var buttonImages = LoadButtonImages(data, "CloseButtonImagesPinYin");

            // 建立「關閉」按鈕，設定名稱、座標、圖片及點擊事件
            closeButtonPinYinSongs = CreateSpecialButton(
                "btnClosePinYinSongs",      // 按鈕名稱
                closeButtonPinYinCoords,    // 設定按鈕的座標與大小
                buttonImages.normal,        // 設定按鈕的正常狀態圖片
                buttonImages.mouseOver,     // 設定按鈕的滑鼠懸停圖片
                buttonImages.mouseDown,     // 設定按鈕的按下狀態圖片
                CloseButtonPinYinSongs_Click  // 綁定按鈕的點擊事件處理函式
            );
        }

        /// <summary>
        /// 關閉拼音輸入模式，隱藏相關 UI 元件。
        /// </summary>
        /// <param name="sender">觸發事件的按鈕。</param>
        /// <param name="e">事件參數。</param>
        private void CloseButtonPinYinSongs_Click(object sender, EventArgs e)
        {
            // 隱藏拼音輸入的背景圖片 (可能是 UI 中的輸入框背景)
            pictureBoxPinYinSongs.Visible = false;
            pinyinSearchSongButton.BackgroundImage = pinyinSearchSongNormalBackground;
            // 設定拼音輸入框與所有相關按鈕的可見性為 false
            SetPinYinSongsAndButtonsVisibility(false);
            FindPinYinSongs();

        }
        private void FindPinYinSongs(){
            string searchText = inputBoxPinYinSongs.Text;
            // 在這裡添加搜尋歌曲的邏輯
            // 例如：根據輸入框的內容搜尋歌曲
            string query = string.IsNullOrWhiteSpace(searchText)
                ? "SELECT * FROM song_library_cache ORDER BY song_id DESC LIMIT 200;"
                : $"SELECT * FROM song_library_cache WHERE pinyin_abbr LIKE '{searchText}%' ORDER BY `song_id` DESC;";
            var searchResults = SearchSongs_Mysql(query);              
            // 重置分頁    
            currentPage = 0;
            totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage);
            // 更新多頁面面板的內容
            multiPagePanel.currentPageIndex = 0;
            multiPagePanel.LoadSongs(searchResults);
        }
        /// <summary>
        /// 初始化拼音輸入框 (RichTextBox)，並從 config.ini 讀取相關設定。
        /// </summary>
        private void InitializeInputBoxPinYinSongs()
        {
            try
            {
                // 創建一個 INI 檔案解析器
                var parser = new FileIniDataParser();
                
                // 配置解析器的參數
                parser.Parser.Configuration.AssigmentSpacer = "";  // 設定 = 兩側沒有空格
                parser.Parser.Configuration.CommentString = "#";   // 使用 # 作為註解符號
                parser.Parser.Configuration.CaseInsensitive = true; // 參數名稱不區分大小寫

                IniData data; // 儲存解析後的 INI 數據
                
                // 讀取 config.ini 文件，使用 UTF-8 編碼
                using (var reader = new StreamReader("config.ini", System.Text.Encoding.UTF8))
                {
                    data = parser.ReadData(reader);
                }

                // **從 INI 檔案讀取拼音輸入框的位置與大小**
                int x = int.Parse(data["InputBoxPinYinSongs"]["X"]);          // X 座標
                int y = int.Parse(data["InputBoxPinYinSongs"]["Y"]);          // Y 座標
                int width = int.Parse(data["InputBoxPinYinSongs"]["Width"]);  // 寬度
                int height = int.Parse(data["InputBoxPinYinSongs"]["Height"]); // 高度

                // **讀取字型設定**
                string fontName = data["InputBoxPinYinSongs"]["FontName"];    // 字型名稱
                float fontSize = float.Parse(data["InputBoxPinYinSongs"]["FontSize"]); // 字體大小
                FontStyle fontStyle = (FontStyle)Enum.Parse(typeof(FontStyle), data["InputBoxPinYinSongs"]["FontStyle"]); // 字體樣式
                Color foreColor = Color.FromName(data["InputBoxPinYinSongs"]["ForeColor"]); // 文字顏色

                // 創建拼音輸入框 (RichTextBox)
                inputBoxPinYinSongs = new RichTextBox
                {
                    Visible = false, // 預設為隱藏
                    Name = "inputBoxPinYinSongs", // 設定控制項名稱
                    ForeColor = foreColor, // 設定文字顏色
                    Font = new Font(
                        fontName, 
                        fontSize / 900 * Screen.PrimaryScreen.Bounds.Height, // 根據螢幕大小調整字體
                        fontStyle
                    )
                };

                // 設定輸入框的位置與大小
                ResizeAndPositionControl(inputBoxPinYinSongs, x, y, width, height);

                // **綁定 TextChanged 事件 (當輸入內容改變時觸發搜尋)**
                /*inputBoxPinYinSongs.TextChanged += (sender, e) =>
                {
                    string searchText = inputBoxPinYinSongs.Text;

                    // 根據拼音前綴篩選歌曲
                    var searchResults = allSongs.Where(song => song.PinyinNotation.StartsWith(searchText)).ToList();

                    currentPage = 0; // 重置當前頁面索引
                    currentSongList = searchResults; // 更新搜尋結果
                    totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage); // 計算總頁數

                    // 更新 UI，顯示搜尋結果
                    multiPagePanel.currentPageIndex = 0;
                    multiPagePanel.LoadSongs(currentSongList);
                };*/

                // 將拼音輸入框加入視窗中
                this.Controls.Add(inputBoxPinYinSongs);
            }
            catch (Exception ex)
            {
                // 發生錯誤時輸出錯誤訊息 (避免程式崩潰)
                Console.WriteLine($"An error occurred: {ex.Message}");
            }
        }
        /// <summary>
        /// 存儲 PictureBoxPinYinSongs 的座標與尺寸信息。
        /// </summary>
        /// <remarks>
        /// 此元組包含以下四個值：
        ///   X：X 座標
        /// , Y：Y 座標
        /// , Width：寬度
        /// , Height：高度
        /// </remarks>
        private (int X, int Y, int Width, int Height) pictureBoxPinYinSongCoords;

        /// <summary>
        /// 從 config.ini 配置檔案中載入 PictureBoxPinYinSongs 的座標與尺寸設定。
        /// </summary>
        private void LoadPictureBoxPinYinSongCoordsFromConfig()
        {
            // 創建一個 INI 檔案解析器
            var parser = new FileIniDataParser();

            // 讀取 config.ini 文件並解析成 IniData 對象
            string iniPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.ini");
            IniData data = parser.ReadFile(iniPath);


            // 取得 PictureBoxPinYinSongs 區段的設定值
            var coords = data["PictureBoxPinYinSongs"];

            // 解析 X, Y, Width, Height，並存入 pictureBoxPinYinSongCoords
            pictureBoxPinYinSongCoords = (
                int.Parse(coords["X"]),      // 解析 X 座標
                int.Parse(coords["Y"]),      // 解析 Y 座標
                int.Parse(coords["Width"]),  // 解析 寬度
                int.Parse(coords["Height"])  // 解析 高度
            );
        }
        /// <summary>
        /// 顯示拼音歌曲圖片
        /// </summary> 
        /// <param name="imagePath">圖片路徑</param>
        private void ShowImageOnPictureBoxPinYinSongs(string imagePath)
        {
                // 從設定檔載入 PictureBox 的座標與大小
                LoadPictureBoxPinYinSongCoordsFromConfig();

                // 使用指定的圖片路徑建立 Bitmap 影像
                Bitmap originalImage = new Bitmap(imagePath);

                // 建立一個矩形，表示 PictureBox 應該顯示的範圍
                Rectangle displayArea = new Rectangle(
                    pictureBoxPinYinSongCoords.X,      // 設定 X 座標
                    pictureBoxPinYinSongCoords.Y,      // 設定 Y 座標
                    pictureBoxPinYinSongCoords.Width,  // 設定 寬度
                    pictureBoxPinYinSongCoords.Height  // 設定 高度
                );

                // 將載入的圖片設定為 pictureBoxPinYinSongs 的影像
                pictureBoxPinYinSongs.Image = originalImage;

                // 調整 PictureBox 的大小與位置，使其符合 displayArea 的設定
                ResizeAndPositionPictureBox(
                    pictureBoxPinYinSongs, 
                    displayArea.X, 
                    displayArea.Y, 
                    displayArea.Width, 
                    displayArea.Height
                );

                // 顯示 PictureBox
                pictureBoxPinYinSongs.Visible = true;

        }
        /// <summary>
        /// 設定拼音模式的 UI 是否可見
        /// </summary>
        /// <param name="isVisible">是否可見</param>
        private void SetPinYinSongsAndButtonsVisibility(bool isVisible)
        {
            // 定義一個委派 (Action)，用於更新 UI 控件的可見性
            System.Action action = () =>
            {
                // 暫停佈局更新，以防止 UI 閃爍或重繪時出現異常
                SuspendLayout();

                // 設定 pictureBoxPinYinSongs 的可見性
                pictureBoxPinYinSongs.Visible = isVisible;
                if (isVisible) pictureBoxPinYinSongs.BringToFront(); // 確保顯示時位於最前方

                // 設定所有拼音字母按鈕的可見性
                foreach (var button in letterButtonsForPinYinSongs)
                {
                    button.Visible = isVisible;
                    if (isVisible) button.BringToFront();
                }

                // 設定 modifyButtonPinYinSongs (修改按鈕) 的可見性
                if (modifyButtonPinYinSongs != null)
                {
                    modifyButtonPinYinSongs.Visible = isVisible;
                    if (isVisible) modifyButtonPinYinSongs.BringToFront();
                }

                // 設定 clearButtonPinYinSongs (清除按鈕) 的可見性
                if (clearButtonPinYinSongs != null)
                {
                    clearButtonPinYinSongs.Visible = isVisible;
                    if (isVisible) clearButtonPinYinSongs.BringToFront();
                }

                // 設定 closeButtonPinYinSongs (關閉按鈕) 的可見性
                closeButtonPinYinSongs.Visible = isVisible;
                if (isVisible) closeButtonPinYinSongs.BringToFront();

                // 設定 inputBoxPinYinSongs (輸入框) 的可見性
                inputBoxPinYinSongs.Visible = isVisible;
                if (isVisible) inputBoxPinYinSongs.BringToFront();

                // 恢復佈局，允許 UI 更新
                ResumeLayout();
                PerformLayout(); 

                // 刷新 pictureBoxPinYinSongs，確保畫面更新
                pictureBoxPinYinSongs.Refresh();

                // 刷新拼音字母按鈕
                foreach (var button in letterButtonsForPinYinSongs)
                {
                    button.Refresh();
                }

                // 刷新其他按鈕與輸入框
                modifyButtonPinYinSongs.Refresh();
                clearButtonPinYinSongs.Refresh();
                closeButtonPinYinSongs.Refresh();
                inputBoxPinYinSongs.Refresh();
            };

            // 如果當前執行緒不是 UI 執行緒，則使用 Invoke 確保執行於 UI 執行緒
            if (this.InvokeRequired)
            {
                this.Invoke(action);
            }
            else
            {
                action();
            }

        }
    }
}