using Fengling.AuthService.Models;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

namespace Fengling.AuthService.Data;

public class ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
    : IdentityDbContext<ApplicationUser, ApplicationRole, long>(options)
{
    public DbSet<AccessLog> AccessLogs { get; set; }
    public DbSet<AuditLog> AuditLogs { get; set; }

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

        builder.Entity<ApplicationUser>(entity =>
        {
            entity.Property(e => e.RealName).HasMaxLength(100);
            entity.Property(e => e.Phone).HasMaxLength(20);
            entity.HasIndex(e => e.Phone).IsUnique();

            entity.OwnsOne(e => e.TenantInfo, navigationBuilder =>
            {
                navigationBuilder.Property(e => e.TenantCode).HasColumnName("TenantCode");
                navigationBuilder.Property(e => e.TenantId).HasColumnName("TenantId");
                navigationBuilder.Property(e => e.TenantName).HasColumnName("TenantName");
                navigationBuilder.WithOwner();
            });
        });

        builder.Entity<ApplicationRole>(entity => { entity.Property(e => e.Description).HasMaxLength(200); });

       

        builder.Entity<AccessLog>(entity =>
        {
            entity.HasKey(e => e.Id);
            entity.HasIndex(e => e.CreatedAt);
            entity.HasIndex(e => e.UserName);
            entity.HasIndex(e => e.TenantId);
            entity.HasIndex(e => e.Action);
            entity.HasIndex(e => e.Status);
            entity.Property(e => e.UserName).HasMaxLength(50);
            entity.Property(e => e.TenantId).HasMaxLength(50);
            entity.Property(e => e.Action).HasMaxLength(20);
            entity.Property(e => e.Resource).HasMaxLength(200);
            entity.Property(e => e.Method).HasMaxLength(10);
            entity.Property(e => e.IpAddress).HasMaxLength(50);
            entity.Property(e => e.UserAgent).HasMaxLength(500);
            entity.Property(e => e.Status).HasMaxLength(20);
        });

        builder.Entity<AuditLog>(entity =>
        {
            entity.HasKey(e => e.Id);
            entity.HasIndex(e => e.CreatedAt);
            entity.HasIndex(e => e.Operator);
            entity.HasIndex(e => e.TenantId);
            entity.HasIndex(e => e.Operation);
            entity.HasIndex(e => e.Action);
            entity.Property(e => e.Operator).HasMaxLength(50);
            entity.Property(e => e.TenantId).HasMaxLength(50);
            entity.Property(e => e.Operation).HasMaxLength(20);
            entity.Property(e => e.Action).HasMaxLength(20);
            entity.Property(e => e.TargetType).HasMaxLength(50);
            entity.Property(e => e.TargetName).HasMaxLength(100);
            entity.Property(e => e.IpAddress).HasMaxLength(50);
            entity.Property(e => e.Description).HasMaxLength(500);
            entity.Property(e => e.Status).HasMaxLength(20);
        });
    }
}