using System;
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;

#nullable disable

namespace Managing.Infrastructure.Databases.Migrations
{
    /// <inheritdoc />
    public partial class Init : Migration
    {
        /// <inheritdoc />
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "Backtests",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Identifier = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    RequestId = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    FinalPnl = table.Column<decimal>(type: "numeric(18,8)", nullable: false),
                    WinRate = table.Column<int>(type: "integer", nullable: false),
                    GrowthPercentage = table.Column<decimal>(type: "numeric(18,8)", nullable: false),
                    HodlPercentage = table.Column<decimal>(type: "numeric(18,8)", nullable: false),
                    ConfigJson = table.Column<string>(type: "jsonb", nullable: false),
                    PositionsJson = table.Column<string>(type: "jsonb", nullable: false),
                    SignalsJson = table.Column<string>(type: "jsonb", nullable: false),
                    StartDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    EndDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    MoneyManagementJson = table.Column<string>(type: "jsonb", nullable: false),
                    UserName = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    StatisticsJson = table.Column<string>(type: "jsonb", nullable: true),
                    Fees = table.Column<decimal>(type: "numeric(18,8)", nullable: false),
                    Score = table.Column<double>(type: "double precision", nullable: false),
                    ScoreMessage = table.Column<string>(type: "text", maxLength: 1000, nullable: false),
                    Metadata = table.Column<string>(type: "text", nullable: true),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Backtests", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "FundingRates",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Ticker = table.Column<int>(type: "integer", nullable: false),
                    Exchange = table.Column<int>(type: "integer", nullable: false),
                    Rate = table.Column<decimal>(type: "numeric(18,8)", precision: 18, scale: 8, nullable: false),
                    OpenInterest = table.Column<decimal>(type: "numeric(18,8)", precision: 18, scale: 8, nullable: false),
                    Date = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    Direction = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_FundingRates", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "Indicators",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    Type = table.Column<string>(type: "text", nullable: false),
                    Timeframe = table.Column<string>(type: "text", nullable: false),
                    SignalType = table.Column<string>(type: "text", nullable: false),
                    MinimumHistory = table.Column<int>(type: "integer", nullable: false),
                    Period = table.Column<int>(type: "integer", nullable: true),
                    FastPeriods = table.Column<int>(type: "integer", nullable: true),
                    SlowPeriods = table.Column<int>(type: "integer", nullable: true),
                    SignalPeriods = table.Column<int>(type: "integer", nullable: true),
                    Multiplier = table.Column<double>(type: "double precision", nullable: true),
                    StochPeriods = table.Column<int>(type: "integer", nullable: true),
                    SmoothPeriods = table.Column<int>(type: "integer", nullable: true),
                    CyclePeriods = table.Column<int>(type: "integer", nullable: true),
                    UserName = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: true),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Indicators", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "Scenarios",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    LoopbackPeriod = table.Column<int>(type: "integer", nullable: false),
                    UserName = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: true),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Scenarios", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "Signals",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Identifier = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    Direction = table.Column<string>(type: "text", nullable: false),
                    Confidence = table.Column<string>(type: "text", nullable: false),
                    Date = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    Ticker = table.Column<string>(type: "text", nullable: false),
                    Status = table.Column<string>(type: "text", nullable: false),
                    Timeframe = table.Column<string>(type: "text", nullable: false),
                    Type = table.Column<string>(type: "text", nullable: false),
                    SignalType = table.Column<string>(type: "text", nullable: false),
                    IndicatorName = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    UserName = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: true),
                    CandleJson = table.Column<string>(type: "text", nullable: true),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Signals", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "SpotlightOverviews",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Identifier = table.Column<Guid>(type: "uuid", nullable: false),
                    DateTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    ScenarioCount = table.Column<int>(type: "integer", nullable: false),
                    SpotlightsJson = table.Column<string>(type: "jsonb", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_SpotlightOverviews", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "SynthMinersLeaderboards",
                columns: table => new
                {
                    Id = table.Column<Guid>(type: "uuid", nullable: false),
                    Asset = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false),
                    TimeIncrement = table.Column<int>(type: "integer", nullable: false),
                    SignalDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    IsBacktest = table.Column<bool>(type: "boolean", nullable: false),
                    MinersData = table.Column<string>(type: "jsonb", nullable: false),
                    CacheKey = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_SynthMinersLeaderboards", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "SynthPredictions",
                columns: table => new
                {
                    Id = table.Column<Guid>(type: "uuid", nullable: false),
                    Asset = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false),
                    MinerUid = table.Column<int>(type: "integer", nullable: false),
                    TimeIncrement = table.Column<int>(type: "integer", nullable: false),
                    TimeLength = table.Column<int>(type: "integer", nullable: false),
                    SignalDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    IsBacktest = table.Column<bool>(type: "boolean", nullable: false),
                    PredictionData = table.Column<string>(type: "jsonb", nullable: false),
                    CacheKey = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_SynthPredictions", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "TopVolumeTickers",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Ticker = table.Column<int>(type: "integer", nullable: false),
                    Date = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    Volume = table.Column<decimal>(type: "numeric(18,8)", precision: 18, scale: 8, nullable: false),
                    Rank = table.Column<int>(type: "integer", nullable: false),
                    Exchange = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_TopVolumeTickers", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "Traders",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Address = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    Winrate = table.Column<int>(type: "integer", nullable: false),
                    Pnl = table.Column<decimal>(type: "numeric(18,8)", precision: 18, scale: 8, nullable: false),
                    TradeCount = table.Column<int>(type: "integer", nullable: false),
                    AverageWin = table.Column<decimal>(type: "numeric(18,8)", precision: 18, scale: 8, nullable: false),
                    AverageLoss = table.Column<decimal>(type: "numeric(18,8)", precision: 18, scale: 8, nullable: false),
                    Roi = table.Column<decimal>(type: "numeric(18,8)", precision: 18, scale: 8, nullable: false),
                    IsBestTrader = table.Column<bool>(type: "boolean", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Traders", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "Trades",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Date = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    Direction = table.Column<string>(type: "text", nullable: false),
                    Status = table.Column<string>(type: "text", nullable: false),
                    TradeType = table.Column<string>(type: "text", nullable: false),
                    Ticker = table.Column<string>(type: "text", nullable: false),
                    Fee = table.Column<decimal>(type: "numeric(18,8)", nullable: false),
                    Quantity = table.Column<decimal>(type: "numeric(18,8)", nullable: false),
                    Price = table.Column<decimal>(type: "numeric(18,8)", nullable: false),
                    Leverage = table.Column<decimal>(type: "numeric(18,8)", nullable: false),
                    ExchangeOrderId = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: true),
                    Message = table.Column<string>(type: "text", nullable: true),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Trades", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "Users",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    AgentName = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: true),
                    AvatarUrl = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: true),
                    TelegramChannel = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Users", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "Workers",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    WorkerType = table.Column<string>(type: "text", nullable: false),
                    StartTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    LastRunTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    ExecutionCount = table.Column<int>(type: "integer", nullable: false),
                    DelayTicks = table.Column<long>(type: "bigint", nullable: false),
                    IsActive = table.Column<bool>(type: "boolean", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Workers", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "ScenarioIndicators",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    ScenarioId = table.Column<int>(type: "integer", nullable: false),
                    IndicatorId = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_ScenarioIndicators", x => x.Id);
                    table.ForeignKey(
                        name: "FK_ScenarioIndicators_Indicators_IndicatorId",
                        column: x => x.IndicatorId,
                        principalTable: "Indicators",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_ScenarioIndicators_Scenarios_ScenarioId",
                        column: x => x.ScenarioId,
                        principalTable: "Scenarios",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "Positions",
                columns: table => new
                {
                    Identifier = table.Column<Guid>(type: "uuid", nullable: false),
                    Date = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    ProfitAndLoss = table.Column<decimal>(type: "numeric(18,8)", nullable: false),
                    OriginDirection = table.Column<string>(type: "text", nullable: false),
                    Status = table.Column<string>(type: "text", nullable: false),
                    Ticker = table.Column<string>(type: "text", nullable: false),
                    Initiator = table.Column<string>(type: "text", nullable: false),
                    SignalIdentifier = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    AccountName = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    UserName = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: true),
                    OpenTradeId = table.Column<int>(type: "integer", nullable: true),
                    StopLossTradeId = table.Column<int>(type: "integer", nullable: true),
                    TakeProfit1TradeId = table.Column<int>(type: "integer", nullable: true),
                    TakeProfit2TradeId = table.Column<int>(type: "integer", nullable: true),
                    MoneyManagementJson = table.Column<string>(type: "text", nullable: true),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Positions", x => x.Identifier);
                    table.ForeignKey(
                        name: "FK_Positions_Trades_OpenTradeId",
                        column: x => x.OpenTradeId,
                        principalTable: "Trades",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.SetNull);
                    table.ForeignKey(
                        name: "FK_Positions_Trades_StopLossTradeId",
                        column: x => x.StopLossTradeId,
                        principalTable: "Trades",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.SetNull);
                    table.ForeignKey(
                        name: "FK_Positions_Trades_TakeProfit1TradeId",
                        column: x => x.TakeProfit1TradeId,
                        principalTable: "Trades",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.SetNull);
                    table.ForeignKey(
                        name: "FK_Positions_Trades_TakeProfit2TradeId",
                        column: x => x.TakeProfit2TradeId,
                        principalTable: "Trades",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.SetNull);
                });

            migrationBuilder.CreateTable(
                name: "Accounts",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    Exchange = table.Column<string>(type: "text", nullable: false),
                    Type = table.Column<string>(type: "text", nullable: false),
                    Key = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: true),
                    Secret = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: true),
                    UserId = table.Column<int>(type: "integer", nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Accounts", x => x.Id);
                    table.ForeignKey(
                        name: "FK_Accounts_Users_UserId",
                        column: x => x.UserId,
                        principalTable: "Users",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.SetNull);
                });

            migrationBuilder.CreateTable(
                name: "AgentSummaries",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    UserId = table.Column<int>(type: "integer", nullable: false),
                    AgentName = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    TotalPnL = table.Column<decimal>(type: "numeric(18,8)", nullable: false),
                    TotalROI = table.Column<decimal>(type: "numeric(18,8)", nullable: false),
                    Wins = table.Column<int>(type: "integer", nullable: false),
                    Losses = table.Column<int>(type: "integer", nullable: false),
                    Runtime = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    ActiveStrategiesCount = table.Column<int>(type: "integer", nullable: false),
                    TotalVolume = table.Column<decimal>(type: "numeric(18,8)", precision: 18, scale: 8, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_AgentSummaries", x => x.Id);
                    table.ForeignKey(
                        name: "FK_AgentSummaries_Users_UserId",
                        column: x => x.UserId,
                        principalTable: "Users",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "Bots",
                columns: table => new
                {
                    Identifier = table.Column<Guid>(type: "uuid", maxLength: 255, nullable: false),
                    Name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    Ticker = table.Column<int>(type: "integer", nullable: false),
                    UserId = table.Column<int>(type: "integer", nullable: false),
                    Status = table.Column<string>(type: "text", nullable: false),
                    CreateDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    StartupTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    TradeWins = table.Column<int>(type: "integer", nullable: false),
                    TradeLosses = table.Column<int>(type: "integer", nullable: false),
                    Pnl = table.Column<decimal>(type: "numeric(18,8)", precision: 18, scale: 8, nullable: false),
                    Roi = table.Column<decimal>(type: "numeric(18,8)", precision: 18, scale: 8, nullable: false),
                    Volume = table.Column<decimal>(type: "numeric(18,8)", precision: 18, scale: 8, nullable: false),
                    Fees = table.Column<decimal>(type: "numeric(18,8)", precision: 18, scale: 8, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Bots", x => x.Identifier);
                    table.ForeignKey(
                        name: "FK_Bots_Users_UserId",
                        column: x => x.UserId,
                        principalTable: "Users",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.SetNull);
                });

            migrationBuilder.CreateTable(
                name: "BundleBacktestRequests",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    RequestId = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    UserName = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    UserId = table.Column<int>(type: "integer", nullable: true),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    CompletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    Status = table.Column<string>(type: "text", nullable: false),
                    BacktestRequestsJson = table.Column<string>(type: "text", nullable: false),
                    TotalBacktests = table.Column<int>(type: "integer", nullable: false),
                    CompletedBacktests = table.Column<int>(type: "integer", nullable: false),
                    FailedBacktests = table.Column<int>(type: "integer", nullable: false),
                    ErrorMessage = table.Column<string>(type: "text", nullable: true),
                    ProgressInfo = table.Column<string>(type: "text", nullable: true),
                    CurrentBacktest = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: true),
                    EstimatedTimeRemainingSeconds = table.Column<int>(type: "integer", nullable: true),
                    Name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    ResultsJson = table.Column<string>(type: "jsonb", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_BundleBacktestRequests", x => x.Id);
                    table.ForeignKey(
                        name: "FK_BundleBacktestRequests_Users_UserId",
                        column: x => x.UserId,
                        principalTable: "Users",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.SetNull);
                });

            migrationBuilder.CreateTable(
                name: "GeneticRequests",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    RequestId = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    UserId = table.Column<int>(type: "integer", nullable: true),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    CompletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    Status = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    Ticker = table.Column<string>(type: "text", nullable: false),
                    Timeframe = table.Column<string>(type: "text", nullable: false),
                    StartDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    EndDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    Balance = table.Column<decimal>(type: "numeric(18,8)", nullable: false),
                    PopulationSize = table.Column<int>(type: "integer", nullable: false),
                    Generations = table.Column<int>(type: "integer", nullable: false),
                    MutationRate = table.Column<double>(type: "double precision", nullable: false),
                    SelectionMethod = table.Column<string>(type: "text", nullable: false),
                    CrossoverMethod = table.Column<string>(type: "text", nullable: false),
                    MutationMethod = table.Column<string>(type: "text", nullable: false),
                    ElitismPercentage = table.Column<int>(type: "integer", nullable: false),
                    MaxTakeProfit = table.Column<double>(type: "double precision", nullable: false),
                    EligibleIndicatorsJson = table.Column<string>(type: "character varying(2000)", maxLength: 2000, nullable: true),
                    BestFitness = table.Column<double>(type: "double precision", nullable: true),
                    BestIndividual = table.Column<string>(type: "character varying(4000)", maxLength: 4000, nullable: true),
                    ErrorMessage = table.Column<string>(type: "character varying(2000)", maxLength: 2000, nullable: true),
                    ProgressInfo = table.Column<string>(type: "character varying(4000)", maxLength: 4000, nullable: true),
                    BestChromosome = table.Column<string>(type: "character varying(4000)", maxLength: 4000, nullable: true),
                    BestFitnessSoFar = table.Column<double>(type: "double precision", nullable: true),
                    CurrentGeneration = table.Column<int>(type: "integer", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_GeneticRequests", x => x.Id);
                    table.ForeignKey(
                        name: "FK_GeneticRequests_Users_UserId",
                        column: x => x.UserId,
                        principalTable: "Users",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.SetNull);
                });

            migrationBuilder.CreateTable(
                name: "MoneyManagements",
                columns: table => new
                {
                    Id = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
                    Timeframe = table.Column<string>(type: "text", nullable: false),
                    StopLoss = table.Column<decimal>(type: "numeric(18,8)", nullable: false),
                    TakeProfit = table.Column<decimal>(type: "numeric(18,8)", nullable: false),
                    Leverage = table.Column<decimal>(type: "numeric(18,8)", nullable: false),
                    UserName = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: true),
                    UserId = table.Column<int>(type: "integer", nullable: true),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_MoneyManagements", x => x.Id);
                    table.ForeignKey(
                        name: "FK_MoneyManagements_Users_UserId",
                        column: x => x.UserId,
                        principalTable: "Users",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.SetNull);
                });

            migrationBuilder.CreateIndex(
                name: "IX_Accounts_Name",
                table: "Accounts",
                column: "Name",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_Accounts_UserId",
                table: "Accounts",
                column: "UserId");

            migrationBuilder.CreateIndex(
                name: "IX_AgentSummaries_AgentName",
                table: "AgentSummaries",
                column: "AgentName");

            migrationBuilder.CreateIndex(
                name: "IX_AgentSummaries_TotalPnL",
                table: "AgentSummaries",
                column: "TotalPnL");

            migrationBuilder.CreateIndex(
                name: "IX_AgentSummaries_UserId",
                table: "AgentSummaries",
                column: "UserId",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_Backtests_Identifier",
                table: "Backtests",
                column: "Identifier",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_Backtests_RequestId",
                table: "Backtests",
                column: "RequestId");

            migrationBuilder.CreateIndex(
                name: "IX_Backtests_RequestId_Score",
                table: "Backtests",
                columns: new[] { "RequestId", "Score" });

            migrationBuilder.CreateIndex(
                name: "IX_Backtests_Score",
                table: "Backtests",
                column: "Score");

            migrationBuilder.CreateIndex(
                name: "IX_Backtests_UserName",
                table: "Backtests",
                column: "UserName");

            migrationBuilder.CreateIndex(
                name: "IX_Backtests_UserName_Score",
                table: "Backtests",
                columns: new[] { "UserName", "Score" });

            migrationBuilder.CreateIndex(
                name: "IX_Bots_Identifier",
                table: "Bots",
                column: "Identifier",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_Bots_Status",
                table: "Bots",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_Bots_UserId",
                table: "Bots",
                column: "UserId");

            migrationBuilder.CreateIndex(
                name: "IX_BundleBacktestRequests_RequestId",
                table: "BundleBacktestRequests",
                column: "RequestId",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_BundleBacktestRequests_Status",
                table: "BundleBacktestRequests",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_BundleBacktestRequests_UserId",
                table: "BundleBacktestRequests",
                column: "UserId");

            migrationBuilder.CreateIndex(
                name: "IX_BundleBacktestRequests_UserName",
                table: "BundleBacktestRequests",
                column: "UserName");

            migrationBuilder.CreateIndex(
                name: "IX_BundleBacktestRequests_UserName_CreatedAt",
                table: "BundleBacktestRequests",
                columns: new[] { "UserName", "CreatedAt" });

            migrationBuilder.CreateIndex(
                name: "IX_FundingRates_Date",
                table: "FundingRates",
                column: "Date");

            migrationBuilder.CreateIndex(
                name: "IX_FundingRates_Exchange",
                table: "FundingRates",
                column: "Exchange");

            migrationBuilder.CreateIndex(
                name: "IX_FundingRates_Exchange_Date",
                table: "FundingRates",
                columns: new[] { "Exchange", "Date" });

            migrationBuilder.CreateIndex(
                name: "IX_FundingRates_Ticker",
                table: "FundingRates",
                column: "Ticker");

            migrationBuilder.CreateIndex(
                name: "IX_FundingRates_Ticker_Exchange",
                table: "FundingRates",
                columns: new[] { "Ticker", "Exchange" });

            migrationBuilder.CreateIndex(
                name: "IX_FundingRates_Ticker_Exchange_Date",
                table: "FundingRates",
                columns: new[] { "Ticker", "Exchange", "Date" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_GeneticRequests_RequestId",
                table: "GeneticRequests",
                column: "RequestId",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_GeneticRequests_Status",
                table: "GeneticRequests",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_GeneticRequests_UserId",
                table: "GeneticRequests",
                column: "UserId");

            migrationBuilder.CreateIndex(
                name: "IX_Indicators_UserName",
                table: "Indicators",
                column: "UserName");

            migrationBuilder.CreateIndex(
                name: "IX_Indicators_UserName_Name",
                table: "Indicators",
                columns: new[] { "UserName", "Name" });

            migrationBuilder.CreateIndex(
                name: "IX_MoneyManagements_UserId",
                table: "MoneyManagements",
                column: "UserId");

            migrationBuilder.CreateIndex(
                name: "IX_MoneyManagements_UserName",
                table: "MoneyManagements",
                column: "UserName");

            migrationBuilder.CreateIndex(
                name: "IX_MoneyManagements_UserName_Name",
                table: "MoneyManagements",
                columns: new[] { "UserName", "Name" });

            migrationBuilder.CreateIndex(
                name: "IX_Positions_Date",
                table: "Positions",
                column: "Date");

            migrationBuilder.CreateIndex(
                name: "IX_Positions_Identifier",
                table: "Positions",
                column: "Identifier",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_Positions_OpenTradeId",
                table: "Positions",
                column: "OpenTradeId");

            migrationBuilder.CreateIndex(
                name: "IX_Positions_Status",
                table: "Positions",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_Positions_StopLossTradeId",
                table: "Positions",
                column: "StopLossTradeId");

            migrationBuilder.CreateIndex(
                name: "IX_Positions_TakeProfit1TradeId",
                table: "Positions",
                column: "TakeProfit1TradeId");

            migrationBuilder.CreateIndex(
                name: "IX_Positions_TakeProfit2TradeId",
                table: "Positions",
                column: "TakeProfit2TradeId");

            migrationBuilder.CreateIndex(
                name: "IX_Positions_UserName",
                table: "Positions",
                column: "UserName");

            migrationBuilder.CreateIndex(
                name: "IX_Positions_UserName_Identifier",
                table: "Positions",
                columns: new[] { "UserName", "Identifier" });

            migrationBuilder.CreateIndex(
                name: "IX_ScenarioIndicators_IndicatorId",
                table: "ScenarioIndicators",
                column: "IndicatorId");

            migrationBuilder.CreateIndex(
                name: "IX_ScenarioIndicators_ScenarioId_IndicatorId",
                table: "ScenarioIndicators",
                columns: new[] { "ScenarioId", "IndicatorId" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_Scenarios_UserName",
                table: "Scenarios",
                column: "UserName");

            migrationBuilder.CreateIndex(
                name: "IX_Scenarios_UserName_Name",
                table: "Scenarios",
                columns: new[] { "UserName", "Name" });

            migrationBuilder.CreateIndex(
                name: "IX_Signals_Date",
                table: "Signals",
                column: "Date");

            migrationBuilder.CreateIndex(
                name: "IX_Signals_Identifier",
                table: "Signals",
                column: "Identifier");

            migrationBuilder.CreateIndex(
                name: "IX_Signals_Identifier_Date_UserName",
                table: "Signals",
                columns: new[] { "Identifier", "Date", "UserName" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_Signals_Status",
                table: "Signals",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_Signals_Ticker",
                table: "Signals",
                column: "Ticker");

            migrationBuilder.CreateIndex(
                name: "IX_Signals_UserName",
                table: "Signals",
                column: "UserName");

            migrationBuilder.CreateIndex(
                name: "IX_Signals_UserName_Date",
                table: "Signals",
                columns: new[] { "UserName", "Date" });

            migrationBuilder.CreateIndex(
                name: "IX_SpotlightOverviews_DateTime",
                table: "SpotlightOverviews",
                column: "DateTime");

            migrationBuilder.CreateIndex(
                name: "IX_SpotlightOverviews_DateTime_ScenarioCount",
                table: "SpotlightOverviews",
                columns: new[] { "DateTime", "ScenarioCount" });

            migrationBuilder.CreateIndex(
                name: "IX_SpotlightOverviews_Identifier",
                table: "SpotlightOverviews",
                column: "Identifier",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_SynthMinersLeaderboards_CacheKey",
                table: "SynthMinersLeaderboards",
                column: "CacheKey",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_SynthPredictions_CacheKey",
                table: "SynthPredictions",
                column: "CacheKey",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_TopVolumeTickers_Date",
                table: "TopVolumeTickers",
                column: "Date");

            migrationBuilder.CreateIndex(
                name: "IX_TopVolumeTickers_Date_Rank",
                table: "TopVolumeTickers",
                columns: new[] { "Date", "Rank" });

            migrationBuilder.CreateIndex(
                name: "IX_TopVolumeTickers_Exchange",
                table: "TopVolumeTickers",
                column: "Exchange");

            migrationBuilder.CreateIndex(
                name: "IX_TopVolumeTickers_Exchange_Date",
                table: "TopVolumeTickers",
                columns: new[] { "Exchange", "Date" });

            migrationBuilder.CreateIndex(
                name: "IX_TopVolumeTickers_Ticker",
                table: "TopVolumeTickers",
                column: "Ticker");

            migrationBuilder.CreateIndex(
                name: "IX_Traders_Address",
                table: "Traders",
                column: "Address");

            migrationBuilder.CreateIndex(
                name: "IX_Traders_Address_IsBestTrader",
                table: "Traders",
                columns: new[] { "Address", "IsBestTrader" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_Traders_IsBestTrader",
                table: "Traders",
                column: "IsBestTrader");

            migrationBuilder.CreateIndex(
                name: "IX_Traders_IsBestTrader_Roi",
                table: "Traders",
                columns: new[] { "IsBestTrader", "Roi" });

            migrationBuilder.CreateIndex(
                name: "IX_Traders_IsBestTrader_Winrate",
                table: "Traders",
                columns: new[] { "IsBestTrader", "Winrate" });

            migrationBuilder.CreateIndex(
                name: "IX_Traders_Pnl",
                table: "Traders",
                column: "Pnl");

            migrationBuilder.CreateIndex(
                name: "IX_Traders_Roi",
                table: "Traders",
                column: "Roi");

            migrationBuilder.CreateIndex(
                name: "IX_Traders_Winrate",
                table: "Traders",
                column: "Winrate");

            migrationBuilder.CreateIndex(
                name: "IX_Trades_Date",
                table: "Trades",
                column: "Date");

            migrationBuilder.CreateIndex(
                name: "IX_Trades_ExchangeOrderId",
                table: "Trades",
                column: "ExchangeOrderId");

            migrationBuilder.CreateIndex(
                name: "IX_Trades_Status",
                table: "Trades",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_Workers_WorkerType",
                table: "Workers",
                column: "WorkerType",
                unique: true);
        }

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

            migrationBuilder.DropTable(
                name: "AgentSummaries");

            migrationBuilder.DropTable(
                name: "Backtests");

            migrationBuilder.DropTable(
                name: "Bots");

            migrationBuilder.DropTable(
                name: "BundleBacktestRequests");

            migrationBuilder.DropTable(
                name: "FundingRates");

            migrationBuilder.DropTable(
                name: "GeneticRequests");

            migrationBuilder.DropTable(
                name: "MoneyManagements");

            migrationBuilder.DropTable(
                name: "Positions");

            migrationBuilder.DropTable(
                name: "ScenarioIndicators");

            migrationBuilder.DropTable(
                name: "Signals");

            migrationBuilder.DropTable(
                name: "SpotlightOverviews");

            migrationBuilder.DropTable(
                name: "SynthMinersLeaderboards");

            migrationBuilder.DropTable(
                name: "SynthPredictions");

            migrationBuilder.DropTable(
                name: "TopVolumeTickers");

            migrationBuilder.DropTable(
                name: "Traders");

            migrationBuilder.DropTable(
                name: "Workers");

            migrationBuilder.DropTable(
                name: "Users");

            migrationBuilder.DropTable(
                name: "Trades");

            migrationBuilder.DropTable(
                name: "Indicators");

            migrationBuilder.DropTable(
                name: "Scenarios");
        }
    }
}
