using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms;

namespace MesWork.Pages
{
    /// <summary>
    /// 工具标定页面 — 按工位和重量范围维护分段标定公式。
    /// 对应存储过程：工具管理_分页查询、工具管理_增加、工具管理_编辑、工具管理_删除
    /// </summary>
    public partial class UC_ToolMgmt : UserControl
    {
        private const string SEARCH_HINT = "输入工位号或工具名称搜索...";
        private PagerBar _pager;

        public UC_ToolMgmt()
        {
            InitializeComponent();
            InitColumns();
            _pager = new PagerBar();
            _pager.PageChanged += (s, e) => LoadData(txt_Search.Text == SEARCH_HINT ? "" : txt_Search.Text.Trim());
            this.Controls.Remove(pnl_StatusBar);
            this.Controls.Add(_pager);
            this.Controls.SetChildIndex(_pager, this.Controls.Count - 2);
        }

        /// <summary>
        /// 预设表格列（确保无数据时也能看到表头结构）
        /// </summary>
        private void InitColumns()
        {
            dgv_Data.AutoGenerateColumns = false;
            dgv_Data.Columns.Clear();
            dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "ID", HeaderText = "ID", DataPropertyName = "ID", Visible = false });
            dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "工位号", HeaderText = "工位号", DataPropertyName = "工位号", FillWeight = 70 });
            dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "工具名称", HeaderText = "工具名称", DataPropertyName = "工具名称", FillWeight = 120 });
            dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "最小重量", HeaderText = "最小重量(KG)", DataPropertyName = "最小重量", FillWeight = 80 });
            dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "最大重量", HeaderText = "最大重量(KG)", DataPropertyName = "最大重量", FillWeight = 80 });
            dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "计算公式", HeaderText = "计算公式", DataPropertyName = "计算公式", FillWeight = 150 });
            dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "说明", HeaderText = "说明", DataPropertyName = "说明", FillWeight = 180 });
            dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "创建时间", HeaderText = "创建时间", DataPropertyName = "创建时间", FillWeight = 100 });
            dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "修改时间", HeaderText = "修改时间", DataPropertyName = "修改时间", FillWeight = 100 });
        }

        public void LoadData(string keyword = "")
        {
            try
            {
                var (pageCountParam, itemCountParam) = PagerBar.CreateOutputParams();
                var parms = new SqlParameter[]
                {
                    new SqlParameter("@工具名称", keyword ?? ""),
                    new SqlParameter("@PageCurrent", _pager.CurrentPage),
                    new SqlParameter("@PageSize", _pager.PageSize),
                    pageCountParam,
                    itemCountParam
                };
                SqlOperation.ExecuteStoredProcedure("工具管理_分页查询", parms, out DataTable dt, out string err);
                if (dt != null) dgv_Data.DataSource = dt;
                _pager.UpdateState(pageCountParam, itemCountParam);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"查询失败：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // ── 搜索框交互 ──
        private void txt_Search_GotFocus(object sender, EventArgs e) { CrudHelper.SearchBox_GotFocus(txt_Search, SEARCH_HINT); }
        private void txt_Search_LostFocus(object sender, EventArgs e) { CrudHelper.SearchBox_LostFocus(txt_Search, SEARCH_HINT); }
        private void txt_Search_KeyDown(object sender, KeyEventArgs e) { if (CrudHelper.SearchBox_KeyDown(e)) btn_Search_Click(sender, e); }

        // ── 按钮事件 ──
        private void btn_Search_Click(object sender, EventArgs e) { _pager.ResetPage(); LoadData(txt_Search.Text == SEARCH_HINT ? "" : txt_Search.Text.Trim()); }
        private void btn_Add_Click(object sender, EventArgs e) => ShowEditDialog(null);
        private void btn_Edit_Click(object sender, EventArgs e)
        {
            if (dgv_Data.CurrentRow != null) ShowEditDialog(dgv_Data.CurrentRow);
            else MessageBox.Show("请先选择一条记录", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        private void btn_Delete_Click(object sender, EventArgs e)
        {
            if (dgv_Data.CurrentRow == null) { MessageBox.Show("请先选择一条记录", "提示"); return; }
            string station = dgv_Data.CurrentRow.Cells["工位号"]?.Value?.ToString() ?? "";
            string range = $"{dgv_Data.CurrentRow.Cells["最小重量"]?.Value}-{dgv_Data.CurrentRow.Cells["最大重量"]?.Value}";
            if (MessageBox.Show($"确认删除「{station}」重量范围 {range} 的标定公式？", "确认删除", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK)
            {
                try
                {
                    var parms = new SqlParameter[] { new SqlParameter("@ID", int.Parse(dgv_Data.CurrentRow.Cells["ID"]?.Value?.ToString() ?? "0")) };
                    SqlOperation.ExecuteStoredProcedure("工具管理_删除", parms, out string err);
                    WeightCalibrationHelper.ClearCache();
                    LoadData();
                }
                catch (Exception ex) { MessageBox.Show($"删除失败：{ex.Message}"); }
            }
        }
        private void btn_Refresh_Click(object sender, EventArgs e) { _pager.ResetPage(); LoadData(""); }
        private void dgv_Data_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex >= 0) btn_Edit_Click(sender, e); }

        /// <summary>
        /// 新增/修改弹窗
        /// </summary>
        private void ShowEditDialog(DataGridViewRow row)
        {
            bool isEdit = row != null;

            using (var dlg = CrudHelper.CreateEditDialog(isEdit ? "修改分段标定" : "新增分段标定", 560, 430))
            {
                int y = 20;
                var cmbStation = AddStationComboField(dlg, "工位号：", ref y, isEdit ? row.Cells["工位号"]?.Value?.ToString() : "");
                var txtName = CrudHelper.AddTextField(dlg, "工具名称：", ref y, isEdit ? row.Cells["工具名称"]?.Value?.ToString() : "", inputWidth: 360);
                var txtMinWeight = CrudHelper.AddTextField(dlg, "最小重量：", ref y, isEdit ? row.Cells["最小重量"]?.Value?.ToString() : "0", inputWidth: 360);
                var txtMaxWeight = CrudHelper.AddTextField(dlg, "最大重量：", ref y, isEdit ? row.Cells["最大重量"]?.Value?.ToString() : "", inputWidth: 360);
                var txtFormula = CrudHelper.AddTextField(dlg, "计算公式：", ref y, isEdit ? row.Cells["计算公式"]?.Value?.ToString() : "x", inputWidth: 360);
                var txtDesc = CrudHelper.AddTextField(dlg, "说明：", ref y, isEdit ? row.Cells["说明"]?.Value?.ToString() : "X为重量结果值，可对重量进行科学标定", inputWidth: 360);
                CrudHelper.AddDialogButtons(dlg, ref y);

                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    try
                    {
                        string station = cmbStation.Text.Trim();
                        if (string.IsNullOrWhiteSpace(station))
                        {
                            MessageBox.Show("工位号不能为空", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            return;
                        }
                        if (!decimal.TryParse(txtMinWeight.Text.Trim(), out decimal minWeight) ||
                            !decimal.TryParse(txtMaxWeight.Text.Trim(), out decimal maxWeight))
                        {
                            MessageBox.Show("最小重量和最大重量必须是数字", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            return;
                        }
                        if (minWeight >= maxWeight)
                        {
                            MessageBox.Show("最小重量必须小于最大重量", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            return;
                        }
                        if (!WeightCalibrationHelper.ValidateFormula(txtFormula.Text.Trim(), out string formulaMsg))
                        {
                            MessageBox.Show(formulaMsg, "公式错误", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            return;
                        }

                        string sp = isEdit ? "工具管理_编辑" : "工具管理_增加";
                        var pList = new System.Collections.Generic.List<SqlParameter>
                        {
                            new SqlParameter("@工位号", station),
                            new SqlParameter("@工具名称", txtName.Text.Trim()),
                            new SqlParameter("@最小重量", minWeight),
                            new SqlParameter("@最大重量", maxWeight),
                            new SqlParameter("@计算公式", txtFormula.Text.Trim()),
                            new SqlParameter("@说明", txtDesc.Text.Trim()),
                        };
                        if (isEdit) pList.Insert(0, new SqlParameter("@ID", int.Parse(row.Cells["ID"]?.Value?.ToString() ?? "0")));
                        SqlOperation.ExecuteStoredProcedure(sp, pList.ToArray(), out DataTable dt, out string err);
                        if (dt != null && dt.Rows.Count > 0 && dt.Rows[0]["result"].ToString() != "1")
                        {
                            MessageBox.Show(dt.Rows[0]["msg"].ToString(), "保存失败", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            return;
                        }
                        WeightCalibrationHelper.ClearCache();
                        LoadData();
                    }
                    catch (Exception ex) { MessageBox.Show($"保存失败：{ex.Message}"); }
                }
            }
        }

        private void btn_Export_Click(object sender, EventArgs e)
        {
            CrudHelper.ExportToExcel("工具标定", "工具标定", () =>
            {
                string keyword = CrudHelper.GetSearchKeyword(txt_Search, SEARCH_HINT);
                var (pageCountParam, itemCountParam) = PagerBar.CreateOutputParams();
                var parms = new SqlParameter[]
                {
                    new SqlParameter("@工具名称", keyword),
                    new SqlParameter("@PageCurrent", 1),
                    new SqlParameter("@PageSize", 9999999),
                    pageCountParam, itemCountParam
                };
                SqlOperation.ExecuteStoredProcedure("工具管理_分页查询", parms, out DataTable dt, out string err);
                return dt;
            }, dgv_Data.Rows.Count > 0);
        }

        protected override void OnVisibleChanged(EventArgs e) { base.OnVisibleChanged(e); if (Visible && dgv_Data.DataSource == null) LoadData(); }

        private ComboBox AddStationComboField(Form dlg, string label, ref int y, string selected)
        {
            dlg.Controls.Add(new Label { Text = label, Location = new Point(30, y + 4), AutoSize = true });
            var cmb = new ComboBox
            {
                Location = new Point(130, y),
                Size = new Size(360, 28),
                DropDownStyle = ComboBoxStyle.DropDown
            };

            foreach (string opName in MesWorkForm.StationOpNames)
            {
                if (!string.IsNullOrWhiteSpace(opName) && !cmb.Items.Contains(opName))
                    cmb.Items.Add(opName);
            }

            cmb.Text = selected ?? "";
            dlg.Controls.Add(cmb);
            y += 42;
            return cmb;
        }
    }
}
