EmojiTools.psm1

# EmojiTools Module
# Main module file that loads the emoji dataset and functions

$ModulePath = Split-Path -Parent $MyInvocation.MyCommand.Path

# Configuration (Script-scoped - accessible to all functions in the module)
$Script:EmojiToolsConfig = @{
    AutoUpdateCheck = $true  # Set to $false to disable auto-update checks
    UpdateInterval = 7       # Days between update checks
    # AutoInitialize features: 'Collections', 'Aliases', 'All', or empty array to disable
    # Remove items from array to skip specific features
    AutoInitialize = @('Collections', 'Aliases')  # Set to @() to disable auto-initialization
    DataPath = Join-Path $ModulePath "data\emoji.csv"
    MetadataPath = Join-Path $ModulePath "data\metadata.json"
    SetupCompletePath = Join-Path $ModulePath "data\.setup-complete"
    # Multi-language support
    CurrentLanguage = 'en'    # Default language (English)
    InstalledLanguages = @('en') # List of installed language packs
    LanguagesPath = Join-Path $ModulePath "data\languages"
}

# Load emoji dataset (Script-scoped)
$Script:EmojiDataPath = $Script:EmojiToolsConfig.DataPath

if (Test-Path $Script:EmojiDataPath) {
    try {
        $Script:EmojiData = Import-Csv $Script:EmojiDataPath -Encoding UTF8
        Write-Verbose "Loaded $($Script:EmojiData.Count) emojis from dataset"

        # Check dataset age and suggest update if needed
        $datasetAge = (Get-Date) - (Get-Item $Script:EmojiDataPath).LastWriteTime
        if ($Script:EmojiToolsConfig.AutoUpdateCheck -and $datasetAge.TotalDays -gt $Script:EmojiToolsConfig.UpdateInterval) {
            Write-Warning "ℹ️ Your emoji dataset is $([math]::Round($datasetAge.TotalDays)) days old. Run 'Update-EmojiDataset' to get the latest emojis from Unicode CLDR."
        }
    }
    catch {
        Write-Warning "Failed to load emoji dataset: $_"
        $Script:EmojiData = @()
    }
}
else {
    Write-Warning "Emoji dataset not found at: $Script:EmojiDataPath"
    Write-Information "🔄 Downloading initial emoji dataset from Unicode CLDR..." -InformationAction Continue
    # Auto-download on first load
    if (Get-Command Update-EmojiDataset -ErrorAction SilentlyContinue) {
        Update-EmojiDataset -Source Unicode -Silent
    }
    else {
        Write-Warning "Run Update-EmojiDataset to download the emoji data after module loads."
    }
    $Script:EmojiData = @()
}

# Check for new emojis (Option C notification)
$historyPath = Join-Path $ModulePath "data\history.json"
if (Test-Path $historyPath) {
    $history = Get-Content $historyPath -Encoding UTF8 -ErrorAction SilentlyContinue | ConvertFrom-Json -ErrorAction SilentlyContinue
    if ($history.updates -and $history.updates.Count -gt 0) {
        $latestUpdate = $history.updates[0]
        $updateDate = [datetime]$latestUpdate.date
        $daysAgo = (New-TimeSpan -Start $updateDate -End (Get-Date)).Days
        # Only notify if the latest update is within 7 days and has new emojis
        if ($daysAgo -le 7 -and $latestUpdate.added.Count -gt 0) {
            $totalAdded = $latestUpdate.added.Count
            Write-Information "ℹ️ $totalAdded new emojis available in recent updates (Run Get-NewEmojis to see them)" -InformationAction Continue
        }
    }
}

# Import all function files from the functions directory
Get-ChildItem "$ModulePath\functions" -Filter *.ps1 -ErrorAction SilentlyContinue | ForEach-Object {
    try {
        . $_.FullName
        Write-Verbose "Loaded function: $($_.BaseName)"
    }
    catch {
        Write-Warning "Failed to load function $($_.Name): $_"
    }
}

# Initialize caching system (Phase 1 & 2)
if (Get-Command Initialize-EmojiIndices -ErrorAction SilentlyContinue) {
    Write-Verbose "Initializing emoji search indices..."
    Initialize-EmojiIndices
}

# Warmup cache with popular queries (Phase 3)
if (Get-Command Start-EmojiCacheWarmup -ErrorAction SilentlyContinue) {
    # Run warmup in background to avoid slowing module load
    Start-Job -ScriptBlock {
        param($ModulePath)
        Import-Module (Join-Path $ModulePath "EmojiTools.psd1")
        Start-EmojiCacheWarmup
    } -ArgumentList $ModulePath | Out-Null
}

# First-run setup
if ($Script:EmojiToolsConfig.AutoInitialize.Count -gt 0 -and -not (Test-Path $Script:EmojiToolsConfig.SetupCompletePath)) {
    Write-Information "`n🎉 Welcome to EmojiTools! Running first-time setup..." -InformationAction Continue

    $shouldInitCollections = $Script:EmojiToolsConfig.AutoInitialize -contains 'Collections' -or $Script:EmojiToolsConfig.AutoInitialize -contains 'All'
    $shouldInitAliases = $Script:EmojiToolsConfig.AutoInitialize -contains 'Aliases' -or $Script:EmojiToolsConfig.AutoInitialize -contains 'All'

    try {
        # Initialize default collections
        if ($shouldInitCollections -and (Get-Command Initialize-EmojiCollections -ErrorAction SilentlyContinue)) {
            Write-Verbose " 📁 Creating default emoji collections..."
            Initialize-EmojiCollections -ErrorAction SilentlyContinue | Out-Null
        }

        # Initialize default aliases
        if ($shouldInitAliases -and (Get-Command Initialize-DefaultEmojiAliases -ErrorAction SilentlyContinue)) {
            Write-Verbose " 🔖 Setting up emoji aliases..."
            Initialize-DefaultEmojiAliases -ErrorAction SilentlyContinue | Out-Null
        }

        # Mark setup as complete
        New-Item -ItemType File -Path $Script:EmojiToolsConfig.SetupCompletePath -Force | Out-Null

        Write-Information "`n✅ Setup complete! EmojiTools is ready to use." -InformationAction Continue
        Write-Information " Try: Get-EmojiAlias -List" -InformationAction Continue
        Write-Information " Try: Get-EmojiCollection" -InformationAction Continue
        Write-Information " Try: Show-EmojiPicker`n" -InformationAction Continue
    }
    catch {
        Write-Warning "First-time setup encountered an error: $_"
        Write-Warning "You can manually run: Initialize-EmojiCollections and Initialize-DefaultEmojiAliases"
    }
}

# Export module members
Export-ModuleMember -Function Get-Emoji, Search-Emoji, Update-EmojiDataset, Copy-Emoji, Get-EmojiWithSkinTone, Export-Emoji, Show-EmojiPicker, Join-Emoji, New-EmojiCollection, Add-EmojiToCollection, Remove-EmojiFromCollection, Get-EmojiCollection, Remove-EmojiCollection, Export-EmojiCollection, Import-EmojiCollection, Initialize-EmojiCollections, Get-EmojiStats, Clear-EmojiStats, Export-EmojiStats, Get-EmojiAlias, New-EmojiAlias, Remove-EmojiAlias, Set-EmojiAlias, Initialize-DefaultEmojiAliases, Import-EmojiAliases, Export-EmojiAliases, Initialize-EmojiTools, Reset-EmojiTools, Get-EmojiToolsInfo, Import-CustomEmojiDataset, Export-CustomEmojiDataset, New-CustomEmojiDataset, Get-CustomEmojiDatasetInfo, Reset-EmojiDataset, Emoji, Get-EmojiDatasetInfo, Enable-EmojiAutoUpdate, Disable-EmojiAutoUpdate, Clear-EmojiCache, Get-EmojiCacheStats, Set-EmojiCacheConfig, Get-EmojiCacheConfig, Start-EmojiCacheWarmup, Get-EmojiUpdateHistory, Get-NewEmojis, Get-RemovedEmojis, Export-EmojiHistory, Clear-EmojiHistory, Register-EmojiSource, Unregister-EmojiSource, Get-EmojiSource, Get-EmojiLanguage, Set-EmojiLanguage, Install-EmojiLanguage, Uninstall-EmojiLanguage, New-EmojiScheduledTask, Remove-EmojiScheduledTask, Test-EmojiScheduledTask, Get-EmojiPlatform

# Export variables for testing purposes (allows tests to verify internal state)
Export-ModuleMember -Variable EmojiToolsConfig, EmojiData, EmojiDataPath