#include "yardimci_penceler.hpp"

#include <string>
#include <vector>

#include "uygulama_baglam.hpp"

#include "fiko/betik/makro_motor.hpp"
#include "fiko/eklenti/eklenti_yonetici.hpp"
#include "fiko/platform/sistem.hpp"
#include "fiko/ui/pencere_cerceve.hpp"
#include "fiko/ui/tema.hpp"
#include "imgui.h"

namespace fiko {

// ---- Makro Konsolu (Lua) ----
void makroKonsoluCiz(UygulamaBaglam& b) {
  if (!b.panelMakro) return;
  ui::Pencere pen{"⚙ Makro Konsolu", &b.panelMakro, {.boyut = {480, 360}}};
  if (pen) {
    static char satir[1024] = "";
    static int seciliMakro = -1;
    const auto calistirSatir = [&] {
      if (satir[0]) {
        b.makro.satirCalistir(satir);
        satir[0] = '\0';
      }
    };
    ImGui::TextDisabled("Lua 5.4 · fiko.* API · makrolar: %s", b.makroDizin.c_str());
    if (ImGui::Button("Yenile")) seciliMakro = -1;
    ImGui::SameLine();
    const std::vector<std::string> dosyalar = b.makro.makroListele(b.makroDizin);
    ImGui::SetNextItemWidth(-90);
    if (ImGui::BeginCombo("##makrolar",
                          (seciliMakro >= 0 && seciliMakro < (int)dosyalar.size())
                              ? dosyalar[seciliMakro].c_str()
                              : "(makro seç)")) {
      for (int i = 0; i < (int)dosyalar.size(); ++i) {
        if (ImGui::Selectable(dosyalar[i].c_str(), seciliMakro == i)) seciliMakro = i;
      }
      ImGui::EndCombo();
    }
    ImGui::SameLine();
    if (ImGui::Button("Çalıştır") && seciliMakro >= 0 && seciliMakro < (int)dosyalar.size()) {
      b.makro.dosyaCalistir(dosyalar[seciliMakro]);
    }
    ImGui::Separator();
    ImGui::BeginChild("makroCikti", {0, -ImGui::GetFrameHeightWithSpacing() - 4}, true,
                      ImGuiWindowFlags_HorizontalScrollbar);
    for (const std::string& s : b.makro.cikti()) {
      const bool hata = s.rfind("HATA", 0) == 0;
      if (hata) ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(255, 120, 110, 255));
      ImGui::TextUnformatted(s.c_str());
      if (hata) ImGui::PopStyleColor();
    }
    if (ImGui::GetScrollY() >= ImGui::GetScrollMaxY() - 4) ImGui::SetScrollHereY(1.0f);
    ImGui::EndChild();
    ImGui::SetNextItemWidth(-118);
    if (ImGui::InputText("##satir", satir, sizeof(satir),
                         ImGuiInputTextFlags_EnterReturnsTrue)) {
      calistirSatir();
      ImGui::SetKeyboardFocusHere(-1);
    }
    ImGui::SameLine();
    if (ImGui::Button("Gönder")) calistirSatir();
    ImGui::SameLine();
    if (ImGui::Button("Temizle")) b.makro.ciktiTemizle();
  }
}

// ---- Eklenti Yöneticisi (DLL) ----
void eklentiYoneticiCiz(UygulamaBaglam& b) {
  if (!b.panelEklenti) return;
  ui::Pencere pen{"🧩 Eklenti Yöneticisi", &b.panelEklenti, {.boyut = {520, 300}}};
  if (pen) {
    const std::string eklDizin = sistem::calistirilabilirDizin() + "eklentiler";
    ImGui::TextDisabled("Dizin: %s", eklDizin.c_str());
    if (ImGui::Button("Dizini Tara")) {
      const size_t n = b.eklentiler.tara(eklDizin);
      b.bilgiVer(std::to_string(n) + " eklenti yüklendi");
    }
    ImGui::SameLine();
    const std::string sh = b.eklentiler.sonHata();
    if (!sh.empty()) {
      ImGui::TextColored(ui::tema().hata, "%s", sh.c_str());
    }
    ImGui::Separator();
    if (ImGui::BeginTable("eklentiler", 4,
                          ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersInnerV |
                              ImGuiTableFlags_SizingStretchProp)) {
      ImGui::TableSetupColumn("Ad", ImGuiTableColumnFlags_WidthStretch);
      ImGui::TableSetupColumn("Sürüm", ImGuiTableColumnFlags_WidthFixed, 60);
      ImGui::TableSetupColumn("Açıklama", ImGuiTableColumnFlags_WidthStretch);
      ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, 72);
      ImGui::TableHeadersRow();
      const auto& kayitlar = b.eklentiler.hepsi();
      int kaldirIndeks = -1;
      for (size_t i = 0; i < kayitlar.size(); ++i) {
        const auto& k = kayitlar[i];
        ImGui::TableNextRow();
        ImGui::TableNextColumn();
        ImGui::TextUnformatted(k.bilgi.ad ? k.bilgi.ad : "?");
        if (k.bilgi.yazar && k.bilgi.yazar[0]) {
          ImGui::SameLine();
          ImGui::TextDisabled("· %s", k.bilgi.yazar);
        }
        ImGui::TableNextColumn();
        ImGui::TextDisabled("%s", k.bilgi.surum ? k.bilgi.surum : "-");
        ImGui::TableNextColumn();
        ImGui::TextUnformatted(k.bilgi.aciklama ? k.bilgi.aciklama : "");
        ImGui::TableNextColumn();
        ImGui::PushID((int)i);
        if (ImGui::SmallButton("Kaldır")) kaldirIndeks = (int)i;
        ImGui::PopID();
      }
      if (kaldirIndeks >= 0) b.eklentiler.kaldir((size_t)kaldirIndeks);
      ImGui::EndTable();
    }
    if (b.eklentiler.hepsi().empty()) {
      ImGui::TextDisabled("Yüklü eklenti yok. DLL'leri 'eklentiler/' dizinine koyup tarayın.");
    }
  }
}

}  // namespace fiko
