#include <windows.h>
#include "mavka/main.h"

п8* utf16_to_utf8(const wchar_t* utf16_str, природне* out_size) {
  if (!utf16_str) {
    *out_size = 0;
    return NULL;
  }

  int size_needed =
      WideCharToMultiByte(CP_UTF8, 0, utf16_str, -1, NULL, 0, NULL, NULL);
  if (size_needed <= 0) {
    *out_size = 0;
    return NULL;
  }

  HANDLE купа = GetProcessHeap();
  п8* utf8_str = (п8*)HeapAlloc(купа, 0, size_needed);
  if (!utf8_str) {
    *out_size = 0;
    return NULL;
  }

  WideCharToMultiByte(CP_UTF8, 0, utf16_str, -1, (char*)utf8_str, size_needed,
                      NULL, NULL);
  *out_size = size_needed - 1; // Exclude null terminator
  return utf8_str;
}

int main(void) {
  int argc;
  wchar_t** argv = CommandLineToArgvW(GetCommandLineW(), &argc);
  if (!argv) {
    return 1;
  }

  HANDLE купа = GetProcessHeap();

  ю8* аргументи = (ю8*)HeapAlloc(купа, 0, argc * sizeof(ю8));
  if (!аргументи) {
    LocalFree(argv);
    return 1;
  }

  п8** allocated_buffers = (п8**)HeapAlloc(купа, 0, argc * sizeof(п8*));
  if (!allocated_buffers) {
    HeapFree(купа, 0, аргументи);
    LocalFree(argv);
    return 1;
  }

  for (int i = 0; i < argc; i++) {
    природне size;
    allocated_buffers[i] = utf16_to_utf8(argv[i], &size);
    аргументи[i].розмір = size;
    аргументи[i].дані = allocated_buffers[i];
  }

  int r = почати(argc, аргументи);

  for (int i = 0; i < argc; i++) {
    if (allocated_buffers[i]) {
      HeapFree(купа, 0, allocated_buffers[i]);
    }
  }
  HeapFree(купа, 0, allocated_buffers);
  HeapFree(купа, 0, аргументи);
  LocalFree(argv);

  return r;
}