using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using TeamAAS.Database.Services;
namespace TeamAAS.Database.UI
{
///
/// 默认数据库「配置/调试页」(对齐 Camera 的 DefaultCameraDebugPage):绑定「当前产品」的 ProductDatabase,
/// 展示连接信息、可编辑数据库文件/服务器、初始化建表、测试连接、浏览表与行数。
/// 未在 [DatabaseProvider] 上指定 ConfigPageType 的提供者都用本页;提供者专属字段由其自己的页扩展。
/// 操作类通知复用主程序 DialogHelper;页面不本地合并 HC 皮肤,颜色走 DynamicResource 跟随主题。
///
public partial class DefaultDatabaseConfigPage : UserControl, IDatabaseConfigPage
{
private static readonly Brush ConnectedBrush = Freeze(0x4C, 0xAF, 0x50); // 绿=已连接
private static readonly Brush IdleBrush = Freeze(0x9E, 0x9E, 0x9E); // 灰=未连接
private ProductDatabase _db;
public DefaultDatabaseConfigPage()
{
InitializeComponent();
}
/// 当前绑定的产品数据库实例。
public ProductDatabase Database => _db;
public void BindDatabase(ProductDatabase database)
{
_db = database;
bool has = _db != null;
BtnInit.IsEnabled = has;
BtnTest.IsEnabled = has;
BtnSave.IsEnabled = has;
RefreshHeader();
RefreshTables();
}
public void UnbindDatabase()
{
_db = null;
TxtProduct.Text = "-";
TxtProvider.Text = "-";
TxtServer.Text = "";
TxtStatus.Text = "未绑定";
StatusDot.Background = IdleBrush;
TableList.Items.Clear();
}
private void RefreshHeader()
{
if (_db == null) { UnbindDatabase(); return; }
TxtProduct.Text = string.IsNullOrEmpty(_db.ProductName) ? "-" : _db.ProductName;
TxtProvider.Text = (_db.Config?.ProviderType ?? "sqlite").ToUpperInvariant();
TxtServer.Text = _db.Config?.Server ?? "";
bool connected = _db.IsConnected;
TxtStatus.Text = connected ? "已连接" : "未连接";
StatusDot.Background = connected ? ConnectedBrush : IdleBrush;
}
private void RefreshTables()
{
TableList.Items.Clear();
if (_db?.Database == null) return;
if (!_db.IsConnected)
{
TableList.Items.Add("(未连接 — 点「初始化/建表」或「测试连接」)");
return;
}
try
{
foreach (var name in _db.Database.GetTableNames())
{
long count = -1;
try
{
var scalar = _db.Database.ExecuteScalar($"SELECT COUNT(*) FROM [{name}]");
if (scalar != null && scalar != DBNull.Value)
count = Convert.ToInt64(scalar);
}
catch { /* 单表计数失败不影响列表 */ }
TableList.Items.Add(count >= 0 ? $"{name} ({count} 行)" : name);
}
}
catch (Exception ex)
{
TableList.Items.Add($"读取表失败:{ex.Message}");
}
}
private void BtnInit_Click(object sender, RoutedEventArgs e)
{
if (_db == null) { DialogHelper.ShowWarning("未绑定产品数据库"); return; }
var r = _db.Initialize();
RefreshHeader();
RefreshTables();
if (r.Success) DialogHelper.Success(r.Message);
else DialogHelper.ShowError(r.Message);
}
private void BtnTest_Click(object sender, RoutedEventArgs e)
{
if (_db?.Database == null) { DialogHelper.ShowWarning("未绑定产品数据库"); return; }
var r = _db.Database.TestConnection();
RefreshHeader();
if (r.Success) DialogHelper.Success(r.Message);
else DialogHelper.ShowError(r.Message);
}
private void BtnRefresh_Click(object sender, RoutedEventArgs e)
{
RefreshHeader();
RefreshTables();
}
private void BtnSave_Click(object sender, RoutedEventArgs e)
{
if (_db?.Config == null) { DialogHelper.ShowWarning("未绑定产品数据库"); return; }
_db.Config.Server = TxtServer.Text?.Trim();
if (ProductDatabaseManager.SaveConfig(_db.ProductName, _db.Config))
{
// 重建实例让新配置立即生效,并重新绑定本页
BindDatabase(ProductDatabaseManager.Recreate(_db.ProductName));
DialogHelper.Success("配置已保存并生效");
}
else
{
DialogHelper.ShowError("配置保存失败(详见日志)");
}
}
private static Brush Freeze(byte r, byte g, byte b)
{
var brush = new SolidColorBrush(Color.FromRgb(r, g, b));
brush.Freeze();
return brush;
}
}
}