import { randomId } from './progressBar';

import { log } from './logger';
import { gradioApp } from './script';
import { restartReload, updateInput } from './ui';

export function extensions_apply(_extensionsDisabledList: unknown, _extensionsUpdateList: unknown, disableAll: unknown): [string, string, unknown] {
  const disable = [];
  const update = [];
  gradioApp().querySelectorAll('#extensions input[type="checkbox"]').forEach((x) => {
    if (!(x instanceof HTMLInputElement)) return;
    if (x.name.startsWith('enable_') && !x.checked) disable.push(x.name.substring(7));
    if (x.name.startsWith('update_') && x.checked) update.push(x.name.substring(7));
  });
  restartReload();
  log('Extensions apply:', { disable, update });
  return [JSON.stringify(disable), JSON.stringify(update), disableAll];
}

export function extensions_check(_info: unknown, _extensionsDisabledList: unknown, searchText: unknown, sortColumn: unknown): [string, string, unknown, unknown] {
  const disable = [];
  gradioApp().querySelectorAll('#extensions input[type="checkbox"]').forEach((x) => {
    if (!(x instanceof HTMLInputElement)) return;
    if (x.name.startsWith('enable_') && !x.checked) disable.push(x.name.substring(7));
  });
  const id = randomId();
  log('Extensions check:', { disable });
  return [id, JSON.stringify(disable), searchText, sortColumn];
}

export function install_extension(button: HTMLButtonElement | HTMLInputElement, url: string): void {
  button.disabled = true;
  button.value = 'Installing...';
  button.innerHTML = 'installing';
  const textarea = gradioApp().querySelector('#extension_to_install textarea');
  if (!(textarea instanceof HTMLTextAreaElement)) return;
  textarea.value = url;
  updateInput(textarea);
  log('Extension install:', { url });
  const installBtn = gradioApp().querySelector('#install_extension_button');
  if (installBtn instanceof HTMLElement) installBtn.click();
}

export function uninstall_extension(button: HTMLButtonElement | HTMLInputElement, url: string): void {
  button.disabled = true;
  button.value = 'Uninstalling...';
  button.innerHTML = 'uninstalling';
  const textarea = gradioApp().querySelector('#extension_to_install textarea');
  if (!(textarea instanceof HTMLTextAreaElement)) return;
  textarea.value = url;
  updateInput(textarea);
  log('Extension uninstall:', { url });
  const uninstallBtn = gradioApp().querySelector('#uninstall_extension_button');
  if (uninstallBtn instanceof HTMLElement) uninstallBtn.click();
}

export function update_extension(button: HTMLButtonElement | HTMLInputElement, url: string): void {
  button.value = 'Updating...';
  button.innerHTML = 'updating';
  const textarea = gradioApp().querySelector('#extension_to_install textarea');
  if (!(textarea instanceof HTMLTextAreaElement)) return;
  textarea.value = url;
  updateInput(textarea);
  log('Extension update:', { url });
  const updateBtn = gradioApp().querySelector('#update_extension_button');
  if (updateBtn instanceof HTMLInputElement) updateBtn.click();
}

window.extensions_apply = extensions_apply;
window.extensions_check = extensions_check;
window.uninstall_extension = uninstall_extension;
window.install_extension = install_extension;
window.update_extension = update_extension;