using System;
using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace bitforum.Migrations.DefaultDb
{
    /// <inheritdoc />
    public partial class AddMember : Migration
    {
        /// <inheritdoc />
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AlterColumn<string>(
                name: "Image",
                table: "BannerItem",
                type: "nvarchar(1024)",
                maxLength: 1024,
                nullable: true,
                oldClrType: typeof(string),
                oldType: "nvarchar(1024)",
                oldMaxLength: 1024);

            migrationBuilder.CreateTable(
                name: "MemberApprove",
                columns: table => new
                {
                    ID = table.Column<int>(type: "int", nullable: false, comment: "회원 ID")
                        .Annotation("SqlServer:Identity", "1, 1"),
                    IsReceiveSMS = table.Column<bool>(type: "bit", nullable: false, comment: "SMS 수신 여부"),
                    IsReceiveEmail = table.Column<bool>(type: "bit", nullable: false, comment: "E-MAIL 수신 여부"),
                    IsReceiveNote = table.Column<bool>(type: "bit", nullable: false, comment: "쪽지 수신 여부"),
                    IsDisclosureInvest = table.Column<bool>(type: "bit", nullable: false, comment: "투자 현황 공개 여부")
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_MemberApprove", x => x.ID);
                },
                comment: "회원 동의 및 수신 여부");

            migrationBuilder.CreateTable(
                name: "MemberGrade",
                columns: table => new
                {
                    ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
                        .Annotation("SqlServer:Identity", "1, 1"),
                    KorName = table.Column<string>(type: "nvarchar(120)", maxLength: 120, nullable: false, comment: "한글 명"),
                    EngName = table.Column<string>(type: "nvarchar(120)", maxLength: 120, nullable: false, comment: "영문 명"),
                    Description = table.Column<string>(type: "nvarchar(1000)", maxLength: 1000, nullable: true, comment: "설명"),
                    Order = table.Column<short>(type: "smallint", nullable: false, comment: "순서"),
                    Image = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "이미지"),
                    RequiredExp = table.Column<int>(type: "int", nullable: false, comment: "최소 경험치(Exp)"),
                    RequiredCoin = table.Column<int>(type: "int", nullable: false, comment: "최소 코인(Coin)"),
                    IsActive = table.Column<bool>(type: "bit", nullable: false, comment: "사용 여부"),
                    UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "수정 일시"),
                    CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "등록 일시")
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_MemberGrade", x => x.ID);
                },
                comment: "회원 등급");

            migrationBuilder.CreateTable(
                name: "Member",
                columns: table => new
                {
                    ID = table.Column<int>(type: "int", nullable: false, comment: "PK"),
                    GradeID = table.Column<int>(type: "int", nullable: true, comment: "회원등급 ID"),
                    SID = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: false, comment: "SID"),
                    Email = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: false, comment: "이메일"),
                    Name = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: true, comment: "별명"),
                    FullName = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true, comment: "본명"),
                    FirstName = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: true, comment: "본명(성)"),
                    LastName = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true, comment: "본명(이름)"),
                    Password = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: false, comment: "비밀번호"),
                    Intro = table.Column<string>(type: "nvarchar(1000)", maxLength: 1000, nullable: true, comment: "자기소개"),
                    Summary = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: true, comment: "한마디"),
                    Coin = table.Column<long>(type: "bigint", nullable: false, comment: "코인"),
                    Exp = table.Column<int>(type: "int", nullable: false, comment: "경험치"),
                    Phone = table.Column<string>(type: "nvarchar(15)", maxLength: 15, nullable: true, comment: "연락처"),
                    Birthday = table.Column<DateOnly>(type: "date", maxLength: 10, nullable: true, comment: "생년월일"),
                    Gender = table.Column<int>(type: "int", maxLength: 6, nullable: true, comment: "성별"),
                    Photo = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: true, comment: "사진"),
                    IsEmailVerified = table.Column<bool>(type: "bit", nullable: false, comment: "이메일 인증 여부"),
                    IsAuthCertified = table.Column<bool>(type: "bit", nullable: false, comment: "본인 인증 여부"),
                    IsDenied = table.Column<bool>(type: "bit", nullable: false, comment: "차단 여부"),
                    IsAdmin = table.Column<bool>(type: "bit", nullable: false, comment: "운영진 여부"),
                    IsWithdraw = table.Column<bool>(type: "bit", nullable: false, comment: "탈퇴 여부"),
                    Following = table.Column<int>(type: "int", nullable: false, comment: "구독 중"),
                    Followed = table.Column<int>(type: "int", nullable: false, comment: "구독자"),
                    DeviceInfo = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: true, comment: "로그인 단말기 정보"),
                    SignupIP = table.Column<string>(type: "nvarchar(15)", maxLength: 15, nullable: false, comment: "회원가입 시 IP"),
                    LastLoginIp = table.Column<string>(type: "nvarchar(15)", maxLength: 15, nullable: true, comment: "마지막 로그인 IP"),
                    LastLoginAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "마지막 로그인 일시"),
                    EmailVerifiedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "이메일 인증 일시"),
                    AuthCertifiedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "본인인증 일시"),
                    PasswordUpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "비밀번호 변경 일시"),
                    CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "가입 일시"),
                    UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "수정 일시"),
                    DeletedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "탈퇴 일시")
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Member", x => x.ID);
                    table.ForeignKey(
                        name: "FK_Member_MemberApprove_ID",
                        column: x => x.ID,
                        principalTable: "MemberApprove",
                        principalColumn: "ID",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_Member_MemberGrade_GradeID",
                        column: x => x.GradeID,
                        principalTable: "MemberGrade",
                        principalColumn: "ID");
                },
                comment: "회원 정보");

            migrationBuilder.CreateIndex(
                name: "IX_BannerPosition_IsActive",
                table: "BannerPosition",
                column: "IsActive");

            migrationBuilder.CreateIndex(
                name: "IX_Member_Email",
                table: "Member",
                column: "Email",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_Member_GradeID",
                table: "Member",
                column: "GradeID");

            migrationBuilder.CreateIndex(
                name: "IX_Member_Name",
                table: "Member",
                column: "Name",
                unique: true,
                filter: "[Name] IS NOT NULL");

            migrationBuilder.CreateIndex(
                name: "IX_Member_SID",
                table: "Member",
                column: "SID",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_MemberGrade_EngName",
                table: "MemberGrade",
                column: "EngName",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_MemberGrade_KorName",
                table: "MemberGrade",
                column: "KorName",
                unique: true);
        }

        /// <inheritdoc />
        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "Member");

            migrationBuilder.DropTable(
                name: "MemberApprove");

            migrationBuilder.DropTable(
                name: "MemberGrade");

            migrationBuilder.DropIndex(
                name: "IX_BannerPosition_IsActive",
                table: "BannerPosition");

            migrationBuilder.AlterColumn<string>(
                name: "Image",
                table: "BannerItem",
                type: "nvarchar(1024)",
                maxLength: 1024,
                nullable: false,
                defaultValue: "",
                oldClrType: typeof(string),
                oldType: "nvarchar(1024)",
                oldMaxLength: 1024,
                oldNullable: true);
        }
    }
}
