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

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

# Класс CookieBlock

Статический класс для управления статусом доступа к cookie и соблюдения приватности. Предоставляет простой интерфейс для блокировки или разрешения cookie во всём приложении, интегрируясь с классом Cookie для обеспечения соответствия требованиям приватности как GDPR.

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

- **Глобальный контроль cookie** — централизованный контроль использования cookie во всём приложении
- **Соблюдение приватности** — помогает реализовать GDPR, CCPA и другие регулирования приватности
- **Постоянные настройки** — использует DataStorage для запоминания пользовательских настроек cookie
- **Интеграция с классом Cookie** — класс Cookie автоматически учитывает настройки CookieBlock
- **Простой API** — всего два метода для получения и установки статуса блокировки cookie
- **Совместимость с браузерами** — безопасно работает во всех средах

## Основное использование

### `get`

Получает текущий статус блокировки cookie.

**Возвращает:** `boolean` — true если cookie заблокированы, false если разрешены

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

// Проверить, заблокированы ли cookie в данный момент
const isBlocked = CookieBlock.get()
console.log('Cookie заблокированы:', isBlocked) // false по умолчанию

if (isBlocked) {
  console.log('Cookie заблокированы пользовательскими настройками')
} else {
  console.log('Cookie разрешены')
}
```

### `set`

Устанавливает статус блокировки cookie и сохраняет настройку.

**Параметры:**
- `value: boolean` — true для блокировки cookie, false для разрешения

```javascript
// Заблокировать все cookie
CookieBlock.set(true)
console.log('Cookie заблокированы:', CookieBlock.get()) // true

// Разрешить cookie
CookieBlock.set(false)
console.log('Cookie разрешены:', CookieBlock.get()) // false

// Настройка сохраняется между сессиями браузера
// Пользовательские предпочтения сохраняются в localStorage
```

## Интеграция с классом Cookie

Класс CookieBlock автоматически предотвращает операции Cookie когда блокировка включена:

```javascript
import { Cookie, CookieBlock } from '@dxtmisha/functional'

// Создать экземпляр cookie
const userPrefs = new Cookie('user-preferences')

// Изначально cookie разрешены
CookieBlock.set(false)
userPrefs.set({ theme: 'dark', language: 'ru' })
console.log('Сохранённые настройки:', userPrefs.get()) // { theme: 'dark', language: 'ru' }

// Заблокировать cookie
CookieBlock.set(true)

// Операции Cookie теперь предотвращены
userPrefs.set({ theme: 'light', language: 'en' }) // Это фактически не установит cookie
console.log('Настройки после блокировки:', userPrefs.get()) // Всё ещё { theme: 'dark', language: 'ru' }

// Разрешить cookie снова
CookieBlock.set(false)
userPrefs.set({ theme: 'light', language: 'en' }) // Теперь это работает
console.log('Обновлённые настройки:', userPrefs.get()) // { theme: 'light', language: 'en' }
```

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

### Согласие на cookie по GDPR

```javascript
class CookieConsent {
  constructor() {
    this.consentCookie = new Cookie('cookie-consent')
  }

  showConsentBanner() {
    const consent = this.consentCookie.get()

    if (consent === undefined) {
      CookieBlock.set(true) // Блокировать до согласия
      this.displayBanner()
      return 'banner-shown'
    } else {
      CookieBlock.set(!consent.accepted)
      return consent.accepted ? 'cookies-allowed' : 'cookies-blocked'
    }
  }

  acceptCookies() {
    this.consentCookie.set({
      accepted: true,
      timestamp: Date.now()
    }, { age: 365 * 24 * 60 * 60 })

    CookieBlock.set(false)
    this.hideBanner()
  }

  rejectCookies() {
    this.consentCookie.set({
      accepted: false,
      timestamp: Date.now()
    }, { age: 365 * 24 * 60 * 60 })

    CookieBlock.set(true)
    this.hideBanner()
  }
}

// Использование
const consent = new CookieConsent()
const status = consent.showConsentBanner()
```

### Управление настройками приватности

```javascript
class PrivacyManager {
  constructor() {
    this.privacySettings = new Cookie('privacy-settings')
  }

  updatePrivacySettings(settings) {
    this.privacySettings.set(settings, { age: 365 * 24 * 60 * 60 })

    const shouldBlock = !(settings.functional || settings.analytics || settings.marketing)
    CookieBlock.set(shouldBlock)
  }

  hasConsentFor(category) {
    const settings = this.privacySettings.get({ essential: true })
    return settings[category] || false
  }

  acceptAll() {
    this.updatePrivacySettings({
      essential: true,
      functional: true,
      analytics: true,
      marketing: true
    })
  }

  rejectAll() {
    this.updatePrivacySettings({
      essential: true,
      functional: false,
      analytics: false,
      marketing: false
    })
  }
}

// Использование
const privacy = new PrivacyManager()
privacy.acceptAll()
console.log('Аналитика разрешена:', privacy.hasConsentFor('analytics'))
```

### Инициализация приложения

```javascript
class AppInitializer {
  static initializeCookieCompliance() {
    const consent = new Cookie('cookie-consent')
    const consentData = consent.get()

    if (!consentData) {
      CookieBlock.set(true) // Первый визит
      return 'pending-consent'
    } else {
      CookieBlock.set(!consentData.accepted)
      return consentData.accepted ? 'cookies-allowed' : 'cookies-blocked'
    }
  }
}

// Запуск приложения
document.addEventListener('DOMContentLoaded', () => {
  const status = AppInitializer.initializeCookieCompliance()
  console.log('Cookie статус:', status)
})
```

Класс CookieBlock помогает обеспечить соответствие с GDPR, CCPA и другими законами о приватности, предоставляя основу для реализации управления cookie.
