import type { PopupState } from '../shared/types';

// Элементы UI
const saveButton = document.getElementById('saveButton') as HTMLButtonElement;
const statusMessage = document.getElementById('statusMessage') as HTMLDivElement;

// Состояние
let popupState: PopupState = {
  isRecording: false,
  hasPermissions: false,
  status: 'idle'
};

// Логирование
// IN-02-companion: align with the IN-02 fix to Logger/ContentLogger —
// `unknown[]` is the strict-mode-friendly signature for variadic
// console wrappers. console.log accepts unknown values natively.
function log(...args: unknown[]) {
  console.log('[Popup]', ...args);
}

// Обновление UI
function updateUI() {
  log('Updating UI:', popupState);

  // Текст кнопки
  const buttonText = saveButton.querySelector('.button-text') as HTMLSpanElement;

  switch (popupState.status) {
    case 'idle':
      buttonText.textContent = 'Сохранить отчёт об ошибке';
      saveButton.className = 'save-button';
      saveButton.disabled = !popupState.hasPermissions;
      break;

    case 'saving':
      buttonText.textContent = 'Сохраняю...';
      saveButton.className = 'save-button saving';
      saveButton.disabled = true;
      break;

    case 'done':
      buttonText.textContent = 'Готово! ✓';
      saveButton.className = 'save-button done';
      saveButton.disabled = true;
      break;
  }

  // Сообщение о статусе
  if (!popupState.hasPermissions && popupState.status === 'idle') {
    statusMessage.textContent = 'Необходимо разрешение на запись экрана';
    statusMessage.className = 'status-message error';
  } else {
    statusMessage.textContent = '';
    statusMessage.className = 'status-message';
  }
}

// Проверка разрешений при открытии popup
async function checkPermissions() {
  try {
    log('Sending REQUEST_PERMISSIONS message...');
    const response = await chrome.runtime.sendMessage({
      type: 'REQUEST_PERMISSIONS'
    });
    log('Got response:', response);

    popupState.hasPermissions = response.granted;
    log('Permissions check:', popupState.hasPermissions);

    if (popupState.hasPermissions) {
      popupState.isRecording = true;
    }

    updateUI();

    // Если нет разрешений, запрашиваем автоматически
    if (!popupState.hasPermissions) {
      await requestPermissions();
    }

  } catch (error) {
    log('Error checking permissions:', error);
    popupState.hasPermissions = false;
    updateUI();
  }
}

// Запрос разрешений
async function requestPermissions() {
  try {
    const response = await chrome.runtime.sendMessage({
      type: 'REQUEST_PERMISSIONS'
    });

    popupState.hasPermissions = response.granted;
    popupState.isRecording = response.granted;

    log('Permission request result:', response.granted);
    updateUI();

    if (!response.granted) {
      statusMessage.textContent = 'Разрешение на запись обязательно для работы расширения';
      statusMessage.className = 'status-message error';
    }

  } catch (error) {
    log('Error requesting permissions:', error);
    popupState.hasPermissions = false;
    updateUI();
  }
}

// Сохранение архива
async function saveArchive() {
  if (!popupState.hasPermissions) {
    log('Cannot save: no permissions');
    await requestPermissions();
    return;
  }

  popupState.status = 'saving';
  updateUI();

  try {
    log('Starting archive save...');

    const response = await chrome.runtime.sendMessage({
      type: 'SAVE_ARCHIVE'
    });

    log('Save response:', response);

    if (response.success) {
      popupState.status = 'done';
      statusMessage.textContent = 'Архив успешно сохранён!';
      statusMessage.className = 'status-message success';

      // Возвращаемся в idle через 3 секунды
      setTimeout(() => {
        popupState.status = 'idle';
        statusMessage.textContent = '';
        updateUI();
      }, 3000);

    } else {
      throw new Error(response.error || 'Unknown error');
    }

  } catch (error) {
    log('Error saving archive:', error);
    popupState.status = 'idle';
    statusMessage.textContent = 'Ошибка сохранения: ' + (error as Error).message;
    statusMessage.className = 'status-message error';
    updateUI();
  }
}

// Инициализация
function init() {
  log('Popup initializing');

  // Привязка событий
  saveButton.addEventListener('click', saveArchive);

  // Проверяем разрешения при открытии
  checkPermissions();

  log('Popup initialized');
}

// Запуск при загрузке
document.addEventListener('DOMContentLoaded', init);