SlotLoader *slotLoader = nullptr;

SlotLoaderPath::SlotLoaderPath() {
  browse.setText("Browse ...");
  append(label,  { 40, 0 }, 5);
  append(path,   { ~0, 0 }, 5);
  append(browse, { 80, 0 }, 0);
}

SlotLoader::SlotLoader() {
  layout.setMargin(5);
  base.label.setText("Base:");
  slot[0].label.setText("Slot:");
  slot[1].label.setText("Slot:");
  loadButton.setText("Load");

  append(layout);
  layout.append(base,                { ~0, 0 }, 5);
  layout.append(slot[0],             { ~0, 0 }, 5);
  layout.append(slot[1],             { ~0, 0 }, 5);
  layout.append(controlLayout,       { ~0, 0 }, 0);
    controlLayout.append(spacer,     { ~0, 0 }, 0);
    controlLayout.append(loadButton, { 80, 0 }, 0);

  setGeometry({ 128, 128, 500, layout.minimumGeometry().height });
  windowManager->append(this, "SlotLoader");
}

void SlotLoader::synchronize() {
  loadButton.setEnabled(base.path.text() != "");
}

void SlotLoader::loadSatellaviewSlotted() {
  setTitle("Load Cartridge - Satellaview-Slotted");

  base.path.setText("");

  slot[0].path.setText("");
  slot[0].path.setEnabled(true);
  slot[0].browse.setEnabled(true);

  slot[1].path.setText("");
  slot[1].path.setEnabled(false);
  slot[1].browse.setEnabled(false);

  base.browse.onActivate = [&] {
    fileBrowser->open("Load Cartridge - SNES", FileBrowser::Mode::SNES, [&](const string &filename) {
      base.path.setText(filename);
      synchronize();
    });
  };

  slot[0].browse.onActivate = [&] {
    fileBrowser->open("Load Cartridge - Satellaview", FileBrowser::Mode::Satellaview, [&](const string &filename) {
      slot[0].path.setText(filename);
      synchronize();
    });
  };

  loadButton.onActivate = [&] {
    this->setVisible(false);
    interface->snes.loadSatellaviewSlottedCartridge(base.path.text(), slot[0].path.text());
  };

  synchronize();
  setVisible();
}

void SlotLoader::loadSatellaview() {
  setTitle("Load Cartridge - Satellaview");

  base.path.setText(config->path.bios.satellaview);

  slot[0].path.setText("");
  slot[0].path.setEnabled(true);
  slot[0].browse.setEnabled(true);

  slot[1].path.setText("");
  slot[1].path.setEnabled(false);
  slot[1].browse.setEnabled(false);

  base.browse.onActivate = [&] {
    fileBrowser->open("Load BIOS - Satellaview", FileBrowser::Mode::SNES, [&](const string &filename) {
      config->path.bios.satellaview = filename;
      base.path.setText(filename);
      synchronize();
    });
  };

  slot[0].browse.onActivate = [&] {
    fileBrowser->open("Load Cartridge - Satellaview", FileBrowser::Mode::Satellaview, [&](const string &filename) {
      slot[0].path.setText(filename);
      synchronize();
    });
  };

  loadButton.onActivate = [&] {
    this->setVisible(false);
    interface->snes.loadSatellaviewCartridge(base.path.text(), slot[0].path.text());
  };

  synchronize();
  setVisible();
}

void SlotLoader::loadSufamiTurbo() {
  setTitle("Load Cartridge - Sufami Turbo");

  base.path.setText(config->path.bios.sufamiTurbo);

  slot[0].path.setText("");
  slot[0].path.setEnabled(true);
  slot[0].browse.setEnabled(true);

  slot[1].path.setText("");
  slot[1].path.setEnabled(true);
  slot[1].browse.setEnabled(true);

  base.browse.onActivate = [&] {
    fileBrowser->open("Load BIOS - Sufami Turbo", FileBrowser::Mode::SNES, [&](const string &filename) {
      config->path.bios.sufamiTurbo = filename;
      base.path.setText(filename);
      synchronize();
    });
  };

  slot[0].browse.onActivate = [&] {
    fileBrowser->open("Load Cartridge - Sufami Turbo", FileBrowser::Mode::SufamiTurbo, [&](const string &filename) {
      slot[0].path.setText(filename);
      synchronize();
    });
  };

  slot[1].browse.onActivate = [&] {
    fileBrowser->open("Load Cartridge - Sufami Turbo", FileBrowser::Mode::SufamiTurbo, [&](const string &filename) {
      slot[1].path.setText(filename);
      synchronize();
    });
  };

  loadButton.onActivate = [&] {
    this->setVisible(false);
    interface->snes.loadSufamiTurboCartridge(base.path.text(), slot[0].path.text(), slot[1].path.text());
  };

  synchronize();
  setVisible();
}

void SlotLoader::loadSuperGameBoy() {
  setTitle("Load Cartridge - Super Game Boy");

  base.path.setText(config->path.bios.superGameBoy);

  slot[0].path.setText("");
  slot[0].path.setEnabled(true);
  slot[0].browse.setEnabled(true);

  slot[1].path.setText("");
  slot[1].path.setEnabled(false);
  slot[1].browse.setEnabled(false);

  base.browse.onActivate = [&] {
    fileBrowser->open("Load BIOS - Super Game Boy", FileBrowser::Mode::SNES, [&](const string &filename) {
      config->path.bios.superGameBoy = filename;
      base.path.setText(filename);
      synchronize();
    });
  };

  slot[0].browse.onActivate = [&] {
    fileBrowser->open("Load Cartridge - Game Boy", FileBrowser::Mode::GameBoy, [&](const string &filename) {
      slot[0].path.setText(filename);
      synchronize();
    });
  };

  loadButton.onActivate = [&] {
    this->setVisible(false);
    interface->snes.loadSuperGameBoyCartridge(base.path.text(), slot[0].path.text());
  };

  synchronize();
  setVisible();
}
