# /designfast:apply-design-system Command

## Description
将现有设计系统应用到项目中，更新项目的设计令牌和组件规范。

## Syntax
```
/designfast:apply-design-system --project-id=<id> --system-id=<id> [options]
```

## Parameters

### Required
- `--project-id=<id>`: 目标项目ID
- `--system-id=<id>`: 设计系统ID

### Optional
- `--components-only`: 仅应用组件规范，不更新令牌
- `--tokens-only`: 仅应用设计令牌，不更新组件
- `--backup`: 创建应用前的备份

## Implementation

### Parameter Parsing
```powershell
param(
    [Parameter(Mandatory=$true)]
    [string]$ProjectId,
    
    [Parameter(Mandatory=$true)]
    [string]$SystemId,
    
    [Parameter(Mandatory=$false)]
    [switch]$ComponentsOnly,
    
    [Parameter(Mandatory=$false)]
    [switch]$TokensOnly,
    
    [Parameter(Mandatory=$false)]
    [switch]$Backup
)

# Validate required parameters
if ([string]::IsNullOrWhiteSpace($ProjectId)) {
    Write-Error "Project ID is required. Use --project-id=<id>"
    exit 1
}

if ([string]::IsNullOrWhiteSpace($SystemId)) {
    Write-Error "Design system ID is required. Use --system-id=<id>"
    exit 1
}

# Validate mutually exclusive options
if ($ComponentsOnly -and $TokensOnly) {
    Write-Error "Cannot specify both --components-only and --tokens-only"
    exit 1
}
```

### Workflow Execution

#### Stage 1: Validation
```powershell
Write-Host "Applying design system to project..." -ForegroundColor Cyan

# Check if project exists
$projectData = & "$PSScriptRoot\..\scripts\project-manager.ps1" -Action read -ProjectId $ProjectId
if (-not $projectData) {
    Write-Error "Project not found: $ProjectId"
    Write-Host "Available projects:" -ForegroundColor Yellow
    $projects = & "$PSScriptRoot\..\scripts\project-manager.ps1" -Action list
    foreach ($project in $projects) {
        Write-Host "  - $($project.name) (ID: $($project.id))" -ForegroundColor Gray
    }
    exit 1
}

# Check if design system exists
$systemData = & "$PSScriptRoot\..\scripts\design-system-manager.ps1" -Action read -DesignSystemId $SystemId
if (-not $systemData) {
    Write-Error "Design system not found: $SystemId"
    Write-Host "Available design systems:" -ForegroundColor Yellow
    $systems = & "$PSScriptRoot\..\scripts\design-system-manager.ps1" -Action list
    foreach ($system in $systems) {
        Write-Host "  - $($system.name) (ID: $($system.id))" -ForegroundColor Gray
    }
    exit 1
}

Write-Host "✓ Project: $($projectData.name)" -ForegroundColor Green
Write-Host "✓ Design System: $($systemData.name)" -ForegroundColor Green
```

#### Stage 2: Backup (Optional)
```powershell
if ($Backup) {
    Write-Host "Creating backup..." -ForegroundColor Blue
    
    $timestamp = Get-Date -Format "yyyyMMdd-HHmmss"
    $backupPath = "workspace\designs\$ProjectId\backup\$timestamp"
    
    try {
        New-Item -ItemType Directory -Path $backupPath -Force | Out-Null
        
        # Backup project file
        $projectFile = "workspace\designs\$ProjectId\$ProjectId.json"
        if (Test-Path $projectFile) {
            Copy-Item $projectFile $backupPath
        }
        
        # Backup any existing design system files
        $designSystemFiles = Get-ChildItem "workspace\designs\$ProjectId" -Filter "*design-system*" -File
        foreach ($file in $designSystemFiles) {
            Copy-Item $file.FullName $backupPath
        }
        
        Write-Host "✓ Backup created: $backupPath" -ForegroundColor Green
    }
    catch {
        Write-Error "Failed to create backup: $($_.Exception.Message)"
        exit 1
    }
}
```

#### Stage 3: System Application
```powershell
Write-Host "Applying design system..." -ForegroundColor Blue

# Prepare updates based on options
$updates = @{}

if (-not $ComponentsOnly) {
    # Apply tokens
    $updates.designSystem = $systemData.tokens
    Write-Host "✓ Applying design tokens" -ForegroundColor Green
}

if (-not $TokensOnly) {
    # Apply components (store reference to system)
    $updates.designSystemId = $systemData.id
    $updates.designSystemName = $systemData.name
    Write-Host "✓ Linking component library" -ForegroundColor Green
}

# Update project
$updatedProject = & "$PSScriptRoot\..\scripts\project-manager.ps1" `
    -Action update `
    -ProjectId $ProjectId `
    -Updates $updates

if (-not $updatedProject) {
    Write-Error "Failed to update project"
    exit 1
}
```

#### Stage 4: Component Update
```powershell
if (-not $TokensOnly) {
    Write-Host "Updating component references..." -ForegroundColor Blue
    
    # Create design system link file for component reference
    $linkData = @{
        projectId = $ProjectId
        designSystemId = $systemData.id
        designSystemName = $systemData.name
        appliedAt = Get-Date -Format "o"
        components = $systemData.components
    }
    
    $linkFile = "workspace\designs\$ProjectId\design-system-link.json"
    $linkData | ConvertTo-Json -Depth 10 | Set-Content -Path $linkFile -Encoding UTF8
    
    Write-Host "✓ Component library linked" -ForegroundColor Green
}
```

#### Stage 5: Validation & Summary
```powershell
Write-Host "`n🎉 Design system applied successfully!" -ForegroundColor Green
Write-Host "Project: $($projectData.name)" -ForegroundColor White
Write-Host "Design System: $($systemData.name)" -ForegroundColor White

if ($Backup) {
    Write-Host "Backup: $backupPath" -ForegroundColor White
}

# Display applied changes
if (-not $ComponentsOnly) {
    Write-Host "Applied tokens: colors, typography, spacing, breakpoints" -ForegroundColor Gray
}
if (-not $TokensOnly) {
    Write-Host "Applied components: buttons, inputs, and component variants" -ForegroundColor Gray
}

Write-Host "`nNext steps:" -ForegroundColor Cyan
Write-Host "1. Run '/designfast:create-prototype' to generate updated prototypes" -ForegroundColor White
Write-Host "2. Run '/designfast:test-prototype' to validate design consistency" -ForegroundColor White

# Return updated project data
return $updatedProject
```

## Examples

### Basic Application
```bash
/designfast:apply-design-system --project-id="123e4567-e89b-12d3-a456-426614174000" --system-id="456e7890-e89b-12d3-a456-426614174001"
```

### Components Only
```bash
/designfast:apply-design-system --project-id="123e4567" --system-id="456e7890" --components-only
```

### With Backup
```bash
/designfast:apply-design-system --project-id="123e4567" --system-id="456e7890" --backup
```

## Output

更新以下文件：
- `workspace/designs/{project-id}/project.json` - 更新designSystem字段
- `workspace/prototypes/{project-id}/` - 更新组件样式
- `workspace/designs/{project-id}/design-system-link.json` - 系统关联记录

## Error Handling

- **项目不存在**: 返回错误，建议检查项目ID
- **系统不存在**: 返回错误，列出可用系统
- **兼容性问题**: 警告潜在冲突，请求确认
- **备份失败**: 如果指定backup但无法创建，取消操作

## Dependencies

- project-manager.ps1
- design-system-manager.ps1
- Handlebars.js (for template updates)

## Related Commands

- `/designfast:create-design-system`: 创建新设计系统
- `/designfast:list-design-systems`: 查看可用系统
- `/designfast:export-design-system`: 导出系统配置