import apiClient from './apiClient';

class AdminDeviceSecurityService {
  // Получение списка заблокированных устройств
  async getBlockedDevices(params = {}) {
    try {
      const response = await apiClient.get('/admin/blocked-devices', { params });
      return response;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка получения заблокированных устройств:', error);
      throw error;
    }
  }

  // Получение статистики по заблокированным устройствам
  async getDeviceSecurityStats() {
    try {
      const response = await apiClient.get('/admin/device-security/stats');
      return response.data;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка получения статистики:', error);
      throw error;
    }
  }

  // Блокировка устройства
  async blockDevice(deviceData) {
    try {
      const response = await apiClient.post('/admin/block-device', {
        userId: deviceData.userId,
        deviceFingerprint: deviceData.deviceFingerprint,
        reason: deviceData.reason,
        additional: deviceData.additional || {}
      });
      return response.data;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка блокировки устройства:', error);
      throw error;
    }
  }

  // Разблокировка устройства
  async unblockDevice(deviceFingerprint, reason) {
    try {
      const response = await apiClient.post('/admin/unblock-device', {
        deviceFingerprint,
        reason
      });
      return response.data;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка разблокировки устройства:', error);
      throw error;
    }
  }

  // Получение детальной информации об устройстве
  async getDeviceDetails(deviceFingerprint) {
    try {
      const response = await apiClient.get(`/admin/device/${deviceFingerprint}`);
      return response.data;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка получения деталей устройства:', error);
      throw error;
    }
  }

  // Получение истории блокировок устройства
  async getDeviceBlockHistory(deviceFingerprint) {
    try {
      const response = await apiClient.get(`/admin/device/${deviceFingerprint}/history`);
      return response.data;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка получения истории блокировок:', error);
      throw error;
    }
  }

  // Получение попыток обхода блокировки
  async getBypassAttempts(deviceFingerprint) {
    try {
      const response = await apiClient.get(`/admin/device/${deviceFingerprint}/bypass-attempts`);
      return response.data;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка получения попыток обхода:', error);
      throw error;
    }
  }

  // Массовая блокировка устройств
  async blockMultipleDevices(devices, reason) {
    try {
      const response = await apiClient.post('/admin/block-devices-bulk', {
        devices,
        reason
      });
      return response.data;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка массовой блокировки:', error);
      throw error;
    }
  }

  // Экспорт списка заблокированных устройств
  async exportBlockedDevices(format = 'csv', filters = {}) {
    try {
      const response = await apiClient.get('/admin/blocked-devices/export', {
        params: { format, ...filters },
        responseType: 'blob'
      });
      
      // Создаем ссылку для скачивания
      const url = window.URL.createObjectURL(new Blob([response.data]));
      const link = document.createElement('a');
      link.href = url;
      link.setAttribute('download', `blocked-devices-${new Date().toISOString().split('T')[0]}.${format}`);
      document.body.appendChild(link);
      link.click();
      link.remove();
      window.URL.revokeObjectURL(url);
      
      return true;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка экспорта:', error);
      throw error;
    }
  }

  // Получение отчета по безопасности устройств
  async getSecurityReport(period = '30d') {
    try {
      const response = await apiClient.get('/admin/device-security/report', {
        params: { period }
      });
      return response.data;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка получения отчета:', error);
      throw error;
    }
  }

  // Обновление настроек безопасности устройств
  async updateSecuritySettings(settings) {
    try {
      const response = await apiClient.put('/admin/device-security/settings', settings);
      return response.data;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка обновления настроек:', error);
      throw error;
    }
  }

  // Получение настроек безопасности устройств
  async getSecuritySettings() {
    try {
      const response = await apiClient.get('/admin/device-security/settings');
      return response.data;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка получения настроек:', error);
      throw error;
    }
  }

  // Поиск устройств по критериям
  async searchDevices(query) {
    try {
      const response = await apiClient.get('/admin/devices/search', {
        params: { q: query }
      });
      return response.data;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка поиска устройств:', error);
      throw error;
    }
  }

  // Получение активных сессий пользователя
  async getUserActiveSessions(userId) {
    try {
      const response = await apiClient.get(`/admin/user/${userId}/sessions`);
      return response.data;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка получения активных сессий:', error);
      throw error;
    }
  }

  // Завершение всех сессий пользователя
  async terminateUserSessions(userId) {
    try {
      const response = await apiClient.post(`/admin/user/${userId}/terminate-sessions`);
      return response.data;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка завершения сессий:', error);
      throw error;
    }
  }

  // Добавление устройства в белый список
  async whitelistDevice(deviceFingerprint, reason) {
    try {
      const response = await apiClient.post('/admin/device/whitelist', {
        deviceFingerprint,
        reason
      });
      return response.data;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка добавления в белый список:', error);
      throw error;
    }
  }

  // Удаление устройства из белого списка
  async removeFromWhitelist(deviceFingerprint) {
    try {
      const response = await apiClient.delete(`/admin/device/whitelist/${deviceFingerprint}`);
      return response.data;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка удаления из белого списка:', error);
      throw error;
    }
  }

  // Получение журнала безопасности
  async getSecurityLog(filters = {}) {
    try {
      const response = await apiClient.get('/admin/security-log', { params: filters });
      return response.data;
    } catch (error) {
      console.error('[AdminDeviceSecurityService] Ошибка получения журнала безопасности:', error);
      throw error;
    }
  }
}

export default new AdminDeviceSecurityService();