'=======================================================================================================================
' MIGRATION GENERATOR
'=======================================================================================================================
' Generates a new migration file with timestamp-based versioning.
'
' Usage:
'   cscript //nologo scripts\generateMigration.vbs migration_name
'
' Example:
'   cscript //nologo scripts\generateMigration.vbs create_users_table
'   Creates: db/migrations/20260109153045_create_users_table.asp
'

Option Explicit

Dim fso, migrationName, timestamp, filename, filepath, content

Set fso = CreateObject("Scripting.FileSystemObject")

' Check arguments
If WScript.Arguments.Count < 1 Then
    WScript.Echo "Usage: cscript //nologo scripts\generateMigration.vbs migration_name"
    WScript.Echo ""
    WScript.Echo "Example:"
    WScript.Echo "  cscript //nologo scripts\generateMigration.vbs create_users_table"
    WScript.Quit 1
End If

migrationName = WScript.Arguments(0)

' Validate migration name (alphanumeric and underscore only)
If Not IsValidMigrationName(migrationName) Then
    WScript.Echo "Error: Migration name must contain only letters, numbers, and underscores"
    WScript.Quit 1
End If

' Generate timestamp (YYYYMMDDHHMMSS)
timestamp = GetTimestamp()

' Create filename
filename = timestamp & "_" & migrationName & ".asp"

' Ensure migrations directory exists
Dim migrationsDir
migrationsDir = fso.GetParentFolderName(WScript.ScriptFullName) & "\..\db\migrations"
migrationsDir = fso.GetAbsolutePathName(migrationsDir)

If Not fso.FolderExists(migrationsDir) Then
    CreateDirectoryPath migrationsDir
End If

filepath = migrationsDir & "\" & filename

' Check if file already exists
If fso.FileExists(filepath) Then
    WScript.Echo "Error: Migration file already exists: " & filename
    WScript.Quit 1
End If

' Generate migration content
content = GenerateMigrationContent(migrationName)

' Write the file
Dim file
Set file = fso.CreateTextFile(filepath, True)
file.Write content
file.Close

WScript.Echo "Migration created: " & filename
WScript.Echo "Path: " & filepath
WScript.Echo ""
WScript.Echo "Edit the file to add your migration logic, then run:"
WScript.Echo "  cscript //nologo scripts\runMigrations.vbs"

WScript.Quit 0

'=======================================================================================================================
' HELPER FUNCTIONS
'=======================================================================================================================

Function GetTimestamp()
    Dim dtNow, sYear, sMonth, sDay, sHour, sMinute, sSecond
    dtNow = Now()

    sYear = Year(dtNow)
    sMonth = Right("0" & Month(dtNow), 2)
    sDay = Right("0" & Day(dtNow), 2)
    sHour = Right("0" & Hour(dtNow), 2)
    sMinute = Right("0" & Minute(dtNow), 2)
    sSecond = Right("0" & Second(dtNow), 2)

    GetTimestamp = sYear & sMonth & sDay & sHour & sMinute & sSecond
End Function

Function IsValidMigrationName(name)
    Dim regex
    Set regex = New RegExp
    regex.Pattern = "^[a-zA-Z0-9_]+$"
    IsValidMigrationName = regex.Test(name)
End Function

Function GenerateMigrationContent(name)
    Dim template

    template = "<%"& vbCrLf
    template = template & "'======================================================================================================================="& vbCrLf
    template = template & "' MIGRATION: " & name & vbCrLf
    template = template & "'======================================================================================================================="& vbCrLf
    template = template & "' This migration was auto-generated. Add your migration logic below."& vbCrLf
    template = template & "'"& vbCrLf
    template = template & "' The migration object provides these helper methods:"& vbCrLf
    template = template & "'   - migration.ExecuteSQL(sql)                              - Execute raw SQL"& vbCrLf
    template = template & "'   - migration.CreateTable(name, columns)                   - Create a table"& vbCrLf
    template = template & "'   - migration.DropTable(name)                              - Drop a table"& vbCrLf
    template = template & "'   - migration.AddColumn(table, column, type)               - Add a column"& vbCrLf
    template = template & "'   - migration.DropColumn(table, column)                    - Drop a column"& vbCrLf
    template = template & "'   - migration.CreateIndex(name, table, columns)            - Create an index"& vbCrLf
    template = template & "'   - migration.DropIndex(name, table)                       - Drop an index"& vbCrLf
    template = template & "'"& vbCrLf
    template = template & "' For complex operations, use migration.DB to access the database directly:"& vbCrLf
    template = template & "'   migration.DB.Execute ""INSERT INTO users (name) VALUES (?)"", Array(""John"")"& vbCrLf
    template = template & "'"& vbCrLf
    template = template & ""& vbCrLf
    template = template & "'-----------------------------------------------------------------------------------------------------------------------"& vbCrLf
    template = template & "' UP - Apply the migration"& vbCrLf
    template = template & "'-----------------------------------------------------------------------------------------------------------------------"& vbCrLf
    template = template & "Sub Migration_Up(migration)"& vbCrLf
    template = template & "    ' Example: Create a table"& vbCrLf
    template = template & "    ' migration.CreateTable ""users"", ""id AUTOINCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255), created_at DATETIME"""& vbCrLf
    template = template & "    "& vbCrLf
    template = template & "    ' Example: Add an index"& vbCrLf
    template = template & "    ' migration.CreateIndex ""idx_users_email"", ""users"", ""email"""& vbCrLf
    template = template & "    "& vbCrLf
    template = template & "    ' TODO: Add your migration logic here"& vbCrLf
    template = template & "    "& vbCrLf
    template = template & "End Sub"& vbCrLf
    template = template & ""& vbCrLf
    template = template & "'-----------------------------------------------------------------------------------------------------------------------"& vbCrLf
    template = template & "' DOWN - Rollback the migration"& vbCrLf
    template = template & "'-----------------------------------------------------------------------------------------------------------------------"& vbCrLf
    template = template & "Sub Migration_Down(migration)"& vbCrLf
    template = template & "    ' Example: Drop the table"& vbCrLf
    template = template & "    ' migration.DropTable ""users"""& vbCrLf
    template = template & "    "& vbCrLf
    template = template & "    ' TODO: Add your rollback logic here (reverse the Up migration)"& vbCrLf
    template = template & "    "& vbCrLf
    template = template & "End Sub"& vbCrLf
    template = template & "%>"& vbCrLf

    GenerateMigrationContent = template
End Function

Sub CreateDirectoryPath(path)
    Dim parentPath
    If Not fso.FolderExists(path) Then
        parentPath = fso.GetParentFolderName(path)
        If parentPath <> "" Then
            CreateDirectoryPath parentPath
        End If
        fso.CreateFolder path
    End If
End Sub
