import {Meta} from '@storybook/addon-docs/blocks'

<Meta title='@dxtmisha/functional/ru/Classes/Global'/>

# Класс Global

Статический класс для управления глобальными данными приложения. Предоставляет простой и безопасный способ хранения и получения глобальных конфигураций, настроек и данных с защитой от повторной инициализации.

## Основные возможности

- **Единоразовая инициализация** — данные можно добавить только один раз для предотвращения случайного перезаписывания
- **Типобезопасное получение данных** — поддержка дженериков TypeScript для типизированного доступа
- **Глобальное хранилище** — централизованное место для хранения конфигураций приложения
- **Простой API** — всего два метода для работы с глобальными данными
- **Защита от конфликтов** — предотвращает повторную инициализацию глобальных данных
- **Память эффективность** — использует простое копирование объекта без глубокого клонирования

## Статические методы

### `add`

Добавляет глобальные данные. Метод работает только один раз для предотвращения случайного перезаписывания.

**Параметры:**
- `data: Record<string, any>` — объект с глобальными данными

**Возвращает:** `void`

```javascript
import { Global } from '@dxtmisha/functional'

// Инициализация глобальных данных (выполняется один раз)
Global.add({
  apiUrl: 'https://api.example.com',
  appName: 'MyApplication',
  version: '1.0.0',
  features: {
    darkMode: true,
    notifications: false
  },
  maxRetries: 3
})

// Попытка повторной инициализации будет проигнорирована
Global.add({
  apiUrl: 'https://different-api.com' // Это не перезапишет данные
})
```

### `get`

Возвращает значение по его имени с поддержкой типизации.

**Параметры:**
- `name: string` — название свойства для получения

**Возвращает:** `R` — значение указанного типа или undefined

```javascript
// Получение данных с автоматическим выводом типов
const apiUrl = Global.get('apiUrl')
console.log(apiUrl) // 'https://api.example.com'

// Получение с явным указанием типа
const features = Global.get<{ darkMode: boolean; notifications: boolean }>('features')
console.log(features.darkMode) // true

// Получение примитивных типов
const maxRetries = Global.get<number>('maxRetries')
console.log(maxRetries) // 3

// Получение несуществующего свойства
const nonExistent = Global.get('nonExistent')
console.log(nonExistent) // undefined
```

## Практические примеры

### Конфигурация приложения

```javascript
class AppConfig {
  static initialize() {
    Global.add({
      api: {
        baseUrl: process.env.API_BASE_URL || 'https://api.myapp.com',
        timeout: 10000,
        retries: 3
      },
      ui: {
        theme: 'light',
        language: 'ru',
        animations: true
      },
      features: {
        newDashboard: true,
        advancedSearch: false
      },
      app: {
        name: 'MyApplication',
        version: '2.1.0',
        environment: process.env.NODE_ENV || 'production'
      }
    })
  }

  static getApiConfig() {
    return Global.get('api')
  }

  static isFeatureEnabled(featureName) {
    const features = Global.get('features')
    return features ? features[featureName] || false : false
  }
}

// Использование
AppConfig.initialize()
const apiConfig = AppConfig.getApiConfig()
console.log(`API URL: ${apiConfig.baseUrl}`)
```

### Система констант

```javascript
const AppConstants = {
  setup() {
    Global.add({
      constants: {
        limits: {
          maxFileSize: 10 * 1024 * 1024, // 10MB
          sessionTimeout: 30 * 60 * 1000 // 30 минут
        },
        endpoints: {
          auth: '/api/auth',
          users: '/api/users'
        },
        patterns: {
          email: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
          phone: /^\+?[\d\s\-\(\)]+$/
        }
      }
    })
  },

  validateEmail(email) {
    const patterns = Global.get('constants')?.patterns
    return patterns ? patterns.email.test(email) : false
  }
}

// Использование
AppConstants.setup()
console.log(AppConstants.validateEmail('user@example.com')) // true
```

Класс Global предоставляет простой и надежный способ управления глобальными данными приложения, обеспечивая централизованное хранение конфигураций с защитой от случайного перезаписывания.
