using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

using System.Xml;
using System.IO; // Giữ lại vì Application.StartupPath và có thể dùng cho Path.Combine trong backgroundWorker
using System.Text; // Giữ lại nếu có xử lý Encoding khác, nhưng ConfigManager đã lo UTF8
using System.Configuration;
using System.Data.SqlClient;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

// Đảm bảo ConfigManager có thể được truy cập, ví dụ nếu nó cùng namespace
// hoặc bạn đã thêm 'using ABC.KetNoi;' (nếu ConfigManager ở namespace đó)
// Tuy nhiên, nếu ConfigManager.cs cũng có "namespace ABC.KetNoi", thì không cần thêm using đặc biệt.

namespace ABC.KetNoi
{
    public partial class CauHinh_Form : DevExpress.XtraEditors.XtraForm
    {
        public CauHinh_Form()
        {
            InitializeComponent();
            Form.CheckForIllegalCrossThreadCalls = false;
        }

        #region button ok
        void simpleButton_ok_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Bạn có chắc chắn muốn lưu không?", "Thông báo!", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                // Tạo một đối tượng ConfigData từ các TextBox trên form
                var config = new ConfigManager.ConfigData
                {
                    Server = txtServer.Text.Trim(),
                    User = txtTKSQL.Text.Trim(),
                    Pass = txtMKSQL.Text.Trim(),
                    Database = txtdatabase.Text.Trim(),
                    NameSoft = txttenpm.Text.Trim(), // Lấy từ TextBox tương ứng

                    // Các giá trị Fordel được ConfigManager.ConfigData() khởi tạo mặc định là "C:\\"
                    // Nếu bạn có UI để thay đổi chúng, hãy lấy giá trị từ UI ở đây.
                    // Ví dụ: FordelPdf1 = txtDuongDanPdf1.Text.Trim(),
                    // Nếu không, chúng sẽ giữ giá trị mặc định từ constructor của ConfigData khi lưu.
                    // Để chắc chắn, bạn có thể gán lại ở đây nếu muốn:
                    FordelPdf1 = "C:\\",
                    FordelPdf2 = "C:\\",
                    FordelBachup = "C:\\",
                    FordelStore = "C:\\",
                    FordelTemp = "C:\\",

                    GmailTk = txtTK.Text.Trim(),
                    GmailMk = txtMK.Text.Trim(),
                    GmailTieude = txtTieuDe.Text.Trim(),
                    GmailNoidung = txtNoidung.Text.Trim(),

                    DataGNToa = "" // Hoặc txtDataGNToa.Text.Trim() nếu có TextBox cho nó
                                   // ConfigManager.ConfigData() cũng khởi tạo là ""
                };

                // Sử dụng ConfigManager để lưu cấu hình
                if (ConfigManager.SaveConfiguration(config))
                {
                    // ConfigManager.SaveConfiguration đã có thể hiển thị MessageBox thành công/lỗi
                    // nên có thể không cần MessageBox thêm ở đây.
                }
                // else
                // {
                //     // Lỗi đã được ConfigManager thông báo
                // }

                this.Close(); // Đóng form sau khi lưu
            }
        }
        #endregion

        FolderBrowserDialog f = new FolderBrowserDialog();

        private void CauHinh_Form_Load(object sender, EventArgs e)
        {
            try
            {
                display();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi khi tải cấu hình: " + ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        #region hiển thị dữ liệu
        public void display()
        {
            // Sử dụng ConfigManager để tải cấu hình
            ConfigManager.ConfigData config = ConfigManager.LoadConfiguration();

            // Gán giá trị từ đối tượng config vào các TextBox
            txtServer.Text = config.Server;
            txtTKSQL.Text = config.User;
            txtMKSQL.Text = config.Pass;
            txtdatabase.Text = config.Database;
            txttenpm.Text = config.NameSoft;

            // Nếu có các TextBox cho đường dẫn Fordel, gán ở đây:
            // ví dụ: txtFordelPdf1UI.Text = config.FordelPdf1; 
            // (Hiện tại, các giá trị này không được hiển thị trên UI theo code gốc,
            // chúng được đọc từ file và ghi lại với giá trị mặc định hoặc giá trị đã lưu trước đó)

            txtTK.Text = config.GmailTk;
            txtMK.Text = config.GmailMk;
            txtTieuDe.Text = config.GmailTieude;
            txtNoidung.Text = config.GmailNoidung;

            // Nếu có TextBox cho DataGNToa:
            // txtDataTOA.Text = config.DataGNToa; 
            // (Trong code gốc, phần này được comment lại)
        }
        #endregion

        private void simpleButton1_Click(object sender, EventArgs e) // Nút này có thể là "Nâng cấp"
        {
            if (!backgroundWorker1.IsBusy)
            {
                // Có thể thêm một MessageBox xác nhận trước khi chạy nâng cấp ở đây nếu muốn
                // MessageBox.Show("Bắt đầu quá trình nâng cấp CSDL?", "Xác nhận", MessageBoxButtons.YesNo...);
                backgroundWorker1.RunWorkerAsync();
            }
            else
            {
                MessageBox.Show("Quá trình nâng cấp đang chạy, vui lòng đợi.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                // Sử dụng ConfigManager để tải cấu hình
                ConfigManager.ConfigData config = ConfigManager.LoadConfiguration();

                if (string.IsNullOrEmpty(config.Server) ||
                    string.IsNullOrEmpty(config.Database) ||
                    string.IsNullOrEmpty(config.User))
                {
                    e.Result = "Lỗi: Thông tin kết nối Server, Database, hoặc User không được để trống trong cấu hình.";
                    return;
                }

                string connectionString = string.Format("server={0};database={1};uid={2};pwd={3}",
                                               config.Server, config.Database, config.User, config.Pass);

                // Sử dụng using để đảm bảo SqlConnection được giải phóng
                using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(connectionString))
                {
                    // Server của SMO
                    Server smoServer = new Server(new ServerConnection(conn));

                    string delScriptPath = Path.Combine(Application.StartupPath, "update/del.txt");
                    if (System.IO.File.Exists(delScriptPath))
                    {
                        string delScriptContent = "";
                        using (StreamReader read2 = System.IO.File.OpenText(delScriptPath))
                        {
                            delScriptContent = read2.ReadToEnd();
                        } // StreamReader sẽ tự động đóng ở đây
                        if (!string.IsNullOrWhiteSpace(delScriptContent))
                        {
                            smoServer.ConnectionContext.ExecuteNonQuery(delScriptContent);
                        }
                    }
                    else
                    {
                        // Ghi log hoặc thông báo file del.txt không tồn tại nếu cần
                        Console.WriteLine("File update/del.txt không tìm thấy.");
                    }

                    string storeScriptPath = Path.Combine(Application.StartupPath, "update/store.txt");
                    if (System.IO.File.Exists(storeScriptPath))
                    {
                        string storeScriptContent = "";
                        using (StreamReader read = System.IO.File.OpenText(storeScriptPath))
                        {
                            storeScriptContent = read.ReadToEnd();
                        } // StreamReader sẽ tự động đóng ở đây
                        if (!string.IsNullOrWhiteSpace(storeScriptContent))
                        {
                            smoServer.ConnectionContext.ExecuteNonQuery(storeScriptContent);
                        }
                    }
                    else
                    {
                        // Ghi log hoặc thông báo file store.txt không tồn tại nếu cần
                        Console.WriteLine("File update/store.txt không tìm thấy.");
                    }
                } // SqlConnection sẽ tự động đóng ở đây
                e.Result = "Nâng cấp thành công! Vui lòng đăng nhập để sử dụng!";
            }
            catch (Exception ex)
            {
                e.Result = $"Lỗi trong quá trình nâng cấp: {ex.Message}";
            }
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            // Kiểm tra lỗi từ DoWork (nếu có)
            if (e.Error != null)
            {
                MessageBox.Show($"Lỗi không mong muốn trong quá trình nâng cấp: {e.Error.Message}", "Lỗi nâng cấp", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else if (e.Cancelled) // Nếu bạn có xử lý việc hủy BackgroundWorker
            {
                MessageBox.Show("Quá trình nâng cấp đã bị hủy.", "Đã hủy", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else if (e.Result != null) // Hiển thị kết quả từ DoWork
            {
                string message = e.Result.ToString();
                MessageBoxIcon icon = MessageBoxIcon.Information; // Mặc định là information

                if (message.StartsWith("Lỗi:"))
                {
                    icon = MessageBoxIcon.Error;
                }
                MessageBox.Show(message, "Kết quả nâng cấp", MessageBoxButtons.OK, icon);
            }
            // else: Không có kết quả hoặc lỗi cụ thể nào được đặt.
            // Có thể thêm một thông báo mặc định nếu e.Result là null và không có lỗi/cancel.
        }
    }
}