#include "isinst.h"
#include "depinst.h"
#include "repo.h"

void parse_name_ver(const char *dirname, char *pkgname, size_t pkgnamesize, char *pkgver, size_t pkgversize) {
  const char *lastdash = strrchr(dirname, '-');
  if (lastdash != NULL) {
    size_t namelen = lastdash - dirname;
    if (namelen < pkgnamesize) {
      strncpy(pkgname, dirname, namelen);
      pkgname[namelen] = '\0';
    }

    if (strlen(lastdash + 1) < pkgversize) {
      strlcpy(pkgver, lastdash + 1, pkgversize);
    }
  }
}

int is_new_ver(const char *instver, const char *availablevers) {
  return strcmp(availablevers, instver) > 0;
}

void list_instpkg(Package *packages, int *cntpkg, int maxpk) {
  const char *db_path = "/var/db/pkg";
  DIR *dir = opendir(db_path);
  struct dirent *entry;

  if (!dir) {
    perror("opendirに失敗");
    return;
  }

  *cntpkg = 0;

  while ((entry = readdir(dir)) != NULL) {
    if (*cntpkg >= maxpk) {
      break;
    }

    if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
      continue;
    }

    if (entry->d_type == DT_DIR) {
      char *lastdash = strrchr(entry->d_name, '-');
      if (!lastdash) {
        continue;
      }

      size_t namelen = lastdash - entry->d_name;

      if (namelen < sizeof(packages[*cntpkg].name)) {
        strncpy(packages[*cntpkg].name, entry->d_name, namelen);
        packages[*cntpkg].name[namelen] = '\0';
      }

      strncpy(packages[*cntpkg].version, lastdash + 1, sizeof(packages[*cntpkg].version) - 1);
      packages[*cntpkg].version[sizeof(packages[*cntpkg].version) - 1] = '\0';

      (*cntpkg)++;
    }
  }

  closedir(dir);
}

void diffinst() {
  Package instpkg[MAX_PACKAGES];
  int cntinstpkg = 0;
  list_instpkg(instpkg, &cntinstpkg, MAX_PACKAGES);

  for (int i = 0; i < cntinstpkg; i++) {
    char availablepkgname[1024];
    if (findpkgver(instpkg[i].name, availablepkgname, sizeof(availablepkgname)) != 1) {
      continue;
    }

    char availablevers[256] = {0};

    char *lastdash = strrchr(availablepkgname, '-');
    if (!lastdash) {
      continue;
    }

    strlcpy(availablevers, lastdash + 1, sizeof(availablevers));
    char *tgz = strstr(availablevers, ".tgz");
    if (tgz) {
      *tgz = '\0';
    }

    if (is_new_ver(instpkg[i].version, availablevers)) {
      printf("%s (インストールしたバージョン: %s、更新出来るバージョン: %s)\n",
        instpkg[i].name, instpkg[i].version, availablevers);
    }
  }
}