using Grpc.Net.Client;
using HotelPms.Client.Blazor.Util;
using HotelPms.Data.Master;
using HotelPms.DataAccessGrpc.Client;
using HotelPms.Share.Util;
using Microsoft.VisualBasic;
using MudBlazor;
using System.Collections.Concurrent;
using System.Data;
using System.Text;
using System.Threading.Channels;
using static MudBlazor.CategoryTypes;
using static System.Net.Mime.MediaTypeNames;
namespace HotelPms.Client.Blazor.Models
{
///
/// 客室状況を持つデータ
///
public class RoomViewData
{
///
/// 現在選択されているTabのインデックス
///
public int ActiveTabIndex { get; set; } = 0;
///
/// 全部行数
///
public int RowCount { get; set; } = 0;
///
/// 全部列数
///
public int ColCount { get; set; } = 0;
///
/// 部屋タブ一覧
///
public List Tabs { get; set; } = new List();
///
/// 選択されているタブのレイアウトデータ
/// 行⇒列
///
public List> Data { get; set; } = new List>();
///
/// 現在のセルレイアウト
///
public List Cells { get; set; } = new List();
///
/// Tab毎のレイアウトを持つ
/// M_RoomCellを編集されたら、SignalRより受信し、更新される
///
public ConcurrentDictionary> CellsBuffer = new ConcurrentDictionary>();
///
/// 部屋ID, 部屋属性データ
///
public Dictionary RoomData = new Dictionary();
///
/// 部屋ID, [SortKey, 利用データ]
///
public Dictionary> UseData = new Dictionary>();
///
/// メニュー
///
public RoomViewMenu Menu = new RoomViewMenu();
///
/// 現在の利用日
///
public DateTime UseDate { get; set; } = DateTime.Today;
public RoomViewData()
{
}
///
/// 表示Tabのデータクリア
///
private void Clear()
{
Data.Clear();
RoomData.Clear();
UseData.Clear();
RowCount = 0;
ColCount = 0;
}
///
/// 客室状況画面初期化
///
///
public async Task Init()
{
using RoomViewLayoutAccess access = new RoomViewLayoutAccess(EnvironmentSetting.GrpcChannel);
using DataSet ds = await access.GetRoomViewData($"NULL,0,1");
//データを取得してから、クリア:データを取得時、画面再表示されないように
Clear();
//レイアウトデータ
SetLayoutData(ds.Tables[0]);
//部屋状態・属性
SetRoomData(ds.Tables[1]);
//部屋の利用データ
SetUseData(ds.Tables[2]);
//レイアウト
SetRoomCell(ds.Tables[3]);
//ホテル日
UseDate = (DateTime)ds.Tables[4].Rows[0][0];
//Tab一覧
SetTabs(ds.Tables[5]);
}
///
/// 表示用データ
///
///
///
public async Task GetData(DateTime useDate, bool tabChanged)
{
Clear();
int tabID = Tabs[ActiveTabIndex].ID;
using RoomViewLayoutAccess access = new RoomViewLayoutAccess(EnvironmentSetting.GrpcChannel);
using DataSet ds = await access.GetRoomViewData($"{CConvert.ToDateString(useDate)},{tabID},{(tabChanged ? 2 : 0)}");
//レイアウトデータ
SetLayoutData(ds.Tables[0]);
//部屋状態・属性
SetRoomData(ds.Tables[1]);
//部屋の利用データ
SetUseData(ds.Tables[2]);
//レイアウト
if (tabChanged) { SetRoomCell(ds.Tables[3]); }
}
///
/// セルのレイアウト情報取得
///
///
private void SetRoomCell(DataTable table)
{
List list;
if (CellsBuffer.TryGetValue(ActiveTabIndex, out list))
{
Cells = list;
return;
}
list = new List();
foreach (DataRow row in table.Rows)
{
RoomCell item = new RoomCell();
item.ConvertDataRow(row);
list.Add(item);
}
CellsBuffer[ActiveTabIndex] = list;
Cells = list;
}
///
/// Tabの情報
///
///
private void SetTabs(DataTable table)
{
Tabs.Clear();
foreach (DataRow row in table.Rows)
{
RoomViewTab item = new RoomViewTab();
item.ConvertDataRow(row);
Tabs.Add(item);
}
}
///
/// レイアウトデータ
///
///
private void SetLayoutData(DataTable table)
{
List rowData = new List();
foreach (DataRow row in table.Rows)
{
RoomViewLayout item = new RoomViewLayout();
item.Read(row);
if (item.Row > RowCount) { RowCount = item.Row; }
if (item.Col > ColCount) { ColCount = item.Col; }
if (item.Col == 1)
{
//改行
rowData = new List();
Data.Add(rowData);
}
//行毎の各列
rowData.Add(item);
}
}
///
/// 部屋状態・属性
///
///
private void SetRoomData(DataTable table)
{
foreach (DataRow row in table.Rows)
{
RoomViewAtt room = new RoomViewAtt();
room.Read(row);
RoomData.Add(room.RoomID, room);
}
}
///
/// 部屋の利用データ
///
///
private void SetUseData(DataTable table)
{
foreach (DataRow row in table.Rows)
{
RoomViewUse use = new RoomViewUse();
use.Read(row);
SortedDictionary dict;
if (!UseData.TryGetValue(use.RoomID, out dict))
{
dict = new SortedDictionary();
UseData.Add(use.RoomID, dict);
}
dict.Add(use.SortKey, use);
}
}
///
/// セルのアイテム毎の表示文言
///
///
///
///
public string GetText(Data.Master.RoomCell roomCell, int roomID)
{
try
{
if (roomCell.ID == 0) { return roomCell.Content; }
else if (roomCell.ID == 1) { return roomID.ToString(); }
else if (roomCell.ID == 9) { return RoomData.ContainsKey(roomID) ? RoomData[roomID].RoomName : string.Empty; }
else
{
return UseData.ContainsKey(roomID) ? UseData[roomID].FirstOrDefault().Value.UseData[$"F{roomCell.ID}"] : string.Empty;
}
}
catch
{
return $"error:{roomCell.ID}";
}
}
///
/// セル色
///
///
///
public string GetCellColor(Data.Master.RoomViewLayout item)
{
int roomID = item.RoomID;
StringBuilder text = new StringBuilder();
//優先順位:部屋状態>利用状態>固定色
string backColor = item.BackColor, foreColor = item.ForeColor;
if (roomID > 0)
{
int maidType = RoomData.ContainsKey(roomID) ? RoomData[roomID].MaidType : 0;
if (maidType > 0)
{
foreColor = RoomData[roomID].ForeColor;
backColor = RoomData[roomID].BackColor;
}
else if (UseData.ContainsKey(roomID))
{
var use = UseData[roomID].FirstOrDefault().Value;
foreColor = use.ForeColor;
backColor = use.BackColor;
}
}
text.Append($"color:{CConvert.ToHtmlColor(foreColor)};");
text.Append($"background:{CConvert.ToHtmlColor(backColor)};");
return text.ToString();
}
///
/// セルのアイテム毎のスタイル
///
///
///
public string GetRoomCellStyle(Data.Master.RoomCell roomCell)
{
StringBuilder text = new StringBuilder();
text.Append("position: absolute;");
text.Append($"left: {roomCell.Left}px;");
text.Append($"top: {roomCell.Top}px;");
text.Append($"width:{roomCell.Width}px;");
text.Append($"height:{roomCell.Heigh}px;");
text.Append($"font-family:{roomCell.FontName};");
text.Append($"font-size:{roomCell.FontSize}pt;");
if (roomCell.FontItalic) { text.Append("font-style:italic;"); }
if (roomCell.FontBold) { text.Append("font-weight:bold;"); }
string backColor = roomCell.BackColor, foreColor = roomCell.ForeColor;
text.Append($"color:{CConvert.ToHtmlColor(foreColor)};");
if (!CConvert.IsTransparent(backColor)) { text.Append($"background:{CConvert.ToHtmlColor(backColor)};"); }
if(roomCell.FontUnderline)
{
text.Append("text-decoration: underline;");
text.Append("text-underline-offset: 0.2em;");
}
return text.ToString();
}
///
/// セルの文字寄せ
///
///
///
public Align ToTextAlignCSS(Data.Master.RoomCell roomCell)
{
//TopLeft = 1,
//TopCenter = 2,
//TopRight = 4,
//MiddleLeft = 16,
//MiddleCenter = 32,
//MiddleRight = 64,
//BottomLeft = 256,
//BottomCenter = 512,
//BottomRight = 1024,
if (roomCell.TextAlign == 1 || roomCell.TextAlign == 16 || roomCell.TextAlign == 256)
{
return Align.Left;
}
else if (roomCell.TextAlign == 4 || roomCell.TextAlign == 64 || roomCell.TextAlign == 1024)
{
return Align.Right;
}
else
{
return Align.Center;
}
}
}
}