using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;

namespace Database.Database;

public partial class ModelContext : DbContext
{
    public ModelContext()
    {
    }

    public ModelContext(DbContextOptions<ModelContext> options)
        : base(options)
    {
    }

    public virtual DbSet<AdminUser> AdminUsers { get; set; }

    public virtual DbSet<Area> Areas { get; set; }

    public virtual DbSet<Article> Articles { get; set; }

    public virtual DbSet<ArticleCategory> ArticleCategories { get; set; }

    public virtual DbSet<Banner> Banners { get; set; }

    public virtual DbSet<CmsContent> CmsContents { get; set; }

    public virtual DbSet<Config> Configs { get; set; }

    public virtual DbSet<ContactForm> ContactForms { get; set; }

    public virtual DbSet<Country> Countries { get; set; }

    public virtual DbSet<CountryArea> CountryAreas { get; set; }

    public virtual DbSet<CustomerInfo> CustomerInfos { get; set; }

    public virtual DbSet<CustomerReview> CustomerReviews { get; set; }

    public virtual DbSet<DeviceEsimCompatibility> DeviceEsimCompatibilities { get; set; }

    public virtual DbSet<Faq> Faqs { get; set; }

    public virtual DbSet<FaqCategory> FaqCategories { get; set; }

    public virtual DbSet<MessageQueue> MessageQueues { get; set; }

    public virtual DbSet<MessageQueueHi> MessageQueueHis { get; set; }

    public virtual DbSet<MessageTemplate> MessageTemplates { get; set; }

    public virtual DbSet<OrderDetail> OrderDetails { get; set; }

    public virtual DbSet<OrderHistory> OrderHistories { get; set; }

    public virtual DbSet<OtpVerification> OtpVerifications { get; set; }

    public virtual DbSet<SimInfo> SimInfos { get; set; }

    public virtual DbSet<SystemConfig> SystemConfigs { get; set; }

    public virtual DbSet<UserToken> UserTokens { get; set; }

    public virtual DbSet<Webservice> Webservices { get; set; }

    public virtual DbSet<WsUser> WsUsers { get; set; }

    // Oracle doesn't have boolean type - configure global conversion from bool to NUMBER(1)
    protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
    {
        configurationBuilder.Properties<bool>()
            .HaveConversion<BoolToZeroOneConverter<int>>();
        
        configurationBuilder.Properties<bool?>()
            .HaveConversion<BoolToZeroOneConverter<int?>>();
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder
            .HasDefaultSchema("LAOS_ESIM")
            .UseCollation("USING_NLS_COMP");


        modelBuilder.Entity<AdminUser>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("ADMIN_USER_PK");

            entity.ToTable("ADMIN_USER");

            entity.HasIndex(e => e.Email, "ADMIN_USER_EMAIL_UQ").IsUnique();

            entity.HasIndex(e => e.Username, "ADMIN_USER_USERNAME_UQ").IsUnique();

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.AvatarUrl)
                .HasMaxLength(500)
                .IsUnicode(false)
                .HasColumnName("AVATAR_URL");
            entity.Property(e => e.CreatedDate)
                .HasDefaultValueSql("SYSDATE")
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.Email)
                .HasMaxLength(200)
                .IsUnicode(false)
                .HasColumnName("EMAIL");
            entity.Property(e => e.FullName)
                .HasMaxLength(200)
                .HasColumnName("FULL_NAME");
            entity.Property(e => e.LastLoginDate)
                .HasColumnType("DATE")
                .HasColumnName("LAST_LOGIN_DATE");
            entity.Property(e => e.LastUpdate)
                .HasColumnType("DATE")
                .HasColumnName("LAST_UPDATE");
            entity.Property(e => e.PasswordHash)
                .HasMaxLength(500)
                .IsUnicode(false)
                .HasColumnName("PASSWORD_HASH");
            entity.Property(e => e.Role)
                .HasMaxLength(50)
                .IsUnicode(false)
                .HasDefaultValueSql("'EDITOR'")
                .HasColumnName("ROLE");
            entity.Property(e => e.Status)
                .HasPrecision(1)
                .HasDefaultValueSql("1")
                .HasColumnName("STATUS");
            entity.Property(e => e.Username)
                .HasMaxLength(100)
                .IsUnicode(false)
                .HasColumnName("USERNAME");
        });

        modelBuilder.Entity<Area>(entity =>
        {
            entity
                .HasNoKey()
                .ToTable("AREA");

            entity.Property(e => e.AreaCode)
                .HasMaxLength(100)
                .IsUnicode(false)
                .HasColumnName("AREA_CODE");
            entity.Property(e => e.AreaName1)
                .HasMaxLength(2000)
                .IsUnicode(false)
                .HasColumnName("AREA_NAME1");
            entity.Property(e => e.AreaName2)
                .HasMaxLength(2000)
                .IsUnicode(false)
                .HasColumnName("AREA_NAME2");
            entity.Property(e => e.Id)
                .HasPrecision(10)
                .HasColumnName("ID");
            entity.Property(e => e.ImgUrl)
                .HasMaxLength(200)
                .IsUnicode(false)
                .HasColumnName("IMG_URL");
            entity.Property(e => e.IsPopular)
                .HasPrecision(1)
                .HasColumnName("IS_POPULAR");
            entity.Property(e => e.Status)
                .HasPrecision(1)
                .HasColumnName("STATUS");
        });

        modelBuilder.Entity<Article>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("ARTICLE_PK");

            entity.ToTable("ARTICLE");

            entity.HasIndex(e => e.CategoryId, "ARTICLE_CATEGORY_IDX");

            entity.HasIndex(e => new { e.Slug, e.Language }, "ARTICLE_SLUG_LANG_UQ").IsUnique();

            entity.HasIndex(e => new { e.Status, e.PublishedDate }, "ARTICLE_STATUS_IDX");

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.AuthorId)
                .HasPrecision(10)
                .HasColumnName("AUTHOR_ID");
            entity.Property(e => e.CategoryId)
                .HasPrecision(10)
                .HasColumnName("CATEGORY_ID");
            entity.Property(e => e.Content)
                .HasColumnType("CLOB")
                .HasColumnName("CONTENT");
            entity.Property(e => e.ContentEn)
                .HasColumnType("CLOB")
                .HasColumnName("CONTENT_EN");
            entity.Property(e => e.ContentLo)
                .HasColumnType("CLOB")
                .HasColumnName("CONTENT_LO");
            entity.Property(e => e.CoverImageUrl)
                .HasMaxLength(1000)
                .IsUnicode(false)
                .HasColumnName("COVER_IMAGE_URL");
            entity.Property(e => e.CreatedBy)
                .HasPrecision(10)
                .HasColumnName("CREATED_BY");
            entity.Property(e => e.CreatedDate)
                .HasDefaultValueSql("SYSDATE")
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.IsFeatured)
                .HasPrecision(1)
                .HasDefaultValueSql("0")
                .HasColumnName("IS_FEATURED");
            entity.Property(e => e.IsPinned)
                .HasPrecision(1)
                .HasDefaultValueSql("0")
                .HasColumnName("IS_PINNED");
            entity.Property(e => e.Language)
                .HasMaxLength(10)
                .IsUnicode(false)
                .HasDefaultValueSql("'vi'")
                .HasColumnName("LANGUAGE");
            entity.Property(e => e.LastUpdate)
                .HasColumnType("DATE")
                .HasColumnName("LAST_UPDATE");
            entity.Property(e => e.MetaDescription)
                .HasMaxLength(500)
                .HasColumnName("META_DESCRIPTION");
            entity.Property(e => e.MetaDescriptionEn)
                .HasMaxLength(500)
                .HasColumnName("META_DESCRIPTION_EN");
            entity.Property(e => e.MetaDescriptionLo)
                .HasMaxLength(500)
                .HasColumnName("META_DESCRIPTION_LO");
            entity.Property(e => e.MetaKeywords)
                .HasMaxLength(500)
                .HasColumnName("META_KEYWORDS");
            entity.Property(e => e.PublishedDate)
                .HasColumnType("DATE")
                .HasColumnName("PUBLISHED_DATE");
            entity.Property(e => e.Slug)
                .HasMaxLength(500)
                .IsUnicode(false)
                .HasColumnName("SLUG");
            entity.Property(e => e.Status)
                .HasPrecision(1)
                .HasDefaultValueSql("0")
                .HasColumnName("STATUS");
            entity.Property(e => e.Summary).HasColumnName("SUMMARY");
            entity.Property(e => e.SummaryEn).HasColumnName("SUMMARY_EN");
            entity.Property(e => e.SummaryLo).HasColumnName("SUMMARY_LO");
            entity.Property(e => e.ThumbnailUrl)
                .HasMaxLength(1000)
                .IsUnicode(false)
                .HasColumnName("THUMBNAIL_URL");
            entity.Property(e => e.Title)
                .HasMaxLength(500)
                .HasColumnName("TITLE");
            entity.Property(e => e.TitleEn)
                .HasMaxLength(500)
                .HasColumnName("TITLE_EN");
            entity.Property(e => e.TitleLo)
                .HasMaxLength(500)
                .HasColumnName("TITLE_LO");
            entity.Property(e => e.UpdatedBy)
                .HasPrecision(10)
                .HasColumnName("UPDATED_BY");
            entity.Property(e => e.ViewCount)
                .HasPrecision(10)
                .HasDefaultValueSql("0")
                .HasColumnName("VIEW_COUNT");

            entity.HasOne(d => d.Category).WithMany(p => p.Articles)
                .HasForeignKey(d => d.CategoryId)
                .HasConstraintName("ARTICLE_CATEGORY_FK");
        });

        modelBuilder.Entity<ArticleCategory>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("ARTICLE_CATEGORY_PK");

            entity.ToTable("ARTICLE_CATEGORY");

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.CategoryName)
                .HasMaxLength(200)
                .HasColumnName("CATEGORY_NAME");
            entity.Property(e => e.CategoryNameEn)
                .HasMaxLength(200)
                .HasColumnName("CATEGORY_NAME_EN");
            entity.Property(e => e.CategoryNameLo)
                .HasMaxLength(200)
                .HasColumnName("CATEGORY_NAME_LO");
            entity.Property(e => e.CategorySlug)
                .HasMaxLength(200)
                .IsUnicode(false)
                .HasColumnName("CATEGORY_SLUG");
            entity.Property(e => e.CreatedDate)
                .HasDefaultValueSql("SYSDATE")
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.Description)
                .HasMaxLength(1000)
                .HasColumnName("DESCRIPTION");
            entity.Property(e => e.DescriptionEn)
                .HasMaxLength(1000)
                .HasColumnName("DESCRIPTION_EN");
            entity.Property(e => e.DescriptionLo)
                .HasMaxLength(1000)
                .HasColumnName("DESCRIPTION_LO");
            entity.Property(e => e.DisplayOrder)
                .HasPrecision(5)
                .HasDefaultValueSql("1")
                .HasColumnName("DISPLAY_ORDER");
            entity.Property(e => e.IconUrl)
                .HasMaxLength(500)
                .IsUnicode(false)
                .HasColumnName("ICON_URL");
            entity.Property(e => e.Language)
                .HasMaxLength(10)
                .IsUnicode(false)
                .HasDefaultValueSql("'lo'\n")
                .HasColumnName("LANGUAGE");
            entity.Property(e => e.LastUpdate)
                .HasColumnType("DATE")
                .HasColumnName("LAST_UPDATE");
            entity.Property(e => e.ParentId)
                .HasPrecision(10)
                .HasColumnName("PARENT_ID");
            entity.Property(e => e.Status)
                .HasPrecision(1)
                .HasDefaultValueSql("1")
                .HasColumnName("STATUS");

            entity.HasOne(d => d.Parent).WithMany(p => p.InverseParent)
                .HasForeignKey(d => d.ParentId)
                .HasConstraintName("ARTICLE_CATEGORY_PARENT_FK");
        });

        modelBuilder.Entity<Banner>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("BANNER_PK");

            entity.ToTable("BANNER");

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.CreatedBy)
                .HasPrecision(10)
                .HasColumnName("CREATED_BY");
            entity.Property(e => e.CreatedDate)
                .HasDefaultValueSql("SYSDATE")
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.DisplayOrder)
                .HasPrecision(5)
                .HasDefaultValueSql("1")
                .HasColumnName("DISPLAY_ORDER");
            entity.Property(e => e.EndDate)
                .HasColumnType("DATE")
                .HasColumnName("END_DATE");
            entity.Property(e => e.ImageMobileUrl)
                .HasMaxLength(1000)
                .IsUnicode(false)
                .HasColumnName("IMAGE_MOBILE_URL");
            entity.Property(e => e.ImageUrl)
                .HasMaxLength(1000)
                .IsUnicode(false)
                .HasColumnName("IMAGE_URL");
            entity.Property(e => e.Language)
                .HasMaxLength(10)
                .IsUnicode(false)
                .HasDefaultValueSql("'lo'  -- Ngôn ngữ mặc định\n")
                .HasColumnName("LANGUAGE");
            entity.Property(e => e.LastUpdate)
                .HasColumnType("DATE")
                .HasColumnName("LAST_UPDATE");
            entity.Property(e => e.LinkTarget)
                .HasMaxLength(20)
                .IsUnicode(false)
                .HasDefaultValueSql("'_self'")
                .HasColumnName("LINK_TARGET");
            entity.Property(e => e.LinkUrl)
                .HasMaxLength(1000)
                .IsUnicode(false)
                .HasColumnName("LINK_URL");
            entity.Property(e => e.Position)
                .HasMaxLength(50)
                .IsUnicode(false)
                .HasDefaultValueSql("'HOME'")
                .HasColumnName("POSITION");
            entity.Property(e => e.StartDate)
                .HasColumnType("DATE")
                .HasColumnName("START_DATE");
            entity.Property(e => e.Status)
                .HasPrecision(1)
                .HasDefaultValueSql("1")
                .HasColumnName("STATUS");
            entity.Property(e => e.Subtitle)
                .HasMaxLength(1000)
                .HasColumnName("SUBTITLE");
            entity.Property(e => e.SubtitleEn)
                .HasMaxLength(1000)
                .HasColumnName("SUBTITLE_EN");
            entity.Property(e => e.SubtitleLo)
                .HasMaxLength(1000)
                .HasColumnName("SUBTITLE_LO");
            entity.Property(e => e.Title)
                .HasMaxLength(500)
                .HasColumnName("TITLE");
            entity.Property(e => e.TitleEn)
                .HasMaxLength(500)
                .HasColumnName("TITLE_EN");
            entity.Property(e => e.TitleLo)
                .HasMaxLength(500)
                .HasColumnName("TITLE_LO");
        });

        modelBuilder.Entity<CmsContent>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("CMS_CONTENT_PK");

            entity.ToTable("CMS_CONTENT");

            entity.HasIndex(e => new { e.PageCode, e.Language }, "CMS_CONTENT_CODE_LANG_UQ").IsUnique();

            entity.HasIndex(e => new { e.PageSlug, e.Language }, "CMS_CONTENT_SLUG_UQ").IsUnique();

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.Content)
                .HasColumnType("CLOB")
                .HasColumnName("CONTENT");
            entity.Property(e => e.ContentEn)
                .HasColumnType("CLOB")
                .HasColumnName("CONTENT_EN");
            entity.Property(e => e.ContentLo)
                .HasColumnType("CLOB")
                .HasColumnName("CONTENT_LO");
            entity.Property(e => e.CreatedBy)
                .HasPrecision(10)
                .HasColumnName("CREATED_BY");
            entity.Property(e => e.CreatedDate)
                .HasDefaultValueSql("SYSDATE")
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.Language)
                .HasMaxLength(10)
                .IsUnicode(false)
                .HasDefaultValueSql("'vi'")
                .HasColumnName("LANGUAGE");
            entity.Property(e => e.LastUpdate)
                .HasColumnType("DATE")
                .HasColumnName("LAST_UPDATE");
            entity.Property(e => e.MetaDescription)
                .HasMaxLength(500)
                .HasColumnName("META_DESCRIPTION");
            entity.Property(e => e.MetaDescriptionEn)
                .HasMaxLength(500)
                .HasColumnName("META_DESCRIPTION_EN");
            entity.Property(e => e.MetaDescriptionLo)
                .HasMaxLength(500)
                .HasColumnName("META_DESCRIPTION_LO");
            entity.Property(e => e.MetaKeywords)
                .HasMaxLength(500)
                .HasColumnName("META_KEYWORDS");
            entity.Property(e => e.PageCode)
                .HasMaxLength(100)
                .IsUnicode(false)
                .HasColumnName("PAGE_CODE");
            entity.Property(e => e.PageSlug)
                .HasMaxLength(200)
                .IsUnicode(false)
                .HasColumnName("PAGE_SLUG");
            entity.Property(e => e.PageTitle)
                .HasMaxLength(500)
                .HasColumnName("PAGE_TITLE");
            entity.Property(e => e.PageTitleEn)
                .HasMaxLength(500)
                .HasColumnName("PAGE_TITLE_EN");
            entity.Property(e => e.PageTitleLo)
                .HasMaxLength(500)
                .HasColumnName("PAGE_TITLE_LO");
            entity.Property(e => e.PageType)
                .HasMaxLength(50)
                .IsUnicode(false)
                .HasDefaultValueSql("'STATIC'")
                .HasColumnName("PAGE_TYPE");
            entity.Property(e => e.Status)
                .HasPrecision(1)
                .HasDefaultValueSql("1")
                .HasColumnName("STATUS");
            entity.Property(e => e.UpdatedBy)
                .HasPrecision(10)
                .HasColumnName("UPDATED_BY");
        });

        modelBuilder.Entity<Config>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("CONFIG_PK");

            entity.ToTable("CONFIG");

            entity.Property(e => e.Id)
                .HasColumnType("NUMBER(38)")
                .HasColumnName("ID");
            entity.Property(e => e.Name)
                .HasMaxLength(100)
                .IsUnicode(false)
                .HasColumnName("NAME");
            entity.Property(e => e.Type)
                .HasMaxLength(20)
                .IsUnicode(false)
                .HasDefaultValueSql("'WEB' ")
                .HasColumnName("TYPE");
            entity.Property(e => e.ValueGlobal)
                .HasMaxLength(1000)
                .IsUnicode(false)
                .HasColumnName("VALUE_GLOBAL");
            entity.Property(e => e.ValueLocal)
                .HasMaxLength(1000)
                .IsUnicode(false)
                .HasColumnName("VALUE_LOCAL");
            entity.Property(e => e.Value)
                .HasMaxLength(1000)
                .IsUnicode(false)
                .HasColumnName("VALUE");
        });

        modelBuilder.Entity<ContactForm>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("CONTACT_FORM_PK");

            entity.ToTable("CONTACT_FORM");

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.AdminNotes).HasColumnName("ADMIN_NOTES");
            entity.Property(e => e.AssignedTo)
                .HasPrecision(10)
                .HasColumnName("ASSIGNED_TO");
            entity.Property(e => e.CreatedDate)
                .HasDefaultValueSql("SYSDATE")
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.Email)
                .HasMaxLength(200)
                .IsUnicode(false)
                .HasColumnName("EMAIL");
            entity.Property(e => e.FullName)
                .HasMaxLength(200)
                .HasColumnName("FULL_NAME");
            entity.Property(e => e.IpAddress)
                .HasMaxLength(50)
                .IsUnicode(false)
                .HasColumnName("IP_ADDRESS");
            entity.Property(e => e.Message)
                .HasColumnType("CLOB")
                .HasColumnName("MESSAGE");
            entity.Property(e => e.PhoneNumber)
                .HasMaxLength(20)
                .IsUnicode(false)
                .HasColumnName("PHONE_NUMBER");
            entity.Property(e => e.RepliedAt)
                .HasColumnType("DATE")
                .HasColumnName("REPLIED_AT");
            entity.Property(e => e.Status)
                .HasPrecision(2)
                .HasDefaultValueSql("0")
                .HasColumnName("STATUS");
            entity.Property(e => e.Subject)
                .HasMaxLength(500)
                .HasColumnName("SUBJECT");
        });

        modelBuilder.Entity<Country>(entity =>
        {
            entity
                .HasNoKey()
                .ToTable("COUNTRY");

            entity.Property(e => e.CountryCode)
                .HasMaxLength(100)
                .IsUnicode(false)
                .HasColumnName("COUNTRY_CODE");
            entity.Property(e => e.CountryName1)
                .HasMaxLength(1000)
                .IsUnicode(false)
                .HasColumnName("COUNTRY_NAME1");
            entity.Property(e => e.CountryName2)
                .HasMaxLength(1000)
                .IsUnicode(false)
                .HasColumnName("COUNTRY_NAME2");
            entity.Property(e => e.Id)
                .HasPrecision(10)
                .HasColumnName("ID");
            entity.Property(e => e.ImgUrl)
                .HasMaxLength(200)
                .IsUnicode(false)
                .HasColumnName("IMG_URL");
            entity.Property(e => e.IsPopular)
                .HasPrecision(1)
                .HasColumnName("IS_POPULAR");
            entity.Property(e => e.Status)
                .HasPrecision(1)
                .HasColumnName("STATUS");
        });

        modelBuilder.Entity<CountryArea>(entity =>
        {
            entity
                .HasNoKey()
                .ToTable("COUNTRY_AREA");

            entity.Property(e => e.AreaId)
                .HasPrecision(10)
                .HasColumnName("AREA_ID");
            entity.Property(e => e.CountryId)
                .HasPrecision(10)
                .HasColumnName("COUNTRY_ID");
            entity.Property(e => e.Id)
                .HasPrecision(10)
                .HasColumnName("ID");
        });

        modelBuilder.Entity<CustomerInfo>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("CUSTOMER_INFO_PK");

            entity.ToTable("CUSTOMER_INFO");

            entity.HasIndex(e => e.Email, "CUSTOMER_INFO_EMAIL_UQ").IsUnique();

            entity.Property(e => e.AvatarUrl)
                .HasMaxLength(1000)
                .IsUnicode(false)
                .HasColumnName("AVATAR_URL");
            entity.Property(e => e.CreatedDate)
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.Email)
                .HasMaxLength(200)
                .IsUnicode(false)
                .HasColumnName("EMAIL");
            entity.Property(e => e.GoogleId)
                .HasMaxLength(200)
                .IsUnicode(false)
                .HasColumnName("GOOGLE_ID");
            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.IsVerified)
                .HasPrecision(1)
                .HasDefaultValueSql("0")
                .HasColumnName("IS_VERIFIED");
            entity.Property(e => e.LastLoginDate)
                .HasColumnType("DATE")
                .HasColumnName("LAST_LOGIN_DATE");
            entity.Property(e => e.LastName)
                .HasMaxLength(500)
                .IsUnicode(false)
                .HasColumnName("LAST_NAME");
            entity.Property(e => e.LastUpdate)
                .HasColumnType("DATE")
                .HasColumnName("LAST_UPDATE");
            entity.Property(e => e.PasswordHash)
                .HasMaxLength(500)
                .IsUnicode(false)
                .HasColumnName("PASSWORD_HASH");
            entity.Property(e => e.PhoneNumber)
                .HasMaxLength(20)
                .IsUnicode(false)
                .HasColumnName("PHONE_NUMBER");
            entity.Property(e => e.Status)
                .HasPrecision(1)
                .HasDefaultValueSql("1")
                .HasColumnName("STATUS");
            entity.Property(e => e.SurName)
                .HasMaxLength(500)
                .IsUnicode(false)
                .HasColumnName("SUR_NAME");
        });

        modelBuilder.Entity<CustomerReview>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("CUSTOMER_REVIEW_PK");

            entity.ToTable("CUSTOMER_REVIEW");

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.ApprovedBy)
                .HasPrecision(10)
                .HasColumnName("APPROVED_BY");
            entity.Property(e => e.ApprovedDate)
                .HasColumnType("DATE")
                .HasColumnName("APPROVED_DATE");
            entity.Property(e => e.AvatarUrl)
                .HasMaxLength(500)
                .IsUnicode(false)
                .HasColumnName("AVATAR_URL");
            entity.Property(e => e.CreatedDate)
                .HasDefaultValueSql("SYSDATE")
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.CustomerName)
                .HasMaxLength(200)
                .HasColumnName("CUSTOMER_NAME");
            entity.Property(e => e.Destination)
                .HasMaxLength(200)
                .HasColumnName("DESTINATION");
            entity.Property(e => e.DestinationEn)
                .HasMaxLength(200)
                .HasColumnName("DESTINATION_EN");
            entity.Property(e => e.DestinationLo)
                .HasMaxLength(200)
                .HasColumnName("DESTINATION_LO");
            entity.Property(e => e.DisplayOrder)
                .HasPrecision(5)
                .HasDefaultValueSql("1")
                .HasColumnName("DISPLAY_ORDER");
            entity.Property(e => e.IsFeatured)
                .HasPrecision(1)
                .HasDefaultValueSql("0")
                .HasColumnName("IS_FEATURED");
            entity.Property(e => e.Language)
                .HasMaxLength(10)
                .IsUnicode(false)
                .HasDefaultValueSql("'lo'\n")
                .HasColumnName("LANGUAGE");
            entity.Property(e => e.Rating)
                .HasPrecision(1)
                .HasDefaultValueSql("5")
                .HasColumnName("RATING");
            entity.Property(e => e.ReviewContent).HasColumnName("REVIEW_CONTENT");
            entity.Property(e => e.ReviewContentEn).HasColumnName("REVIEW_CONTENT_EN");
            entity.Property(e => e.ReviewContentLo).HasColumnName("REVIEW_CONTENT_LO");
            entity.Property(e => e.Status)
                .HasPrecision(1)
                .HasDefaultValueSql("0")
                .HasColumnName("STATUS");
        });

        modelBuilder.Entity<DeviceEsimCompatibility>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("DEVICE_ESIM_COMPATIBILITY_PK");

            entity.ToTable("DEVICE_ESIM_COMPATIBILITY");

            entity.HasIndex(e => e.Brand, "IDX_DEVICE_BRAND");
            entity.HasIndex(e => e.ModelName, "IDX_DEVICE_MODEL");
            entity.HasIndex(e => new { e.IsPopular, e.Status }, "IDX_DEVICE_POPULAR");
            entity.HasIndex(e => new { e.Category, e.Status }, "IDX_DEVICE_CATEGORY");

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.Brand)
                .HasMaxLength(100)
                .HasColumnName("BRAND");
            entity.Property(e => e.ModelName)
                .HasMaxLength(200)
                .HasColumnName("MODEL_NAME");
            entity.Property(e => e.ModelNameEn)
                .HasMaxLength(200)
                .HasColumnName("MODEL_NAME_EN");
            entity.Property(e => e.ModelNameLo)
                .HasMaxLength(200)
                .HasColumnName("MODEL_NAME_LO");
            entity.Property(e => e.SupportsEsim)
                .HasPrecision(1)
                .HasDefaultValueSql("1")
                .HasColumnName("SUPPORTS_ESIM");
            entity.Property(e => e.Category)
                .HasMaxLength(50)
                .IsUnicode(false)
                .HasDefaultValueSql("'Phone'")
                .HasColumnName("CATEGORY");
            entity.Property(e => e.Notes)
                .HasMaxLength(1000)
                .HasColumnName("NOTES");
            entity.Property(e => e.NotesEn)
                .HasMaxLength(1000)
                .HasColumnName("NOTES_EN");
            entity.Property(e => e.NotesLo)
                .HasMaxLength(1000)
                .HasColumnName("NOTES_LO");
            entity.Property(e => e.IsPopular)
                .HasPrecision(1)
                .HasDefaultValueSql("0")
                .HasColumnName("IS_POPULAR");
            entity.Property(e => e.DisplayOrder)
                .HasPrecision(10)
                .HasDefaultValueSql("999")
                .HasColumnName("DISPLAY_ORDER");
            entity.Property(e => e.Status)
                .HasPrecision(1)
                .HasDefaultValueSql("1")
                .HasColumnName("STATUS");
            entity.Property(e => e.CreatedDate)
                .HasDefaultValueSql("SYSDATE")
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.UpdatedDate)
                .HasColumnType("DATE")
                .HasColumnName("UPDATED_DATE");
        });

        modelBuilder.Entity<Faq>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("FAQ_PK");

            entity.ToTable("FAQ");

            entity.HasIndex(e => e.CategoryId, "FAQ_CATEGORY_IDX");

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.Answer)
                .HasColumnType("CLOB")
                .HasColumnName("ANSWER");
            entity.Property(e => e.AnswerEn)
                .HasColumnType("CLOB")
                .HasColumnName("ANSWER_EN");
            entity.Property(e => e.AnswerLo)
                .HasColumnType("CLOB")
                .HasColumnName("ANSWER_LO");
            entity.Property(e => e.CategoryId)
                .HasPrecision(10)
                .HasColumnName("CATEGORY_ID");
            entity.Property(e => e.CreatedBy)
                .HasPrecision(10)
                .HasColumnName("CREATED_BY");
            entity.Property(e => e.CreatedDate)
                .HasDefaultValueSql("SYSDATE")
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.DisplayOrder)
                .HasPrecision(5)
                .HasDefaultValueSql("1")
                .HasColumnName("DISPLAY_ORDER");
            entity.Property(e => e.IsFeatured)
                .HasPrecision(1)
                .HasDefaultValueSql("0")
                .HasColumnName("IS_FEATURED");
            entity.Property(e => e.Language)
                .HasMaxLength(10)
                .IsUnicode(false)
                .HasDefaultValueSql("'vi'")
                .HasColumnName("LANGUAGE");
            entity.Property(e => e.LastUpdate)
                .HasColumnType("DATE")
                .HasColumnName("LAST_UPDATE");
            entity.Property(e => e.Question)
                .HasMaxLength(1000)
                .HasColumnName("QUESTION");
            entity.Property(e => e.QuestionEn)
                .HasMaxLength(1000)
                .HasColumnName("QUESTION_EN");
            entity.Property(e => e.QuestionLo)
                .HasMaxLength(1000)
                .HasColumnName("QUESTION_LO");
            entity.Property(e => e.Status)
                .HasPrecision(1)
                .HasDefaultValueSql("1")
                .HasColumnName("STATUS");
            entity.Property(e => e.ViewCount)
                .HasPrecision(10)
                .HasDefaultValueSql("0")
                .HasColumnName("VIEW_COUNT");

            entity.HasOne(d => d.Category).WithMany(p => p.Faqs)
                .HasForeignKey(d => d.CategoryId)
                .HasConstraintName("FAQ_CATEGORY_FK");
        });

        modelBuilder.Entity<FaqCategory>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("FAQ_CATEGORY_PK");

            entity.ToTable("FAQ_CATEGORY");

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.CategoryName)
                .HasMaxLength(200)
                .HasColumnName("CATEGORY_NAME");
            entity.Property(e => e.CategoryNameEn)
                .HasMaxLength(200)
                .HasColumnName("CATEGORY_NAME_EN");
            entity.Property(e => e.CategoryNameLo)
                .HasMaxLength(200)
                .HasColumnName("CATEGORY_NAME_LO");
            entity.Property(e => e.CategorySlug)
                .HasMaxLength(200)
                .IsUnicode(false)
                .HasColumnName("CATEGORY_SLUG");
            entity.Property(e => e.CreatedDate)
                .HasDefaultValueSql("SYSDATE")
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.Description)
                .HasMaxLength(1000)
                .HasColumnName("DESCRIPTION");
            entity.Property(e => e.DescriptionEn)
                .HasMaxLength(1000)
                .HasColumnName("DESCRIPTION_EN");
            entity.Property(e => e.DescriptionLo)
                .HasMaxLength(1000)
                .HasColumnName("DESCRIPTION_LO");
            entity.Property(e => e.DisplayOrder)
                .HasPrecision(5)
                .HasDefaultValueSql("1")
                .HasColumnName("DISPLAY_ORDER");
            entity.Property(e => e.IconUrl)
                .HasMaxLength(500)
                .IsUnicode(false)
                .HasColumnName("ICON_URL");
            entity.Property(e => e.Language)
                .HasMaxLength(10)
                .IsUnicode(false)
                .HasDefaultValueSql("'vi'")
                .HasColumnName("LANGUAGE");
            entity.Property(e => e.LastUpdate)
                .HasColumnType("DATE")
                .HasColumnName("LAST_UPDATE");
            entity.Property(e => e.ParentId)
                .HasPrecision(10)
                .HasColumnName("PARENT_ID");
            entity.Property(e => e.Status)
                .HasPrecision(1)
                .HasDefaultValueSql("1")
                .HasColumnName("STATUS");

            entity.HasOne(d => d.ParentCategory)
                .WithMany(p => p.ChildCategories)
                .HasForeignKey(d => d.ParentId)
                .HasConstraintName("FAQ_CATEGORY_PARENT_FK");
        });

        modelBuilder.Entity<MessageQueue>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("MESSAGE_QUEUE_PK");

            entity.ToTable("MESSAGE_QUEUE");

            entity.HasIndex(e => new { e.Status, e.Priority, e.ScheduledAt }, "MESSAGE_QUEUE_STATUS_IDX");

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.Content)
                .HasColumnType("CLOB")
                .HasColumnName("CONTENT");
            entity.Property(e => e.CreatedBy)
                .HasPrecision(10)
                .HasColumnName("CREATED_BY");
            entity.Property(e => e.CreatedDate)
                .HasDefaultValueSql("SYSDATE")
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.ErrorMessage)
                .HasMaxLength(2000)
                .IsUnicode(false)
                .HasColumnName("ERROR_MESSAGE");
            entity.Property(e => e.MaxRetry)
                .HasPrecision(2)
                .HasDefaultValueSql("3")
                .HasColumnName("MAX_RETRY");
            entity.Property(e => e.MessageType)
                .HasPrecision(2)
                .HasDefaultValueSql("1")
                .HasColumnName("MESSAGE_TYPE");
            entity.Property(e => e.Priority)
                .HasPrecision(1)
                .HasDefaultValueSql("5")
                .HasColumnName("PRIORITY");
            entity.Property(e => e.ProcessedAt)
                .HasColumnType("DATE")
                .HasColumnName("PROCESSED_AT");
            entity.Property(e => e.Recipient)
                .HasMaxLength(200)
                .IsUnicode(false)
                .HasColumnName("RECIPIENT");
            entity.Property(e => e.RetryCount)
                .HasPrecision(2)
                .HasDefaultValueSql("0")
                .HasColumnName("RETRY_COUNT");
            entity.Property(e => e.ScheduledAt)
                .HasColumnType("DATE")
                .HasColumnName("SCHEDULED_AT");
            entity.Property(e => e.Status)
                .HasPrecision(2)
                .HasDefaultValueSql("0")
                .HasColumnName("STATUS");
            entity.Property(e => e.Subject)
                .HasMaxLength(500)
                .HasColumnName("SUBJECT");
            entity.Property(e => e.TemplateCode)
                .HasMaxLength(50)
                .IsUnicode(false)
                .HasColumnName("TEMPLATE_CODE");
            entity.Property(e => e.TemplateData)
                .HasColumnType("CLOB")
                .HasColumnName("TEMPLATE_DATA");
        });

        modelBuilder.Entity<MessageQueueHi>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("MESSAGE_QUEUE_HIS_PK");

            entity.ToTable("MESSAGE_QUEUE_HIS");

            entity.HasIndex(e => e.MovedDate, "MESSAGE_QUEUE_HIS_DATE_IDX");

            entity.HasIndex(e => new { e.Recipient, e.MovedDate }, "MESSAGE_QUEUE_HIS_RECIPIENT_IDX");

            entity.HasIndex(e => new { e.Status, e.MovedDate }, "MESSAGE_QUEUE_HIS_STATUS_IDX");

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.Content)
                .HasColumnType("NCLOB")
                .HasColumnName("CONTENT");
            entity.Property(e => e.CreatedBy)
                .HasPrecision(10)
                .HasColumnName("CREATED_BY");
            entity.Property(e => e.CreatedDate)
                .HasPrecision(6)
                .HasDefaultValueSql("SYSTIMESTAMP")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.ErrorMessage)
                .HasMaxLength(2000)
                .IsUnicode(false)
                .HasColumnName("ERROR_MESSAGE");
            entity.Property(e => e.MaxRetry)
                .HasPrecision(3)
                .HasDefaultValueSql("3")
                .HasColumnName("MAX_RETRY");
            entity.Property(e => e.MessageType)
                .IsRequired()
                .HasPrecision(1)
                .HasDefaultValueSql("1 ")
                .HasColumnName("MESSAGE_TYPE");
            entity.Property(e => e.MovedDate)
                .HasPrecision(6)
                .HasDefaultValueSql("SYSTIMESTAMP")
                .HasColumnName("MOVED_DATE");
            entity.Property(e => e.Priority)
                .HasPrecision(1)
                .HasDefaultValueSql("0")
                .HasColumnName("PRIORITY");
            entity.Property(e => e.ProcessedAt)
                .HasPrecision(6)
                .HasColumnName("PROCESSED_AT");
            entity.Property(e => e.Recipient)
                .HasMaxLength(500)
                .IsUnicode(false)
                .HasColumnName("RECIPIENT");
            entity.Property(e => e.RetryCount)
                .HasPrecision(3)
                .HasDefaultValueSql("0")
                .HasColumnName("RETRY_COUNT");
            entity.Property(e => e.ScheduledAt)
                .HasPrecision(6)
                .HasColumnName("SCHEDULED_AT");
            entity.Property(e => e.Status)
                .IsRequired()
                .HasPrecision(1)
                .HasDefaultValueSql("0 ")
                .HasColumnName("STATUS");
            entity.Property(e => e.Subject)
                .HasMaxLength(500)
                .HasColumnName("SUBJECT");
            entity.Property(e => e.TemplateCode)
                .HasMaxLength(100)
                .IsUnicode(false)
                .HasColumnName("TEMPLATE_CODE");
            entity.Property(e => e.TemplateData)
                .HasColumnType("CLOB")
                .HasColumnName("TEMPLATE_DATA");
        });

        modelBuilder.Entity<MessageTemplate>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("MESSAGE_TEMPLATE_PK");

            entity.ToTable("MESSAGE_TEMPLATE");

            entity.HasIndex(e => e.TemplateCode, "MESSAGE_TEMPLATE_CODE_UQ").IsUnique();

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.Content)
                .HasColumnType("CLOB")
                .HasColumnName("CONTENT");
            entity.Property(e => e.ContentEn)
                .HasColumnType("CLOB")
                .HasColumnName("CONTENT_EN");
            entity.Property(e => e.ContentLo)
                .HasColumnType("CLOB")
                .HasColumnName("CONTENT_LO");
            entity.Property(e => e.CreatedDate)
                .HasDefaultValueSql("SYSDATE")
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.Language)
                .HasMaxLength(10)
                .IsUnicode(false)
                .HasDefaultValueSql("'lo'  -- Ngôn ngữ mặc định\n")
                .HasColumnName("LANGUAGE");
            entity.Property(e => e.LastUpdate)
                .HasColumnType("DATE")
                .HasColumnName("LAST_UPDATE");
            entity.Property(e => e.MessageType)
                .HasPrecision(2)
                .HasDefaultValueSql("1")
                .HasColumnName("MESSAGE_TYPE");
            entity.Property(e => e.Status)
                .HasPrecision(1)
                .HasDefaultValueSql("1")
                .HasColumnName("STATUS");
            entity.Property(e => e.Subject)
                .HasMaxLength(500)
                .HasColumnName("SUBJECT");
            entity.Property(e => e.SubjectEn)
                .HasMaxLength(500)
                .HasColumnName("SUBJECT_EN");
            entity.Property(e => e.SubjectLo)
                .HasMaxLength(500)
                .HasColumnName("SUBJECT_LO");
            entity.Property(e => e.TemplateCode)
                .HasMaxLength(50)
                .IsUnicode(false)
                .HasColumnName("TEMPLATE_CODE");
            entity.Property(e => e.TemplateName)
                .HasMaxLength(200)
                .HasColumnName("TEMPLATE_NAME");
            entity.Property(e => e.TemplateNameEn)
                .HasMaxLength(200)
                .HasColumnName("TEMPLATE_NAME_EN");
            entity.Property(e => e.TemplateNameLo)
                .HasMaxLength(200)
                .HasColumnName("TEMPLATE_NAME_LO");
            entity.Property(e => e.Variables)
                .HasMaxLength(1000)
                .IsUnicode(false)
                .HasColumnName("VARIABLES");
        });

        modelBuilder.Entity<OrderDetail>(entity =>
        {
            entity
                .HasNoKey()
                .ToTable("ORDER_DETAIL");

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .HasColumnName("ID");
            entity.Property(e => e.OrderId)
                .HasPrecision(10)
                .HasColumnName("ORDER_ID");
            entity.Property(e => e.PackageId)
                .HasPrecision(10)
                .HasColumnName("PACKAGE_ID");
            entity.Property(e => e.PaymentMoney)
                .HasColumnType("NUMBER(12,2)")
                .HasColumnName("PAYMENT_MONEY");
            entity.Property(e => e.Price)
                .HasColumnType("NUMBER(12,2)")
                .HasColumnName("PRICE");
            entity.Property(e => e.Quantity)
                .HasPrecision(10)
                .HasColumnName("QUANTITY");
            entity.Property(e => e.TotalMoney)
                .HasColumnType("NUMBER(12,2)")
                .HasColumnName("TOTAL_MONEY");
        });

        modelBuilder.Entity<OrderHistory>(entity =>
        {
            entity
                .HasNoKey()
                .ToTable("ORDER_HISTORY");

            entity.Property(e => e.CreatedDate)
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.CustomerId)
                .HasPrecision(10)
                .HasColumnName("CUSTOMER_ID");
            entity.Property(e => e.Discount)
                .HasColumnType("NUMBER(12,2)")
                .HasColumnName("DISCOUNT");
            entity.Property(e => e.Id)
                .HasPrecision(10)
                .HasColumnName("ID");
            entity.Property(e => e.LastUpdate)
                .HasColumnType("DATE")
                .HasColumnName("LAST_UPDATE");
            entity.Property(e => e.PaymentId)
                .HasPrecision(10)
                .HasColumnName("PAYMENT_ID");
            entity.Property(e => e.PaymentMoney)
                .HasColumnType("NUMBER(12,2)")
                .HasColumnName("PAYMENT_MONEY");
            entity.Property(e => e.PaymentStatus)
                .HasPrecision(2)
                .HasColumnName("PAYMENT_STATUS");
            entity.Property(e => e.Status)
                .HasPrecision(2)
                .HasColumnName("STATUS");
            entity.Property(e => e.TotalMoney)
                .HasColumnType("NUMBER(12,2)")
                .HasColumnName("TOTAL_MONEY");
        });

        modelBuilder.Entity<OtpVerification>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("OTP_VERIFICATION_PK");

            entity.ToTable("OTP_VERIFICATION");

            entity.HasIndex(e => new { e.UserEmail, e.IsUsed }, "OTP_EMAIL_IDX");

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.AttemptCount)
                .HasPrecision(2)
                .HasDefaultValueSql("0")
                .HasColumnName("ATTEMPT_COUNT");
            entity.Property(e => e.CreatedDate)
                .HasDefaultValueSql("SYSDATE")
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.CustomerId)
                .HasPrecision(10)
                .HasColumnName("CUSTOMER_ID");
            entity.Property(e => e.ExpiredAt)
                .HasColumnType("DATE")
                .HasColumnName("EXPIRED_AT");
            entity.Property(e => e.IsUsed)
                .HasPrecision(1)
                .HasDefaultValueSql("0")
                .HasColumnName("IS_USED");
            entity.Property(e => e.OtpCode)
                .HasMaxLength(10)
                .IsUnicode(false)
                .HasColumnName("OTP_CODE");
            entity.Property(e => e.OtpType)
                .HasPrecision(2)
                .HasDefaultValueSql("1")
                .HasColumnName("OTP_TYPE");
            entity.Property(e => e.UserEmail)
                .HasMaxLength(200)
                .IsUnicode(false)
                .HasColumnName("USER_EMAIL");
        });

        modelBuilder.Entity<SimInfo>(entity =>
        {
            entity
                .HasNoKey()
                .ToTable("SIM_INFO");

            entity.Property(e => e.CreatedDate)
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.Iccid)
                .HasMaxLength(200)
                .IsUnicode(false)
                .HasColumnName("ICCID");
            entity.Property(e => e.Id)
                .HasPrecision(10)
                .HasColumnName("ID");
            entity.Property(e => e.InstallationUrl)
                .HasMaxLength(1000)
                .IsUnicode(false)
                .HasColumnName("INSTALLATION_URL");
            entity.Property(e => e.OrderDetailId)
                .HasPrecision(10)
                .HasColumnName("ORDER_DETAIL_ID");
            entity.Property(e => e.Qrcode)
                .HasMaxLength(100)
                .IsUnicode(false)
                .HasColumnName("QRCODE");
            entity.Property(e => e.QrcodeUrl)
                .HasMaxLength(2000)
                .IsUnicode(false)
                .HasColumnName("QRCODE_URL");
        });

        modelBuilder.Entity<SystemConfig>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("SYSTEM_CONFIG_PK");

            entity.ToTable("SYSTEM_CONFIG");

            entity.HasIndex(e => e.ConfigKey, "SYSTEM_CONFIG_KEY_UQ").IsUnique();

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.ConfigKey)
                .HasMaxLength(100)
                .IsUnicode(false)
                .HasColumnName("CONFIG_KEY");
            entity.Property(e => e.ConfigType)
                .HasMaxLength(50)
                .IsUnicode(false)
                .HasDefaultValueSql("'STRING'")
                .HasColumnName("CONFIG_TYPE");
            entity.Property(e => e.ConfigValue).HasColumnName("CONFIG_VALUE");
            entity.Property(e => e.CreatedDate)
                .HasDefaultValueSql("SYSDATE")
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.Description)
                .HasMaxLength(500)
                .HasColumnName("DESCRIPTION");
            entity.Property(e => e.IsEditable)
                .HasPrecision(1)
                .HasDefaultValueSql("1")
                .HasColumnName("IS_EDITABLE");
            entity.Property(e => e.LastUpdate)
                .HasColumnType("DATE")
                .HasColumnName("LAST_UPDATE");
        });

        modelBuilder.Entity<UserToken>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("USER_TOKEN_PK");

            entity.ToTable("USER_TOKEN");

            entity.HasIndex(e => e.AccessToken, "USER_TOKEN_ACCESS_IDX");

            entity.HasIndex(e => e.CustomerId, "USER_TOKEN_CUSTOMER_IDX");

            entity.Property(e => e.Id)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("ID");
            entity.Property(e => e.AccessToken)
                .HasMaxLength(500)
                .IsUnicode(false)
                .HasColumnName("ACCESS_TOKEN");
            entity.Property(e => e.CreatedDate)
                .HasDefaultValueSql("SYSDATE")
                .HasColumnType("DATE")
                .HasColumnName("CREATED_DATE");
            entity.Property(e => e.CustomerId)
                .HasPrecision(10)
                .HasColumnName("CUSTOMER_ID");
            entity.Property(e => e.DeviceInfo)
                .HasMaxLength(500)
                .IsUnicode(false)
                .HasColumnName("DEVICE_INFO");
            entity.Property(e => e.ExpiredAt)
                .HasColumnType("DATE")
                .HasColumnName("EXPIRED_AT");
            entity.Property(e => e.IpAddress)
                .HasMaxLength(50)
                .IsUnicode(false)
                .HasColumnName("IP_ADDRESS");
            entity.Property(e => e.IsRevoked)
                .HasPrecision(1)
                .HasDefaultValueSql("0")
                .HasColumnName("IS_REVOKED");
            entity.Property(e => e.LastUsed)
                .HasColumnType("DATE")
                .HasColumnName("LAST_USED");
            entity.Property(e => e.RefreshExpiredAt)
                .HasColumnType("DATE")
                .HasColumnName("REFRESH_EXPIRED_AT");
            entity.Property(e => e.RefreshToken)
                .HasMaxLength(500)
                .IsUnicode(false)
                .HasColumnName("REFRESH_TOKEN");
            entity.Property(e => e.TokenType)
                .HasMaxLength(50)
                .IsUnicode(false)
                .HasDefaultValueSql("'Bearer'")
                .HasColumnName("TOKEN_TYPE");
        });

        modelBuilder.Entity<Webservice>(entity =>
        {
            entity.HasKey(e => e.WsId).HasName("WS_PK");

            entity.ToTable("WEBSERVICE");

            entity.Property(e => e.WsId)
                .HasPrecision(10)
                .ValueGeneratedNever()
                .HasColumnName("WS_ID");
            entity.Property(e => e.ErrorTag)
                .HasMaxLength(100)
                .IsUnicode(false)
                .HasColumnName("ERROR_TAG");
            entity.Property(e => e.MsgTemplate)
                .HasMaxLength(2000)
                .IsUnicode(false)
                .HasColumnName("MSG_TEMPLATE");
            entity.Property(e => e.RequestType)
                .HasMaxLength(100)
                .IsUnicode(false)
                .HasColumnName("REQUEST_TYPE");
            entity.Property(e => e.ResponseTag)
                .HasMaxLength(100)
                .IsUnicode(false)
                .HasColumnName("RESPONSE_TAG");
            entity.Property(e => e.Status)
                .HasPrecision(1)
                .HasColumnName("STATUS");
            entity.Property(e => e.WsCode)
                .HasMaxLength(100)
                .IsUnicode(false)
                .HasColumnName("WS_CODE");
            entity.Property(e => e.WsName)
                .HasMaxLength(1000)
                .IsUnicode(false)
                .HasColumnName("WS_NAME");
            entity.Property(e => e.Wsdl)
                .HasMaxLength(1000)
                .IsUnicode(false)
                .HasColumnName("WSDL");
        });

        modelBuilder.Entity<WsUser>(entity =>
        {
            entity
                .HasNoKey()
                .ToTable("WS_USER");

            entity.Property(e => e.IpAddress)
                .HasMaxLength(100)
                .IsUnicode(false)
                .HasColumnName("IP_ADDRESS");
            entity.Property(e => e.Password)
                .HasMaxLength(100)
                .IsUnicode(false)
                .HasColumnName("PASSWORD");
            entity.Property(e => e.Username)
                .HasMaxLength(100)
                .IsUnicode(false)
                .HasColumnName("USERNAME");
            entity.Property(e => e.WsUserId)
                .HasPrecision(10)
                .HasColumnName("WS_USER_ID");
        });
        modelBuilder.HasSequence("ADMIN_USER_SEQ");
        modelBuilder.HasSequence("ARTICLE_CATEGORY_SEQ");
        modelBuilder.HasSequence("ARTICLE_SEQ");
        modelBuilder.HasSequence("BANNER_SEQ");
        modelBuilder.HasSequence("CMS_CONTENT_SEQ");
        modelBuilder.HasSequence("CONFIG_SEQ");
        modelBuilder.HasSequence("CONTACT_FORM_SEQ");
        modelBuilder.HasSequence("COUNTRY_SEQ");
        modelBuilder.HasSequence("CUSTOMER_INFO_SEQ");
        modelBuilder.HasSequence("CUSTOMER_REVIEW_SEQ");
        modelBuilder.HasSequence("FAQ_CATEGORY_SEQ");
        modelBuilder.HasSequence("FAQ_SEQ");
        modelBuilder.HasSequence("MESSAGE_QUEUE_SEQ");
        modelBuilder.HasSequence("MESSAGE_TEMPLATE_SEQ");
        modelBuilder.HasSequence("ORDER_DETAIL_SEQ");
        modelBuilder.HasSequence("ORDER_HISTORY_SEQ");
        modelBuilder.HasSequence("OTP_VERIFICATION_SEQ");
        modelBuilder.HasSequence("PACKG_SEQ");
        modelBuilder.HasSequence("SIM_INFO_SEQ");
        modelBuilder.HasSequence("SYSTEM_CONFIG_SEQ");
        modelBuilder.HasSequence("USER_TOKEN_SEQ");

        OnModelCreatingPartial(modelBuilder);
    }

    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
