#include "path_utils.h"
#include "aliases.h"
#include <stdarg.h>
#include <stdio.h>
#include <string.h>

#if defined(__unix__) || defined(__APPLE__) || defined(__ANDROID__)
INTERNAL char path_sep = '/';
#elif defined(_WIN32) || defined(_WIN64)
INTERNAL char path_sep = '\';
#endif

void join_root_and_leaf(const char *root, const char *leaf, char *dst);

void join_path(char *dst, u64 count, ...) {
  va_list args;

  va_start(args, count);

  for (u64 i = 0; i < count; ++i) {
    join_root_and_leaf(dst, va_arg(args, const char *), dst);
  }

  va_end(args);
}

void dirup(char *dst, u64 levels, const char *path) {
  if (levels < 1) {
    return;
  }

  u64 end_index = 0;
  u64 sep_count = 0;

  u64 length = strlen(path);
  if (path[length - 1] == path_sep) {
    --length;
  }

  for (u64 i = length - 1; i >= 0; --i) {
    if (path[i] == path_sep) {
      ++sep_count;
      end_index = i;

      if (sep_count == levels) {
        break;
      }
    }
  }

  if (sep_count < levels) {
    end_index = 0;
  }

  strncpy(dst, path, end_index);
}

void join_root_and_leaf(const char *root, const char *leaf, char *dst) {
  u64 root_length = strlen(root);
  u64 root_end = root_length - 1;

  u64 leaf_length = strlen(leaf);
  u64 leaf_start = 0;

  if (root[root_end] == path_sep) {
    --root_end;
  }

  if (leaf[leaf_start] == path_sep) {
    ++leaf_start;
  }

  strncpy(dst, root, ++root_end);
  dst[root_end] = path_sep;
  strncpy(&(dst[++root_end]), &(leaf[leaf_start]), leaf_length - leaf_start);
}