﻿// <auto-generated />
using System;
using ChapterX.Infrastructure.Data.DataContext;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;

#nullable disable

namespace ChapterX.Infrastructure.Migrations
{
    [DbContext(typeof(ApplicationDbContext))]
    [Migration("20260824172555_InitialCreate")]
    partial class InitialCreate
    {
        /// <inheritdoc />
        protected override void BuildTargetModel(ModelBuilder modelBuilder)
        {
#pragma warning disable 612, 618
            modelBuilder
                .HasAnnotation("ProductVersion", "9.0.1")
                .HasAnnotation("Relational:MaxIdentifierLength", 63);

            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);

            modelBuilder.Entity("ChapterX.Domain.Entities.AISuggestion", b =>
                {
                    b.Property<int>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("integer")
                        .HasColumnName("suggestion_id");

                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));

                    b.Property<bool?>("Accepted")
                        .HasColumnType("boolean")
                        .HasColumnName("accepted");

                    b.Property<DateTime?>("AppliedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("applied_at");

                    b.Property<DateTime>("CreatedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("suggestion_created_at");

                    b.Property<string>("OriginalText")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("original_text");

                    b.Property<int>("StoryId")
                        .HasColumnType("integer")
                        .HasColumnName("story_id");

                    b.Property<string>("SuggestedText")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("suggested_text");

                    b.Property<string>("SuggestionType")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("suggestion_type");

                    b.HasKey("Id");

                    b.HasIndex("StoryId");

                    b.ToTable("ai_suggestion", (string)null);
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Admin", b =>
                {
                    b.Property<int>("Id")
                        .HasColumnType("integer")
                        .HasColumnName("user_id");

                    b.Property<DateTime>("AssignedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("assigned_at");

                    b.HasKey("Id");

                    b.ToTable("admins", (string)null);
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Chapter", b =>
                {
                    b.Property<int>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("integer")
                        .HasColumnName("chapter_id");

                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));

                    b.Property<string>("Content")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("chapter_content");

                    b.Property<DateTime>("CreatedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("chapter_created_at");

                    b.Property<string>("Name")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("chapter_name");

                    b.Property<int>("Number")
                        .HasColumnType("integer")
                        .HasColumnName("chapter_number");

                    b.Property<DateTime>("PublishedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("published_at");

                    b.Property<decimal?>("Rating")
                        .HasColumnType("numeric")
                        .HasColumnName("rating");

                    b.Property<int>("StoryId")
                        .HasColumnType("integer")
                        .HasColumnName("story_id");

                    b.Property<string>("Title")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("title");

                    b.Property<DateTime>("UpdatedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("chapter_updated_at");

                    b.Property<int>("ViewCount")
                        .HasColumnType("integer")
                        .HasColumnName("view_count");

                    b.Property<int?>("WordCount")
                        .HasColumnType("integer")
                        .HasColumnName("word_count");

                    b.HasKey("Id");

                    b.HasIndex("StoryId");

                    b.ToTable("chapter", (string)null);
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Collaboration", b =>
                {
                    b.Property<int>("UserId")
                        .HasColumnType("integer")
                        .HasColumnName("user_id");

                    b.Property<int>("StoryId")
                        .HasColumnType("integer")
                        .HasColumnName("story_id");

                    b.Property<DateTime>("CreatedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("collab_created_at");

                    b.Property<int?>("PermissionLevel")
                        .HasColumnType("integer")
                        .HasColumnName("permission_level");

                    b.Property<string>("Role")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("role");

                    b.HasKey("UserId", "StoryId");

                    b.HasIndex("StoryId");

                    b.ToTable("collaboration", (string)null);
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Comment", b =>
                {
                    b.Property<int>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("integer")
                        .HasColumnName("comment_id");

                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));

                    b.Property<string>("Content")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("comment_content");

                    b.Property<DateTime>("CreatedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("comment_created_at");

                    b.Property<int>("StoryId")
                        .HasColumnType("integer")
                        .HasColumnName("story_id");

                    b.Property<DateTime>("UpdatedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("comment_updated_at");

                    b.Property<int>("UserId")
                        .HasColumnType("integer")
                        .HasColumnName("user_id");

                    b.HasKey("Id");

                    b.HasIndex("StoryId");

                    b.HasIndex("UserId");

                    b.ToTable("comment", (string)null);
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Genre", b =>
                {
                    b.Property<int>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("integer")
                        .HasColumnName("genre_id");

                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));

                    b.Property<string>("Name")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("genre_name");

                    b.HasKey("Id");

                    b.ToTable("genre", (string)null);
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.HasGenre", b =>
                {
                    b.Property<int>("StoryId")
                        .HasColumnType("integer")
                        .HasColumnName("story_id");

                    b.Property<int>("GenreId")
                        .HasColumnType("integer")
                        .HasColumnName("genre_id");

                    b.HasKey("StoryId", "GenreId");

                    b.HasIndex("GenreId");

                    b.ToTable("has_genre", (string)null);
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Likes", b =>
                {
                    b.Property<int>("UserId")
                        .HasColumnType("integer")
                        .HasColumnName("user_id");

                    b.Property<int>("StoryId")
                        .HasColumnType("integer")
                        .HasColumnName("story_id");

                    b.Property<DateTime>("LikedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("liked_at");

                    b.HasKey("UserId", "StoryId");

                    b.HasIndex("StoryId");

                    b.ToTable("likes", (string)null);
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.NeedApproval", b =>
                {
                    b.Property<int>("SuggestionId")
                        .HasColumnType("integer")
                        .HasColumnName("suggestion_id");

                    b.Property<int>("StoryId")
                        .HasColumnType("integer")
                        .HasColumnName("story_id");

                    b.Property<int>("ChapterId")
                        .HasColumnType("integer")
                        .HasColumnName("chapter_id");

                    b.HasKey("SuggestionId", "StoryId", "ChapterId");

                    b.HasIndex("ChapterId");

                    b.HasIndex("StoryId");

                    b.ToTable("need_approval", (string)null);
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Notification", b =>
                {
                    b.Property<int>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("integer")
                        .HasColumnName("notification_id");

                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));

                    b.Property<string>("Content")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("notification_content");

                    b.Property<string>("ContentType")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("content_type");

                    b.Property<DateTime>("CreatedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("notification_created_at");

                    b.Property<bool>("IsRead")
                        .HasColumnType("boolean")
                        .HasColumnName("is_read");

                    b.Property<string>("Link")
                        .HasColumnType("text")
                        .HasColumnName("link");

                    b.Property<int?>("StoryId")
                        .HasColumnType("integer")
                        .HasColumnName("story_id");

                    b.Property<int>("UserId")
                        .HasColumnType("integer")
                        .HasColumnName("user_id");

                    b.HasKey("Id");

                    b.HasIndex("StoryId");

                    b.HasIndex("UserId");

                    b.ToTable("notification", (string)null);
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.ReadingList", b =>
                {
                    b.Property<int>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("integer")
                        .HasColumnName("list_id");

                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));

                    b.Property<string>("Content")
                        .HasColumnType("text")
                        .HasColumnName("list_content");

                    b.Property<DateTime>("CreatedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("list_created_at");

                    b.Property<bool>("IsPublic")
                        .HasColumnType("boolean")
                        .HasColumnName("is_public");

                    b.Property<string>("Name")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("list_name");

                    b.Property<DateTime>("UpdatedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("list_updated_at");

                    b.Property<int>("UserId")
                        .HasColumnType("integer")
                        .HasColumnName("user_id");

                    b.HasKey("Id");

                    b.HasIndex("UserId");

                    b.ToTable("reading_list", (string)null);
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.ReadingListItems", b =>
                {
                    b.Property<int>("ListId")
                        .HasColumnType("integer")
                        .HasColumnName("list_id");

                    b.Property<int>("StoryId")
                        .HasColumnType("integer")
                        .HasColumnName("story_id");

                    b.Property<DateTime>("AddedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("added_at");

                    b.HasKey("ListId", "StoryId");

                    b.HasIndex("StoryId");

                    b.ToTable("reading_list_items", (string)null);
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.RegularUser", b =>
                {
                    b.Property<int>("Id")
                        .HasColumnType("integer")
                        .HasColumnName("user_id");

                    b.Property<DateTime>("JoinedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("joined_at");

                    b.HasKey("Id");

                    b.ToTable("regular_user", (string)null);
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Story", b =>
                {
                    b.Property<int>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("integer")
                        .HasColumnName("story_id");

                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));

                    b.Property<string>("Content")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("story_content");

                    b.Property<DateTime>("CreatedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("story_created_at");

                    b.Property<string>("Image")
                        .HasColumnType("text")
                        .HasColumnName("image");

                    b.Property<bool>("MatureContent")
                        .HasColumnType("boolean")
                        .HasColumnName("mature_content");

                    b.Property<string>("ShortDescription")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("short_description");

                    b.Property<string>("Status")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("status");

                    b.Property<string>("Title")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("title");

                    b.Property<DateTime>("UpdatedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("story_updated_at");

                    b.Property<int>("UserId")
                        .HasColumnType("integer")
                        .HasColumnName("user_id");

                    b.HasKey("Id");

                    b.HasIndex("UserId");

                    b.ToTable("story", (string)null);
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.User", b =>
                {
                    b.Property<int>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("integer")
                        .HasColumnName("user_id");

                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));

                    b.Property<DateTime>("CreatedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("user_created_at");

                    b.Property<string>("Email")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("email");

                    b.Property<string>("Name")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("user_name");

                    b.Property<string>("Password")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("password");

                    b.Property<string>("Surname")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("surname");

                    b.Property<DateTime>("UpdatedAt")
                        .HasColumnType("timestamp with time zone")
                        .HasColumnName("user_updated_at");

                    b.Property<string>("Username")
                        .IsRequired()
                        .HasColumnType("text")
                        .HasColumnName("username");

                    b.HasKey("Id");

                    b.ToTable("users", (string)null);
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Writer", b =>
                {
                    b.Property<int>("Id")
                        .HasColumnType("integer")
                        .HasColumnName("user_id");

                    b.Property<string>("Bio")
                        .HasColumnType("text")
                        .HasColumnName("bio");

                    b.HasKey("Id");

                    b.ToTable("writer", (string)null);
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.AISuggestion", b =>
                {
                    b.HasOne("ChapterX.Domain.Entities.Story", "Story")
                        .WithMany("AISuggestions")
                        .HasForeignKey("StoryId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.Navigation("Story");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Admin", b =>
                {
                    b.HasOne("ChapterX.Domain.Entities.User", "User")
                        .WithOne("Admin")
                        .HasForeignKey("ChapterX.Domain.Entities.Admin", "Id")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.Navigation("User");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Chapter", b =>
                {
                    b.HasOne("ChapterX.Domain.Entities.Story", "Story")
                        .WithMany("Chapters")
                        .HasForeignKey("StoryId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.Navigation("Story");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Collaboration", b =>
                {
                    b.HasOne("ChapterX.Domain.Entities.Story", "Story")
                        .WithMany("Collaborations")
                        .HasForeignKey("StoryId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.HasOne("ChapterX.Domain.Entities.User", "User")
                        .WithMany("Collaborations")
                        .HasForeignKey("UserId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.Navigation("Story");

                    b.Navigation("User");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Comment", b =>
                {
                    b.HasOne("ChapterX.Domain.Entities.Story", "Story")
                        .WithMany("Comments")
                        .HasForeignKey("StoryId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.HasOne("ChapterX.Domain.Entities.User", "User")
                        .WithMany("Comments")
                        .HasForeignKey("UserId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.Navigation("Story");

                    b.Navigation("User");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.HasGenre", b =>
                {
                    b.HasOne("ChapterX.Domain.Entities.Genre", "Genre")
                        .WithMany("HasGenres")
                        .HasForeignKey("GenreId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.HasOne("ChapterX.Domain.Entities.Story", "Story")
                        .WithMany("HasGenres")
                        .HasForeignKey("StoryId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.Navigation("Genre");

                    b.Navigation("Story");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Likes", b =>
                {
                    b.HasOne("ChapterX.Domain.Entities.Story", "Story")
                        .WithMany("Likes")
                        .HasForeignKey("StoryId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.HasOne("ChapterX.Domain.Entities.User", "User")
                        .WithMany("Likes")
                        .HasForeignKey("UserId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.Navigation("Story");

                    b.Navigation("User");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.NeedApproval", b =>
                {
                    b.HasOne("ChapterX.Domain.Entities.Chapter", "Chapter")
                        .WithMany("NeedApprovals")
                        .HasForeignKey("ChapterId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.HasOne("ChapterX.Domain.Entities.Story", "Story")
                        .WithMany("NeedApprovals")
                        .HasForeignKey("StoryId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.HasOne("ChapterX.Domain.Entities.AISuggestion", "AISuggestion")
                        .WithMany("NeedApprovals")
                        .HasForeignKey("SuggestionId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.Navigation("AISuggestion");

                    b.Navigation("Chapter");

                    b.Navigation("Story");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Notification", b =>
                {
                    b.HasOne("ChapterX.Domain.Entities.Story", "Story")
                        .WithMany("Notifications")
                        .HasForeignKey("StoryId")
                        .OnDelete(DeleteBehavior.SetNull);

                    b.HasOne("ChapterX.Domain.Entities.User", "User")
                        .WithMany("Notifications")
                        .HasForeignKey("UserId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.Navigation("Story");

                    b.Navigation("User");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.ReadingList", b =>
                {
                    b.HasOne("ChapterX.Domain.Entities.User", "User")
                        .WithMany("ReadingLists")
                        .HasForeignKey("UserId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.Navigation("User");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.ReadingListItems", b =>
                {
                    b.HasOne("ChapterX.Domain.Entities.ReadingList", "ReadingList")
                        .WithMany("ReadingListItems")
                        .HasForeignKey("ListId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.HasOne("ChapterX.Domain.Entities.Story", "Story")
                        .WithMany("ReadingListItems")
                        .HasForeignKey("StoryId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.Navigation("ReadingList");

                    b.Navigation("Story");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.RegularUser", b =>
                {
                    b.HasOne("ChapterX.Domain.Entities.User", "User")
                        .WithOne("RegularUser")
                        .HasForeignKey("ChapterX.Domain.Entities.RegularUser", "Id")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.Navigation("User");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Story", b =>
                {
                    b.HasOne("ChapterX.Domain.Entities.Writer", "Writer")
                        .WithMany("Stories")
                        .HasForeignKey("UserId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.Navigation("Writer");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Writer", b =>
                {
                    b.HasOne("ChapterX.Domain.Entities.User", "User")
                        .WithOne("Writer")
                        .HasForeignKey("ChapterX.Domain.Entities.Writer", "Id")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.Navigation("User");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.AISuggestion", b =>
                {
                    b.Navigation("NeedApprovals");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Chapter", b =>
                {
                    b.Navigation("NeedApprovals");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Genre", b =>
                {
                    b.Navigation("HasGenres");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.ReadingList", b =>
                {
                    b.Navigation("ReadingListItems");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Story", b =>
                {
                    b.Navigation("AISuggestions");

                    b.Navigation("Chapters");

                    b.Navigation("Collaborations");

                    b.Navigation("Comments");

                    b.Navigation("HasGenres");

                    b.Navigation("Likes");

                    b.Navigation("NeedApprovals");

                    b.Navigation("Notifications");

                    b.Navigation("ReadingListItems");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.User", b =>
                {
                    b.Navigation("Admin");

                    b.Navigation("Collaborations");

                    b.Navigation("Comments");

                    b.Navigation("Likes");

                    b.Navigation("Notifications");

                    b.Navigation("ReadingLists");

                    b.Navigation("RegularUser");

                    b.Navigation("Writer");
                });

            modelBuilder.Entity("ChapterX.Domain.Entities.Writer", b =>
                {
                    b.Navigation("Stories");
                });
#pragma warning restore 612, 618
        }
    }
}
