﻿<!--
File: Home.razor (updated)
Features:
- KPI grid responsive: 4 per row on desktop, 2 per row on tablet/mobile, 1 per row on very small screens
- Added "All Sensors" chart pane with sensor selector checkboxes (generated from dashboard data)
- KPI column uses class `col-kpi` to avoid colliding with bootstrap defaults
-->

@page "/"
@attribute [Authorize]
@inject HttpClient Http
@inject NavigationManager NavigationManager
@inject AuthenticationStateProvider AuthenticationStateProvider
@inject ILogger<Home> Logger
@inject IJSRuntime JSRuntime

<PageTitle>داشبورد سنسورها</PageTitle>

@if (dashboard == null || isLoading)
{
    <!-- Loading Animation -->
    <div class="loading-container">
        <div class="plant-loader">
            <div class="plant-stem"></div>
            <div class="plant-leaf plant-leaf-1"></div>
            <div class="plant-leaf plant-leaf-2"></div>
            <div class="plant-leaf plant-leaf-3"></div>
            <div class="plant-pot"></div>
        </div>
        <p class="loading-text">داشبورد شما در حال رشد است...</p>
    </div>
}
else
{
    <!-- Animated Header -->
    <div class="dashboard-header mb-5">
        <div class="header-background">
            <div class="wave wave1"></div>
            <div class="wave wave2"></div>
            <div class="wave wave3"></div>
        </div>
        <div class="header-content">
            <h1 class="dashboard-title">
                <span class="title-icon">🌱</span>
                داشبورد هوشمند گلخانه
            </h1>
            <p class="dashboard-subtitle">مدیریت لحظه‌ای و هوشمند محیط رشد گیاهان</p>
        </div>
    </div>

    <!-- Filter Card with Glass Effect -->
    <div class="filter-card glass-card mb-5">
        <div class="card-body p-4">
            <div class="row align-items-center gy-3">
                <div class="col-xl-8 col-lg-12">
                    <div class="d-flex align-items-center flex-wrap gap-3">
                        <div class="filter-item">
                            <label class="filter-label">
                                <i class="ki-duotone ki-home-2 fs-4 me-2"><span class="path1"></span><span class="path2"></span></i>
                                گلخانه
                            </label>
                            <select class="form-select form-select-transparent" @onchange="OnGreenhouseSelectionChanged">
                                <option value="">همه گلخانه‌ها</option>
                                @if (greenhouses != null)
                                {
                                    @foreach (var gh in greenhouses)
                                    {
                                        <option value="@gh.Id" selected="@(selectedGreenhouseId == gh.Id.ToString())">@gh.Name</option>
                                    }
                                }
                            </select>
                        </div>
                        <div class="filter-item">
                            <label class="filter-label">
                                <i class="ki-duotone ki-cpu fs-4 me-2"><span class="path1"></span><span class="path2"></span></i>
                                دستگاه
                            </label>
                            <select class="form-select form-select-transparent" @onchange="OnDeviceSelectionChanged">
                                <option value="">همه دستگاه‌ها</option>
                                @if (devices != null)
                                {
                                    @foreach (var dev in devices)
                                    {
                                        <option value="@dev.Id" selected="@(selectedDeviceId == dev.Id.ToString())">@dev.Name</option>
                                    }
                                }
                            </select>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <!-- Main content area -->
    <div class="dashboard-content">
        @if (isLoading)
        {
            <div class="content-loader">
                <div class="loader-dots">
                    <span></span>
                    <span></span>
                    <span></span>
                </div>
            </div>
        }

        <!-- Active Alerts with Animation -->
        <div class="alerts-section mb-5">
            @if (dashboard.ActiveAlerts != null && dashboard.ActiveAlerts.Any())
            {
                <div class="alerts-container">
                    @foreach (var alert in dashboard.ActiveAlerts)
                    {
                        <div class="alert-card alert-danger-gradient">
                            <div class="alert-icon-wrapper">
                                <div class="pulse-ring"></div>
                                <i class="@alert.Icon fs-2x"></i>
                            </div>
                            <div class="alert-content">
                                <h5 class="alert-title">هشدار سیستم</h5>
                                <p class="alert-description">
                                    سنسور <strong>@alert.SensorTypeName @alert.SensorName</strong>
                                    در <strong>@alert.GreenhouseName</strong>
                                </p>
                                <div class="alert-details">
                                    <span class="detail-item">
                                        <i class="ki-duotone ki-warning-2 fs-5"><span class="path1"></span><span class="path2"></span></i>
                                        @alert.Title @alert.Condition
                                    </span>
                                    <span class="detail-item">
                                        <i class="ki-duotone ki-chart-line fs-5"><span class="path1"></span><span class="path2"></span></i>
                                        مقدار فعلی: <strong>@alert.TriggeringValue</strong>
                                    </span>
                                    <span class="detail-item">
                                        <i class="ki-duotone ki-time fs-5"><span class="path1"></span><span class="path2"></span></i>
                                        @alert.StartedAtFormatted
                                    </span>
                                </div>
                            </div>
                        </div>
                    }
                </div>
            }
            else
            {
                <div class="alert-card alert-success-gradient">
                    <div class="alert-icon-wrapper">
                        <div class="success-checkmark">
                            <div class="check-icon">
                                <span class="icon-line line-tip"></span>
                                <span class="icon-line line-long"></span>
                                <div class="icon-circle"></div>
                                <div class="icon-fix"></div>
                            </div>
                        </div>
                    </div>
                    <div class="alert-content">
                        <h5 class="alert-title">همه چیز عالیه! 🌿</h5>
                        <p class="alert-description">تمام سنسورها در وضعیت نرمال قرار دارند</p>
                    </div>
                </div>
            }
        </div>

        <!-- KPI Cards with 3D Effect -->
        <div class="kpi-section mb-5">
            <div class="container-fluid p-0">
                <div class="row g-3">
                    @foreach (var w in dashboard.Widgets)
                    {
                        <div class="col-kpi">
                            <div class="kpi-card h-100" style="--accent-color: @w.BgColor">
                                <div class="kpi-icon">
                                    <i class="@w.Icon"></i>
                                </div>
                                <div class="kpi-content">
                                    <span class="kpi-label">@w.TypeName</span>
                                    <div class="kpi-value">
                                        <span class="value-number">@(w.Value?.ToString("0.0") ?? "--")</span>
                                        <span class="value-unit">@w.UnitSymbol</span>
                                    </div>
                                </div>
                                <div class="kpi-background"></div>
                            </div>
                        </div>
                    }
                </div>
            </div>
        </div>

        <!-- Date Filter with Modern Design -->
        <div class="date-filter-section glass-card mb-5">
            <div class="card-body p-4">
                <div class="d-flex align-items-center justify-content-between flex-wrap gap-3">
                    <div class="section-title">
                        <i class="ki-duotone ki-calendar-8 fs-2x text-primary me-3"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span><span class="path5"></span><span class="path6"></span></i>
                        <span>بازه زمانی نمایش داده‌ها</span>
                    </div>
                    <div class="date-controls">
                        <div class="date-input-group">
                            <input type="text" id="fromDatePicker" class="date-input" placeholder="از تاریخ" />
                            <i class="ki-duotone ki-calendar fs-4"><span class="path1"></span><span class="path2"></span></i>
                        </div>
                        <span class="date-separator">تا</span>
                        <div class="date-input-group">
                            <input type="text" id="toDatePicker" class="date-input" placeholder="تا تاریخ" />
                            <i class="ki-duotone ki-calendar fs-4"><span class="path1"></span><span class="path2"></span></i>
                        </div>
                        <button class="refresh-btn" @onclick="RefreshDashboard" disabled="@isLoading">
                            @if (isLoading)
                            {
                                <div class="spinner-grow spinner-grow-sm"></div>
                            }
                            else
                            {
                                <i class="ki-duotone ki-arrows-circle fs-4"><span class="path1"></span><span class="path2"></span></i>
                            }
                            <span>بروزرسانی</span>
                        </button>
                    </div>
                </div>
            </div>
        </div>

        <!-- Charts Section with Modern Tabs -->
        <div class="charts-section glass-card mb-5">
            <div class="card-header">
                <h3 class="section-title">
                    <i class="ki-duotone ki-chart-line-up fs-2x me-3"><span class="path1"></span><span class="path2"></span></i>
                    تحلیل داده‌های سنسورها
                </h3>
                <div class="chart-tabs">
                    @if (dashboard.Charts != null && dashboard.Charts.Any())
                    {
                        @for (int i = 0; i < dashboard.Charts.Count; i++)
                        {
                            var chartGroup = dashboard.Charts[i];
                            <button class="chart-tab @(i == 0 ? "active" : "")"
                                    onclick="switchChartTab('@chartGroup.TypeCode')">
                                @chartGroup.TypeName
                            </button>
                        }
                    }

                    <!-- اضافه کردن تب All Sensors -->
                    <button class="chart-tab" onclick="switchChartTab('all-sensors')">همه سنسورها</button>
                </div>
            </div>
            <div class="card-body">
                <div class="chart-container">
                    @if (dashboard.Charts != null && dashboard.Charts.Any())
                    {
                        @for (int i = 0; i < dashboard.Charts.Count; i++)
                        {
                            var chartGroup = dashboard.Charts[i];
                            <div class="chart-pane @(i == 0 ? "active" : "")" id="chart-pane-@chartGroup.TypeCode">
                                <div id="chart-@chartGroup.TypeCode" class="modern-chart"></div>
                            </div>
                        }
                    }

                    <!-- Chart pane for All Sensors -->
                    <div class="chart-pane" id="chart-pane-all-sensors">
                        <div class="chart-filter" id="chart-sensor-filter"></div>
                        <div id="chart-all-sensors" class="modern-chart"></div>
                    </div>
                </div>
            </div>
        </div>

        <!-- Tables Section with Amazing Design -->
        <div class="tables-section glass-card">
            <div class="card-header">
                <h3 class="section-title">
                    <i class="ki-duotone ki-element-11 fs-2x me-3"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span></i>
                    جدول داده‌های سنسورها
                </h3>
                <div class="table-view-switcher">
                    <button class="view-btn active" onclick="switchTableView('detail')">
                        <i class="ki-duotone ki-row-horizontal fs-4"><span class="path1"></span><span class="path2"></span></i>
                        <span>نمای جزئیات</span>
                    </button>
                    <button class="view-btn" onclick="switchTableView('pivot')">
                        <i class="ki-duotone ki-element-equal fs-4"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span></i>
                        <span>نمای ماتریسی</span>
                    </button>
                </div>
            </div>

            <div class="card-body">
                <!-- Detail View -->
                <div class="table-view active" id="detail-view">
                    @if (dashboard.Table != null && dashboard.Table.Any())
                    {
                        <!-- Mobile Cards View -->
                        <div class="mobile-cards d-lg-none">
                            <div class="container-fluid p-0">
                                <div class="row row-cols-2 g-2">
                                    @foreach (var row in dashboard.Table)
                                    {
                                        <div class="col">
                                            <div class="sensor-card h-100">
                                                <div class="sensor-card-header">
                                                    <div class="time-badge">
                                                        <i class="ki-duotone ki-time fs-6"><span class="path1"></span><span class="path2"></span></i>
                                                        <span>@row.Timestamp.Split(' ')[0]</span>
                                                    </div>
                                                    <div class="sensor-value">
                                                        <span class="value">@row.Value.Split(' ')[0]</span>
                                                        <span class="unit">@(row.Value.Contains(' ') ? row.Value.Split(' ')[1] : "")</span>
                                                    </div>
                                                </div>
                                                <div class="sensor-card-body">
                                                    <div class="info-grid">
                                                        <div class="info-item">
                                                            <i class="ki-duotone ki-home-2 fs-6"><span class="path1"></span><span class="path2"></span></i>
                                                            <div>
                                                                <span class="label">گلخانه</span>
                                                                <span class="value">@row.GreenhouseName</span>
                                                            </div>
                                                        </div>
                                                        <div class="info-item">
                                                            <i class="ki-duotone ki-cpu fs-6"><span class="path1"></span><span class="path2"></span></i>
                                                            <div>
                                                                <span class="label">دستگاه</span>
                                                                <span class="value">@row.DeviceName</span>
                                                            </div>
                                                        </div>
                                                        <div class="info-item">
                                                            <i class="ki-duotone ki-flash fs-6"><span class="path1"></span><span class="path2"></span></i>
                                                            <div>
                                                                <span class="label">سنسور</span>
                                                                <span class="value">@row.SensorName</span>
                                                            </div>
                                                        </div>
                                                        <div class="info-item">
                                                            <i class="ki-duotone ki-category fs-6"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span></i>
                                                            <div>
                                                                <span class="label">نوع</span>
                                                                <span class="value">@row.SensorType</span>
                                                            </div>
                                                        </div>
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                                    }
                                </div>
                            </div>
                        </div>

                        <!-- Desktop Table View -->
                        <div class="modern-table d-none d-lg-block">
                            <table class="sensor-table" id="sensorTable">
                                <thead>
                                    <tr>
                                        <th>
                                            <div class="th-content">
                                                <i class="ki-duotone ki-time"><span class="path1"></span><span class="path2"></span></i>
                                                <span>زمان</span>
                                            </div>
                                        </th>
                                        <th>
                                            <div class="th-content">
                                                <i class="ki-duotone ki-home-2"><span class="path1"></span><span class="path2"></span></i>
                                                <span>گلخانه</span>
                                            </div>
                                        </th>
                                        <th>
                                            <div class="th-content">
                                                <i class="ki-duotone ki-cpu"><span class="path1"></span><span class="path2"></span></i>
                                                <span>دستگاه</span>
                                            </div>
                                        </th>
                                        <th>
                                            <div class="th-content">
                                                <i class="ki-duotone ki-flash"><span class="path1"></span><span class="path2"></span></i>
                                                <span>سنسور</span>
                                            </div>
                                        </th>
                                        <th>
                                            <div class="th-content">
                                                <i class="ki-duotone ki-category"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span></i>
                                                <span>نوع</span>
                                            </div>
                                        </th>
                                        <th>
                                            <div class="th-content">
                                                <i class="ki-duotone ki-chart-simple-3"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span></i>
                                                <span>مقدار</span>
                                            </div>
                                        </th>
                                    </tr>
                                </thead>
                                <tbody>
                                    @foreach (var row in dashboard.Table)
                                    {
                                        <tr class="table-row">
                                            <td data-order="@row.Timestamp">
                                                <div class="time-cell">
                                                    <span class="date">@row.Timestamp.Split(' ')[0]</span>
                                                    <span class="time">@(row.Timestamp.Contains(' ') ? row.Timestamp.Split(' ')[1] : "")</span>
                                                </div>
                                            </td>
                                            <td>
                                                <span class="badge-cell greenhouse">@row.GreenhouseName</span>
                                            </td>
                                            <td>
                                                <span class="badge-cell device">@row.DeviceName</span>
                                            </td>
                                            <td>
                                                <span class="text-cell">@row.SensorName</span>
                                            </td>
                                            <td>
                                                <span class="type-badge">@row.SensorType</span>
                                            </td>
                                            <td>
                                                <div class="value-cell">
                                                    <span class="value">@row.Value.Split(' ')[0]</span>
                                                    <span class="unit">@(row.Value.Contains(' ') ? row.Value.Split(' ')[1] : "")</span>
                                                </div>
                                            </td>
                                        </tr>
                                    }
                                </tbody>
                            </table>
                        </div>
                    }
                    else
                    {
                        <div class="empty-state">
                            <div class="empty-icon">
                                <i class="ki-duotone ki-ghost fs-5x"><span class="path1"></span><span class="path2"></span></i>
                            </div>
                            <h4>داده‌ای یافت نشد</h4>
                            <p>در بازه زمانی انتخاب شده، هیچ داده‌ای ثبت نشده است</p>
                        </div>
                    }
                </div>
                <!-- Pivot View -->
                <div class="table-view" id="pivot-view">
                    @if (dashboard.PivotTable != null && dashboard.PivotTable.Any())
                    {
                        <!-- Mobile Cards View for Pivot -->
                        <div class="mobile-cards d-lg-none">
                            <div class="container-fluid p-0">
                                <div class="row row-cols-1 g-2">
                                    @foreach (var row in dashboard.PivotTable)
                                    {
                                        <div class="col">
                                            <div class="sensor-card pivot-card h-100">
                                                <div class="sensor-card-header">
                                                    <div class="time-badge">
                                                        <i class="ki-duotone ki-time fs-6"><span class="path1"></span><span class="path2"></span></i>
                                                        <span>@row.Timestamp.Split(' ')[0]</span>
                                                    </div>
                                                    <div class="sensor-value">
                                                        <span class="value">@row.SensorValues.Count</span>
                                                        <span class="unit">سنسور</span>
                                                    </div>
                                                </div>
                                                <div class="sensor-card-body">
                                                    <div class="pivot-data-mobile">
                                                        <div class="location-info">
                                                            <div class="location-item">
                                                                <i class="ki-duotone ki-home-2 fs-6 text-primary"><span class="path1"></span><span class="path2"></span></i>
                                                                <span class="location-text">@row.GreenhouseName</span>
                                                            </div>
                                                            <div class="location-item">
                                                                <i class="ki-duotone ki-cpu fs-6 text-success"><span class="path1"></span><span class="path2"></span></i>
                                                                <span class="location-text">@row.DeviceName</span>
                                                            </div>
                                                        </div>

                                                        <div class="sensors-summary">
                                                            @foreach (var sensor in row.SensorValues)
                                                            {
                                                                <div class="sensor-item">
                                                                    <span class="sensor-label">@sensor.Key.Split('(')[0].Trim()</span>
                                                                    <span class="sensor-val">@sensor.Value</span>
                                                                </div>
                                                            }
                                                        </div>
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                                    }
                                </div>
                            </div>
                        </div>

                        <!-- Desktop Table View for Pivot -->
                        <div class="modern-table d-none d-lg-block">
                            <table class="sensor-table" id="sensorPivotTable">
                                <thead>
                                    <tr>
                                        <th>
                                            <div class="th-content">
                                                <i class="ki-duotone ki-time"><span class="path1"></span><span class="path2"></span></i>
                                                <span>زمان</span>
                                            </div>
                                        </th>
                                        <th>
                                            <div class="th-content">
                                                <i class="ki-duotone ki-home-2"><span class="path1"></span><span class="path2"></span></i>
                                                <span>گلخانه</span>
                                            </div>
                                        </th>
                                        <th>
                                            <div class="th-content">
                                                <i class="ki-duotone ki-cpu"><span class="path1"></span><span class="path2"></span></i>
                                                <span>دستگاه</span>
                                            </div>
                                        </th>
                                        @* ستون‌های داینامیک برای هر نوع سنسور *@
                                        @if (dashboard.PivotColumns != null && dashboard.PivotColumns.Any())
                                        {
                                            @foreach (var column in dashboard.PivotColumns)
                                            {
                                                <th>
                                                    <div class="th-content">
                                                        <i class="ki-duotone ki-chart-simple-3"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span></i>
                                                        <span>@column.DisplayName</span>
                                                    </div>
                                                </th>
                                            }
                                        }
                                        else
                                        {
                                            @* اگر PivotColumns خالی باشد، از اولین ردیف استفاده کن *@
                                            @foreach (var sensorKey in dashboard.PivotTable.FirstOrDefault()?.SensorValues.Keys.ToList() ?? new List<string>())
                                            {
                                                <th>
                                                    <div class="th-content">
                                                        <i class="ki-duotone ki-chart-simple-3"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span></i>
                                                        <span>@sensorKey</span>
                                                    </div>
                                                </th>
                                            }
                                        }
                                    </tr>
                                </thead>
                                <tbody>
                                    @foreach (var row in dashboard.PivotTable)
                                    {
                                        <tr class="table-row">
                                            <td>
                                                <div class="time-cell">
                                                    @{
                                                        var timeParts = row.Timestamp.Split(' ');
                                                        var timeStr = timeParts.Length > 0 ? timeParts[0] : "";
                                                        var dateStr = timeParts.Length > 1 ? string.Join(" ", timeParts.Skip(1)) : "";
                                                    }
                                                    <span class="time">@timeStr</span>
                                                    <span class="date">@dateStr</span>
                                                </div>
                                            </td>
                                            <td>
                                                <span class="badge-cell greenhouse">@row.GreenhouseName</span>
                                            </td>
                                            <td>
                                                <span class="badge-cell device">@row.DeviceName</span>
                                            </td>

                                            @* مقادیر سنسورها *@
                                            @if (dashboard.PivotColumns != null && dashboard.PivotColumns.Any())
                                            {
                                                @foreach (var column in dashboard.PivotColumns)
                                                {
                                                    <td>
                                                        <div class="value-cell">
                                                            @if (row.SensorValues.ContainsKey(column.DisplayName))
                                                            {
                                                                var value = row.SensorValues[column.DisplayName];
                                                                var valueParts = value.Split(' ');
                                                                var numberPart = valueParts.Length > 0 ? valueParts[0] : value;
                                                                var unitPart = valueParts.Length > 1 ? string.Join(" ", valueParts.Skip(1)) : "";
                                                                <span class="value">@numberPart</span>
                                                                @if (!string.IsNullOrEmpty(unitPart))
                                                                {
                                                                    <span class="unit">@unitPart</span>
                                                                }
                                                            }
                                                            else
                                                            {
                                                                <span class="value text-muted">--</span>
                                                            }
                                                        </div>
                                                    </td>
                                                }
                                            }
                                            else
                                            {
                                                @* اگر PivotColumns خالی باشد *@
                                                @foreach (var sensorKey in dashboard.PivotTable.FirstOrDefault()?.SensorValues.Keys.ToList() ?? new List<string>())
                                                {
                                                    <td>
                                                        <div class="value-cell">
                                                            @if (row.SensorValues.ContainsKey(sensorKey))
                                                            {
                                                                var value = row.SensorValues[sensorKey];
                                                                var valueParts = value.Split(' ');
                                                                var numberPart = valueParts.Length > 0 ? valueParts[0] : value;
                                                                var unitPart = valueParts.Length > 1 ? string.Join(" ", valueParts.Skip(1)) : "";
                                                                <span class="value">@numberPart</span>
                                                                @if (!string.IsNullOrEmpty(unitPart))
                                                                {
                                                                    <span class="unit">@unitPart</span>
                                                                }
                                                            }
                                                            else
                                                            {
                                                                <span class="value text-muted">--</span>
                                                            }
                                                        </div>
                                                    </td>
                                                }
                                            }
                                        </tr>
                                    }
                                </tbody>
                            </table>
                        </div>
                    }
                    else
                    {
                        <div class="empty-state">
                            <div class="empty-icon">
                                <i class="ki-duotone ki-ghost fs-5x"><span class="path1"></span><span class="path2"></span></i>
                            </div>
                            <h4>داده‌ای یافت نشد</h4>
                            <p>در بازه زمانی انتخاب شده، هیچ داده‌ای برای نمای ماتریسی ثبت نشده است</p>
                        </div>
                    }
                </div>
            </div>
        </div>
    </div>
}

@code {
    // code-behind moved to Home.razor.cs (separate file). See created file in this document.
}


<!--
File: Home.razor.cs (updates)
- Added AvailableSensors list and AllSensorsSeries creation (best-effort merge)
- After loading dashboard, we call JS to initialize the All Sensors chart and sensor filter
-->

// --- Home.razor.cs ---
using FarabPortal.AdditionalSettings;
using FarabPortal.DTOs.ClientApi.V1;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.JSInterop;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static FarabPortal.AdditionalSettings.Common;

namespace FarabPortal.Components.Pages.Main
{
    public partial class Home : ComponentBase, IAsyncDisposable
    {
        private HomeDashboardDto dashboard;
        private List<ClientApiGreenhouseDto> greenhouses;
        private List<ClientApiDeviceDto> devices;
        private HubConnection hubConnection;
        private bool isLoading = true; // در ابتدا لودینگ را فعال می‌کنیم

        // این متغیر برای جلوگیری از فراخوانی تکراری و غیرضروری JS است
        private int _lastRenderedDashboardHash;

        private string selectedGreenhouseId = "";
        private string selectedDeviceId = "";
        private DateTime? fromDate;
        private DateTime? toDate;

        // لیستی از نام سنسورهای موجود (برای چارت همه سنسورها)
        private List<string> AvailableSensors = new();

        protected override async Task OnInitializedAsync()
        {
            AdminState.OnChange += HandleCustomerChange;
            try
            {
                PageTitle = "خانه";
                PageDescription = "مشاهده گزارش";
                fromDate = DateTime.Today;
                toDate = DateTime.Today;

                await LoadInitialData();
                await InitializeSignalR();
            }
            catch (Exception ex)
            {
                Logger.LogError(ex, "Error in OnInitializedAsync of Home page");
                InitializeEmptyDashboard();
            }
        }

        protected override async Task OnAfterRenderAsync(bool firstRender)
        {
            // این بخش فقط یکبار برای کامپوننت‌های ثابت مثل DatePicker اجرا می‌شود
            if (firstRender)
            {
                await JSRuntime.InvokeVoidAsync("persianDatepickers.initialize");
            }

            // این بخش چک می‌کند آیا داده‌های داشبورد جدید هستند و نیاز به رندر مجدد JS دارند یا خیر
            var currentDashboardHash = dashboard?.GetHashCode() ?? 0;
            if (dashboard != null && dashboard.Widgets.Any() && currentDashboardHash != _lastRenderedDashboardHash)
            {
                try
                {
                    // یک تابع JS که هم نمودار و هم جداول را مقداردهی اولیه می‌کند
                    await JSRuntime.InvokeVoidAsync("initializeDashboard", dashboard);

                    // render combined "all sensors" chart and init sensor selector
                    // we pass dashboard.Charts to JS and the JS will try to merge series by name
                    await JSRuntime.InvokeVoidAsync("renderAllSensorsChart", dashboard?.Charts ?? new object[0]);

                    // به‌روزرسانی تاریخ در DatePicker ها
                    await JSRuntime.InvokeVoidAsync("persianDatepickers.setDates",
                        fromDate?.ToString("yyyy-MM-dd"),
                        toDate?.ToString("yyyy-MM-dd"));

                    // هش را ذخیره می‌کنیم تا در رندرهای بعدی دوباره فراخوانی نشود
                    _lastRenderedDashboardHash = currentDashboardHash;
                }
                catch (Exception ex)
                {
                    Logger.LogError(ex, "Error calling JS interop in OnAfterRenderAsync");
                }
            }
        }

        private async Task LoadInitialData()
        {
            InitializeEmptyDashboard();
            await LoadGreenhousesAndDevices();
            await LoadDashboardData();
        }

        private async Task LoadDashboardData()
        {
            var currentCustomerId = AdminState.SelectedCustomerId;
            if (!currentCustomerId.HasValue)
            {
                InitializeEmptyDashboard();
                return;
            }

            try
            {
                isLoading = true;
                await InvokeAsync(StateHasChanged);

                var query = new StringBuilder($"{NavigationManager.BaseUri}api/v1/dashboard/{currentCustomerId.Value}?");
                if (!string.IsNullOrEmpty(selectedGreenhouseId)) query.Append($"greenhouseId={selectedGreenhouseId}&");
                if (!string.IsNullOrEmpty(selectedDeviceId)) query.Append($"deviceId={selectedDeviceId}&");
                if (fromDate.HasValue) query.Append($"fromDate={fromDate.Value:yyyy-MM-ddTHH:mm:ss}&");
                if (toDate.HasValue) query.Append($"toDate={toDate.Value:yyyy-MM-ddTHH:mm:ss}&");

                var url = query.ToString().TrimEnd('&', '?');
                Logger.LogInformation($"Loading dashboard from: {url}");

                dashboard = await Http.GetFromJsonAsync<HomeDashboardDto>(url) ?? new HomeDashboardDto();

                // Prepare AvailableSensors list (best-effort):
                AvailableSensors.Clear();
                // first try PivotColumns
                if (dashboard.PivotColumns != null && dashboard.PivotColumns.Any())
                {
                    AvailableSensors.AddRange(dashboard.PivotColumns.Select(c => c.DisplayName));
                }
                else if (dashboard.PivotTable != null && dashboard.PivotTable.Any())
                {
                    var keys = dashboard.PivotTable.First().SensorValues.Keys;
                    AvailableSensors.AddRange(keys);
                }
                else if (dashboard.Charts != null && dashboard.Charts.Any())
                {
                    // fallback: collect series names
                    foreach (var cg in dashboard.Charts)
                    {
                        var seriesList = cg?.Series as System.Text.Json.JsonElement?;
                    }
                    // Note: we just leave AvailableSensors empty if we can't extract easily
                }

            }
            catch (Exception ex)
            {
                Logger.LogError(ex, "Error loading dashboard data");
                InitializeEmptyDashboard();
            }
            finally
            {
                isLoading = false;
                await InvokeAsync(StateHasChanged);
            }
        }

        public async Task RefreshDashboard()
        {
            try
            {
                var fromDateStr = (await JSRuntime.InvokeAsync<string>("persianDatepickers.getFromDate")).ToEnglishDigits();
                var toDateStr = (await JSRuntime.InvokeAsync<string>("persianDatepickers.getToDate")).ToEnglishDigits();

                if (!string.IsNullOrEmpty(fromDateStr)) fromDate = DateTime.Parse(fromDateStr);
                else fromDate = DateTime.Today;

                if (!string.IsNullOrEmpty(toDateStr)) toDate = DateTime.Parse(toDateStr);
                else toDate = DateTime.Today;
            }
            catch (Exception ex)
            {
                Logger.LogError(ex, "Error getting dates from JS");
            }

            await LoadDashboardData();
        }

        private async Task OnGreenhouseChanged()
        {
            selectedDeviceId = "";
            await LoadDevices();
            await LoadDashboardData();
        }

        private async Task HandleCustomerChange()
        {
            Logger.LogInformation($"Customer changed to: {AdminState.SelectedCustomerId}");

            selectedGreenhouseId = "";
            selectedDeviceId = "";
            devices?.Clear();

            await LoadInitialData();
        }

        private async Task InitializeSignalR()
        {
            var currentCustomerId = AdminState.SelectedCustomerId;
            if (!currentCustomerId.HasValue) return;
            try
            {
                hubConnection = new HubConnectionBuilder()
                    .WithUrl(NavigationManager.ToAbsoluteUri("/dashboardHub"))
                    .WithAutomaticReconnect()
                    .Build();

                hubConnection.On("DashboardUpdated", async () =>
                {
                    await LoadDashboardData();
                });

                await hubConnection.StartAsync();
                await hubConnection.InvokeAsync("JoinCustomerGroup", currentCustomerId.Value.ToString());
            }
            catch (Exception ex)
            {
                Logger.LogError(ex, "Error initializing SignalR");
            }
        }

        private async Task LoadGreenhousesAndDevices()
        {
            var currentCustomerId = AdminState.SelectedCustomerId;
            if (currentCustomerId.HasValue)
            {
                try
                {
                    greenhouses = await Http.GetFromJsonAsync<List<ClientApiGreenhouseDto>>(
                        $"{NavigationManager.BaseUri}api/v1/dashboard/{currentCustomerId.Value}/greenhouses") ?? new();
                }
                catch (Exception ex) { Logger.LogError(ex, "Error loading greenhouses"); greenhouses = new(); }
            }
            await LoadDevices();
        }

        private async Task LoadDevices()
        {
            try
            {
                devices = string.IsNullOrEmpty(selectedGreenhouseId)
                    ? new List<ClientApiDeviceDto>()
                    : await Http.GetFromJsonAsync<List<ClientApiDeviceDto>>(
                        $"{NavigationManager.BaseUri}api/v1/dashboard/{selectedGreenhouseId}/devices") ?? new();
            }
            catch (Exception ex) { Logger.LogError(ex, "Error loading devices"); devices = new(); }
        }
        private async Task OnGreenhouseSelectionChanged(ChangeEventArgs e)
        {
            selectedGreenhouseId = e.Value?.ToString() ?? "";
            selectedDeviceId = "";
            await LoadDevices();
            await LoadDashboardData();
        }

        private async Task OnDeviceSelectionChanged(ChangeEventArgs e)
        {
            selectedDeviceId = e.Value?.ToString() ?? "";
            await LoadDashboardData();
        }

        private void InitializeEmptyDashboard()
        {
            dashboard = new HomeDashboardDto();
            _lastRenderedDashboardHash = 0; // مهم: هش را ریست کن
        }

        public async ValueTask DisposeAsync()
        {
            AdminState.OnChange -= HandleCustomerChange;
            if (hubConnection != null)
            {
                await hubConnection.DisposeAsync();
            }
        }
    }
}


<!--
File: dashboard-charts.js (updates)
- adds renderAllSensorsChart(chartsData) which flattens all series and renders a combined chart
- builds a checkbox selector inside #chart-sensor-filter and connects toggles to series.setVisible
-->

// --- dashboard-charts.js ---

"use strict";

window.chartInstances = window.chartInstances || {};
window.lastDashboardData = null;

window.renderMultiCharts = function (chartsData) {
    console.log("renderMultiCharts called with data:", chartsData);
    window.lastDashboardData = { charts: chartsData };

    // destroy previous instances
    Object.keys(window.chartInstances).forEach(key => {
        if (window.chartInstances[key] && window.chartInstances[key].destroy) {
            try { window.chartInstances[key].destroy(); } catch (e) { console.error(e); }
        }
    });
    window.chartInstances = {};

    if (!chartsData || chartsData.length === 0) {
        console.warn("No chart data available to render.");
        return;
    }

    const isDark = document.documentElement.getAttribute("data-bs-theme") === "dark";

    chartsData.forEach(chartGroup => {
        const typeCode = chartGroup.typeCode || chartGroup.TypeCode;
        const typeName = chartGroup.typeName || chartGroup.TypeName;
        const series = chartGroup.series || chartGroup.Series || [];
        const containerId = `chart-${typeCode}`;
        const container = document.getElementById(containerId);

        if (!container) {
            console.error(`Chart container #${containerId} not found in the DOM.`);
            return;
        }

        if (series.length === 0 || !series[0].data) {
            container.innerHTML = `<div class="d-flex justify-content-center align-items-center h-100 text-muted">داده‌ای برای این نمودار وجود ندارد.</div>`;
            return;
        }

        try {
            window.chartInstances[containerId] = Highcharts.chart(containerId, {
                chart: { type: 'line', backgroundColor: 'transparent', style: { fontFamily: 'inherit' } },
                title: { text: null },
                xAxis: {
                    categories: series[0].categories,
                    labels: { style: { color: isDark ? '#A1A5B7' : '#5E6278' } },
                    gridLineColor: isDark ? 'rgba(255, 255, 255, 0.1)' : '#E4E6EF',
                    lineColor: isDark ? 'rgba(255, 255, 255, 0.1)' : '#E4E6EF'
                },
                yAxis: {
                    title: { text: null },
                    labels: { style: { color: isDark ? '#A1A5B7' : '#5E6278' } },
                    gridLineColor: isDark ? 'rgba(255, 255, 255, 0.1)' : '#E4E6EF'
                },
                legend: {
                    enabled: series.length > 1,
                    itemStyle: { color: isDark ? '#A1A5B7' : '#5E6278' },
                    itemHoverStyle: { color: isDark ? '#FFFFFF' : '#000000' }
                },
                series: series.map(s => ({ name: s.name, data: s.data, color: s.color })),
                tooltip: {
                    shared: true,
                    useHTML: true,
                    headerFormat: '<small>{point.key}</small><table>',
                    pointFormat: '<tr><td style="color: {series.color}">{series.name}: </td><td style="text-align: right"><b>{point.y:.1f}</b></td></tr>',
                    footerFormat: '</table>',
                    backgroundColor: isDark ? '#2B2B40' : '#FFFFFF',
                    borderColor: isDark ? '#4A4A62' : '#CCCCCC',
                    style: { color: isDark ? '#FFFFFF' : '#333333' }
                },
                credits: { enabled: false }
            });
            console.log(`Chart for ${typeName} rendered successfully.`);
        } catch (error) {
            console.error(`Error rendering chart ${typeName}:`, error);
        }
    });
};

// Render combined "All Sensors" chart and build sensor filter UI
window.renderAllSensorsChart = function (chartsData) {
    try {
        const containerId = 'chart-all-sensors';
        const filterContainer = document.getElementById('chart-sensor-filter');
        const container = document.getElementById(containerId);
        if (!container) return;

        // merge series from all charts by series.name
        const flatSeries = [];
        const categories = [];

        (chartsData || []).forEach(group => {
            const groupSeries = group.series || group.Series || [];
            groupSeries.forEach(s => {
                // ensure categories from the first series are used
                if (categories.length === 0 && s.categories) categories.push(...s.categories);

                const existing = flatSeries.find(x => x.name === s.name);
                if (!existing) {
                    flatSeries.push({ name: s.name, data: Array.isArray(s.data) ? s.data.slice() : [], color: s.color });
                } else {
                    // if lengths differ, try to align by pushing values (best-effort)
                    existing.data = existing.data.concat(Array.isArray(s.data) ? s.data : []);
                }
            });
        });

        // if no categories found, try to use first series categories
        const finalCategories = categories.length ? categories : ((chartsData[0] && (chartsData[0].series || chartsData[0].Series) && (chartsData[0].series[0] || chartsData[0].Series[0])?.categories) || []);

        // destroy previous instance if exists
        const instKey = containerId;
        if (window.chartInstances[instKey] && window.chartInstances[instKey].destroy) {
            try { window.chartInstances[instKey].destroy(); } catch (e) { console.warn(e); }
        }

        window.chartInstances[instKey] = Highcharts.chart(containerId, {
            chart: { type: 'line', backgroundColor: 'transparent', style: { fontFamily: 'inherit' } },
            title: { text: null },
            xAxis: { categories: finalCategories },
            yAxis: { title: { text: null } },
            legend: { enabled: true },
            series: flatSeries.map(s => ({ name: s.name, data: s.data, color: s.color })),
            tooltip: { shared: true },
            credits: { enabled: false }
        });

        // build filter UI (checkboxes)
        if (filterContainer) {
            filterContainer.innerHTML = '';
            flatSeries.forEach((s, idx) => {
                const id = `sensor-toggle-${idx}`;
                const label = document.createElement('label');
                label.className = 'me-3';
                label.style.display = 'inline-flex';
                label.style.alignItems = 'center';

                const cb = document.createElement('input');
                cb.type = 'checkbox';
                cb.checked = true;
                cb.dataset.seriesName = s.name;
                cb.id = id;
                cb.style.marginLeft = '6px';

                cb.addEventListener('change', function () {
                    const series = window.chartInstances[instKey].series.find(x => x.name === s.name);
                    if (series) series.setVisible(this.checked, true);
                });

                const span = document.createElement('span');
                span.textContent = s.name;

                label.appendChild(cb);
                label.appendChild(span);
                filterContainer.appendChild(label);
            });
        }

    } catch (e) {
        console.error('renderAllSensorsChart error', e);
    }
};


<!--
File: CSS additions (paste into your main stylesheet)
- .col-kpi responsive rules
- .chart-filter style
-->

/* KPI responsive helper */
@media (min-width: 992px) {
    .col-kpi {
        width: 25% !important;
        max-width: 25% !important;
        flex: 0 0 25% !important;
        padding: 0.5rem;
    }
}

@media (max-width: 991px) {
    .col-kpi {
        width: 50% !important;