#include "sync.h"

struct MemoryStruct {
  char *memory;
  size_t size;
  const char *pkg;
};

size_t query_repo(void *ptr, size_t size, size_t nmemb, void *stream) {
  struct MemoryStruct *ms = (struct MemoryStruct *)stream;
  char *data = (char *)ptr;
  size_t sumsize = size * nmemb;

  for (char *cur = data; cur < data + sumsize;) {
    char *a_tag_start = strstr(cur, "<a href=\"");
    if (!a_tag_start) {
      break;
    }

    char *urlstart = a_tag_start + 9;
    char *urlend = strchr(urlstart, '"');
    if (!urlend) {
      break;
    }

    *urlend = '\0';

    if (!strstr(urlstart, ".tgz") || strstr(urlstart, ".sig")) {
      cur = urlend + 1;
      continue;
    }

    char *dot = strrchr(urlstart, '.');
    if (dot) *dot = '\0';

    FILE *fp = fopen("/etc/fugu/PACKAGE.txt", "a");
    if (fp) {
      fprintf(fp, "%s\n", urlstart);
      fclose(fp);
    }

    cur = urlend + 1;
  }

  return sumsize;
}

void fetch_repo(const char *url) {
  CURL *curl;
  CURLcode res;

  curl_global_init(CURL_GLOBAL_ALL);

  curl = curl_easy_init();
  if (curl) {
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, query_repo);
    curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");

    res = curl_easy_perform(curl);
    if (res != CURLE_OK) {
      fprintf(stderr, "curl_easy_perform()に失敗:%s\n", curl_easy_strerror(res));
    }

    curl_easy_cleanup(curl);
    curl_global_cleanup();
  }
}

void sync() {
  const char *basedir = "/etc/fugu";
  const char *path = "/etc/fugu/PACKAGE.txt";
  const char *repolist = "/etc/fugu/config.cnf";
  struct stat st = {0};
  FILE *file;
  char url[256];

  if (stat(basedir, &st) == -1) {
    if (mkdir(basedir, 0755) == -1) {
      perror("mkdirに失敗");
      return;
    }
  }

  if (remove(path) != 0 && errno != ENOENT) {
    perror("PACKAGEファイルを削除に失敗");
    return;
  }

  file = fopen(repolist, "r");
  if (file == NULL) {
    perror("config.cnfファイルを開くのに失敗");
    return;
  }

  while (fgets(url, sizeof(url), file)) {
    url[strcspn(url, "\n")] = 0;
    printf("%sを同期中…\n", url);
    fetch_repo(url);
  }

  fclose(file);
  printf("完了。\n");
}