using Microsoft.EntityFrameworkCore;
using Haoliang.Models.Device;
using Haoliang.Models.Template;
using Haoliang.Models.Production;
using Haoliang.Models.User;
using Haoliang.Models.System;
using Haoliang.Models.DataCollection;

namespace Haoliang.Data.Entities
{
    public class CNCDbContext : DbContext
    {
        public CNCDbContext(DbContextOptions<CNCDbContext> options) : base(options) { }

public DbSet<CNCDevice> Devices { get; set; }
        public DbSet<Haoliang.Models.DataCollection.DeviceCurrentStatus> DeviceCurrentStatus { get; set; } = null!;
        public DbSet<Haoliang.Models.DataCollection.TagData> CollectionTagData { get; set; } = null!;
        public DbSet<CNCBrandTemplate> CNCTemplates { get; set; }
        public DbSet<TemplateFieldMapping> TemplateFieldMappings { get; set; }
        public DbSet<ProductionRecordBasic> ProductionRecords { get; set; }
        public DbSet<ProgramProductionSummary> ProgramProductionSummary { get; set; }
        public DbSet<ProductionSummary> ProductionSummaries { get; set; }
        public DbSet<User> Users { get; set; }
        public DbSet<Role> Roles { get; set; }
        public DbSet<Employee> Employees { get; set; }
        public DbSet<DeviceAssignment> DeviceAssignments { get; set; }
        public DbSet<Alarm> Alarms { get; set; }
        public DbSet<AlarmRule> AlarmRules { get; set; }
        public DbSet<StatisticRule> StatisticRules { get; set; }
        public DbSet<ScheduledTask> ScheduledTasks { get; set; }
        public DbSet<SystemConfig> SystemConfig { get; set; }
        public DbSet<LogEntry> LogEntries { get; set; }
        public DbSet<AlarmStatistics> AlarmStatistics { get; set; }
        public DbSet<AlarmNotification> AlarmNotifications { get; set; }
        public DbSet<Permission> Permissions { get; set; }
        public DbSet<UserPermission> UserPermissions { get; set; }
        public DbSet<RolePermission> RolePermissions { get; set; }
        public DbSet<UserSession> UserSessions { get; set; }
        public DbSet<PasswordReset> PasswordResets { get; set; }
        public DbSet<StatisticResult> StatisticResults { get; set; }
        public DbSet<CollectionTask> CollectionTasks { get; set; }
        public DbSet<CollectionResult> CollectionResults { get; set; }
        public DbSet<CollectionLog> CollectionLogs { get; set; }
        public DbSet<CollectionConfig> CollectionConfigs { get; set; }
        public DbSet<TaskExecutionResult> TaskExecutionResults { get; set; }
        public DbSet<TaskExecutionSummary> TaskExecutionSummaries { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            // 设备配置
            modelBuilder.Entity<CNCDevice>()
                .Property(d => d.DeviceCode)
                .IsRequired()
                .HasMaxLength(50);

            modelBuilder.Entity<CNCDevice>()
                .Property(d => d.DeviceName)
                .IsRequired()
                .HasMaxLength(100);

            modelBuilder.Entity<CNCDevice>()
                .Property(d => d.IPAddress)
                .IsRequired()
                .HasMaxLength(15);

            modelBuilder.Entity<CNCDevice>()
                .Property(d => d.HttpUrl)
                .IsRequired();

            // 用户配置
            modelBuilder.Entity<User>()
                .Property(u => u.Username)
                .IsRequired()
                .HasMaxLength(50);

            modelBuilder.Entity<User>()
                .Property(u => u.PasswordHash)
                .IsRequired()
                .HasMaxLength(255);

            modelBuilder.Entity<User>()
                .Property(u => u.RealName)
                .IsRequired()
                .HasMaxLength(50);

            // 角色配置
            modelBuilder.Entity<Role>()
                .Property(r => r.RoleName)
                .IsRequired()
                .HasMaxLength(50);

            modelBuilder.Entity<Role>()
                .Property(r => r.Permissions)
                .HasColumnType("json");

            // 员工配置
            modelBuilder.Entity<Employee>()
                .Property(e => e.EmployeeCode)
                .IsRequired()
                .HasMaxLength(50);

            modelBuilder.Entity<Employee>()
                .Property(e => e.Name)
                .IsRequired()
                .HasMaxLength(50);

            modelBuilder.Entity<Employee>()
                .Property(e => e.AssignedDevices)
                .HasColumnType("json");

            // 生产记录配置
            modelBuilder.Entity<ProductionRecordBasic>()
                .Property(p => p.NCProgram)
                .IsRequired()
                .HasMaxLength(100);

            // 模板配置
            modelBuilder.Entity<CNCBrandTemplate>()
                .Property(t => t.FieldMappings)
                .HasColumnType("json");

            modelBuilder.Entity<TemplateFieldMapping>()
                .Property(t => t.ConversionRule)
                .HasColumnType("json");

            // 统计规则配置
            modelBuilder.Entity<StatisticRule>()
                .Property(s => s.GroupByDimensions)
                .HasColumnType("json");

            // 告警配置
            modelBuilder.Entity<Alarm>()
                .Property(a => a.AlarmContent)
                .HasColumnType("text");

            // 系统配置配置
            modelBuilder.Entity<SystemConfig>()
                .Property(s => s.ConfigValue)
                .HasColumnType("text");

            // 告警统计配置
            modelBuilder.Entity<AlarmStatistics>()
                .Property(a => a.ResolutionRate)
                .HasColumnType("decimal(5,2)");

            // 告警通知配置

            // 权限配置
            modelBuilder.Entity<Permission>()
                .Property(p => p.Name)
                .IsRequired()
                .HasMaxLength(100);

            modelBuilder.Entity<Permission>()
                .Property(p => p.Category)
                .IsRequired()
                .HasMaxLength(50);

            // 用户权限配置
            modelBuilder.Entity<UserPermission>()
                .HasKey(up => new { up.UserId, up.PermissionId });

            modelBuilder.Entity<RolePermission>()
                .HasKey(rp => new { rp.RoleId, rp.PermissionId });

            // 用户会话配置
            modelBuilder.Entity<UserSession>()
                .Property(u => u.SessionToken)
                .IsRequired()
                .HasMaxLength(500);

            // 密码重置配置
            modelBuilder.Entity<PasswordReset>()
                .Property(p => p.Token)
                .IsRequired()
                .HasMaxLength(500);

            // 统计结果配置
            modelBuilder.Entity<StatisticResult>()
                .Property(s => s.GroupValues)
                .HasColumnType("json");

            // 采集任务配置
            modelBuilder.Entity<CollectionTask>()
                .Property(c => c.ErrorMessage)
                .HasColumnType("text");

            // 采集结果配置
            modelBuilder.Entity<CollectionResult>()
                .Property(c => c.RawJson)
                .HasColumnType("json");

            modelBuilder.Entity<CollectionResult>()
                .Property(c => c.ErrorMessage)
                .HasColumnType("text");

            // 采集日志配置
            modelBuilder.Entity<CollectionLog>()
                .Property(c => c.LogData)
                .HasColumnType("json");

            // 采集配置配置
            modelBuilder.Entity<CollectionConfig>()
                .Property(c => c.ConfigValue)
                .HasColumnType("text");
        }
    }

    public class CNCLLogDbContext : DbContext
    {
        public CNCLLogDbContext(DbContextOptions<CNCLLogDbContext> options) : base(options) { }

        public DbSet<RawCollectionData> RawCollectionData { get; set; }
        public DbSet<SystemLog> SystemLogs { get; set; }
        public DbSet<CollectionHistory> CollectionHistory { get; set; }
        public DbSet<PerformanceMetrics> PerformanceMetrics { get; set; }
        public DbSet<AlarmHistory> AlarmHistory { get; set; }
        public DbSet<OperationLog> OperationLogs { get; set; }
        public DbSet<DataArchive> DataArchive { get; set; }
        public DbSet<DbPerformanceStats> DbPerformanceStats { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            // 日志配置
            modelBuilder.Entity<SystemLog>()
                .Property(s => s.LogData)
                .HasColumnType("json");

            modelBuilder.Entity<RawCollectionData>()
                .Property(r => r.RawJson)
                .HasColumnType("json");

            modelBuilder.Entity<CollectionHistory>()
                .Property(c => c.DataSize)
                .IsRequired(false);

            // 性能指标配置
modelBuilder.Entity<PerformanceMetrics>()
                .Property(p => p.AvgExecutionTime)
                .HasColumnType("decimal(10,3)");

            modelBuilder.Entity<OperationLog>()
                .Property(o => o.LogData)
                .HasColumnType("json");

            // 数据归档配置
            modelBuilder.Entity<DataArchive>()
                .Property(d => d.ArchiveData)
                .HasColumnType("json");

            // 数据库性能统计配置
            modelBuilder.Entity<DbPerformanceStats>()
                .Property(d => d.AvgExecutionTime)
                .HasPrecision(10, 3);

            modelBuilder.Entity<DbPerformanceStats>()
                .Property(d => d.TotalExecutionTime)
                .HasPrecision(10, 3);
        }
    }

    // 日志库实体类
    public class RawCollectionData
    {
        public int Id { get; set; }
        public int DeviceId { get; set; }
        public DateTime CollectionTime { get; set; }
        public string RawJson { get; set; }
        public bool IsSuccess { get; set; }
        public string ErrorMessage { get; set; }
        public int RetryCount { get; set; }
        public DateTime CreatedAt { get; set; }
    }

    public class SystemLog
    {
        public int Id { get; set; }
        public string LogLevel { get; set; }
        public string LogCategory { get; set; }
        public string LogMessage { get; set; }
        public string LogData { get; set; }
        public string SourceMethod { get; set; }
        public string SourceFile { get; set; }
        public DateTime LogTime { get; set; }
        public DateTime CreatedAt { get; set; }
    }

    public class CollectionHistory
    {
        public int Id { get; set; }
        public int DeviceId { get; set; }
        public string CollectionStatus { get; set; }
        public int? ResponseTime { get; set; }
        public int? DataSize { get; set; }
        public string ErrorMessage { get; set; }
        public DateTime CollectionTime { get; set; }
        public DateTime CreatedAt { get; set; }
    }

    public class PerformanceMetrics
    {
        public int Id { get; set; }
        public string MetricName { get; set; }
        public decimal MetricValue { get; set; }
        public decimal AvgExecutionTime { get; set; }
        public string MetricUnit { get; set; }
        public DateTime CollectionTime { get; set; }
        public DateTime CreatedAt { get; set; }
    }

    public class AlarmHistory
    {
        public int Id { get; set; }
        public string AlarmType { get; set; }
        public string AlarmLevel { get; set; }
        public string AlarmContent { get; set; }
        public int? DeviceId { get; set; }
        public string DeviceName { get; set; }
        public bool IsResolved { get; set; }
        public DateTime OccurrenceTime { get; set; }
        public DateTime? ResolutionTime { get; set; }
        public string ResolutionNote { get; set; }
        public DateTime CreatedAt { get; set; }
    }

    public class OperationLog
    {
        public int Id { get; set; }
        public int? UserId { get; set; }
        public string Username { get; set; }
        public string OperationType { get; set; }
        public string OperationTarget { get; set; }
        public string OperationDetails { get; set; }
        public string LogData { get; set; }
        public string IPAddress { get; set; }
        public string UserAgent { get; set; }
        public DateTime OperationTime { get; set; }
        public DateTime CreatedAt { get; set; }
    }

    public class DataArchive
    {
        public int Id { get; set; }
        public string ArchiveType { get; set; }
        public string TableName { get; set; }
        public int RecordId { get; set; }
        public string ArchiveData { get; set; }
        public DateTime ArchiveTime { get; set; }
        public DateTime CreatedAt { get; set; }
    }

    public class DbPerformanceStats
    {
        public int Id { get; set; }
        public string QueryType { get; set; }
        public int QueryCount { get; set; }
        public decimal AvgExecutionTime { get; set; }
        public decimal TotalExecutionTime { get; set; }
        public int SlowQueryCount { get; set; }
        public DateTime StatsDate { get; set; }
        public DateTime CreatedAt { get; set; }
    }
}