// 2025-2026 Богданович Давид Когут Прихожденко (кдб.дійсність.укр)

взяти визначення мавка;
взяти визначення мавка/бібліотека;

дія перевірити_чи_ю8_починається_на(значення: ю8, початок: ю8) -> логічне {
  змінна п: природне = 0;

  поки п < початок.розмір {
    якщо п >= значення.розмір {
      вернути ні;
    }

    якщо значення.дані[п] != початок.дані[п] {
      вернути ні;
    }

    п += 1;
  }

  вернути так;
}

// дія обробити_чергу_здійснення(М: *мавка::Машина) -> ц32 {
//   змінна інформація_падіння: мавка::ІнформаціяПадіння;
//   змінна елемент_черги_здійснення: мавка::ЕлементЧергиЗдійснення;

//   поки мавка::забрати_з_черги_здійснення(М, елемент_черги_здійснення::адреса) {
//     мавка::здійснити(
//       М,
//       мавка::НЕДІЙСНЕ,
//       елемент_черги_здійснення.значення,
//       елемент_черги_здійснення.задіяні,
//       мавка::Місцезнаходження { пусто, 0 }
//     );

//     якщо мавка::отримати_інформацію_падіння(М, інформація_падіння::адреса) {
//       мавка::пристрій::надрукувати_інформацію_падіння(
//         М,
//         інформація_падіння
//       );

//       мавка::знищити_інформацію_падіння(М, інформація_падіння);

//       вернути 1;
//     }
//   }

//   вернути 0;
// }

дія старт(кількість_аргументів: природне, аргументи: *ю8) -> ц32 {
  змінна шлях_до_теки_модулів_ю8: ю8;
  змінна шлях_до_теки_паків_ю8: ю8;
  змінна шлях_до_стандартного_вводу_ю8 = ю8"діалог";
  змінна шлях_до_файлу: ю8;
  змінна знайдено_шлях_до_файлу = ні;
  змінна п: природне;
  змінна успіх: логічне;
  змінна абсолютний_шлях_до_файлу_модуля: *мавка::ПредметДаних;
  змінна шлях_до_теки_модулів: *мавка::ПредметДаних;
  змінна шлях_до_теки_паків: *мавка::ПредметДаних;
  змінна шлях_до_стандартного_вводу: *мавка::ПредметДаних;
  змінна назва_модуля: *мавка::ПредметТексту;
  змінна М: *мавка::Машина;
  змінна кількість_назв_взяти: природне;
  змінна назви_взяти: **мавка::ПредметТексту;
  змінна інформація_падіння: мавка::ІнформаціяПадіння;
  змінна текст_помилки: кд;
  змінна елемент_черги_здійснення: мавка::ЕлементЧергиЗдійснення;
  змінна результат: ц32;

  п = 1;

  поки п < кількість_аргументів {
    якщо перевірити_чи_ю8_починається_на(аргументи[п], ю8"--") {
    } інакше {
      шлях_до_файлу = аргументи[п];
      знайдено_шлях_до_файлу = так;

      п = кількість_аргументів; // Вийти з циклу
    }

    п += 1;
  }

  М = мавка::пристрій::створити_машину();

  мавка::пристрій::визначити_глобально_мавка(М);
  мавка::пристрій::визначити_глобальні_виводу(М);

  мавка::бібліотека::ініціалізувати(М);

  якщо знайдено_шлях_до_файлу {
    якщо КД::перевірити_чи_ю8_рівні(шлях_до_файлу, ю8"версія") {
      змінна версія_мавки_кд: кд;
      пристрій_мавки_отримати_версію(версія_мавки_кд.розмір::адреса, версія_мавки_кд.дані::адреса);
      мавка::надрукувати_кд(М, версія_мавки_кд);
      мавка::звільнити(М, версія_мавки_кд.дані);
      вернути 0;
    }

    успіх = мавка::пристрій::розібрати_шлях_початкового_модуля(
      М,
      мавка::створити_дані(М, шлях_до_файлу.розмір, шлях_до_файлу.дані),
      абсолютний_шлях_до_файлу_модуля::адреса,
      шлях_до_теки_модулів::адреса,
      шлях_до_теки_паків::адреса,
      назва_модуля::адреса
    );

    якщо не успіх {
      мавка::вивести_кд(М, "Неможливо виконати файл \"");
      пристрій_мавки_вивести_ю8(шлях_до_файлу.розмір, шлях_до_файлу.дані);
      мавка::вивести_кд(М, "\"\р");
      вернути 1;
    }

    мавка::пристрій::записати_шлях_до_теки_модулів_та_паків(
      М,
      шлях_до_теки_модулів,
      шлях_до_теки_паків,
    );

    мавка::пристрій::взяти_файл(
      М,
      абсолютний_шлях_до_файлу_модуля,
      назва_модуля,
      мавка::Місцезнаходження { абсолютний_шлях_до_файлу_модуля, 0 }
    );

    якщо мавка::отримати_інформацію_падіння(М, інформація_падіння::адреса) {
      мавка::пристрій::надрукувати_інформацію_падіння(
        М,
        інформація_падіння
      );

      мавка::знищити_інформацію_падіння(М, інформація_падіння);

      вернути 1;
    }
  } інакше {
    успіх = пристрій_мавки_отримати_поточний_шлях_процесу(
      шлях_до_теки_модулів_ю8.розмір::адреса,
      шлях_до_теки_модулів_ю8.дані::адреса
    );

    якщо не успіх {
      мавка::надрукувати_кд(М, "Неможливо отримати поточний шлях процесу.");
      вернути 1;
    }

    успіх = пристрій_мавки_отримати_теку_до_паків(
      шлях_до_теки_модулів_ю8.розмір,
      шлях_до_теки_модулів_ю8.дані,
      шлях_до_теки_паків_ю8.розмір::адреса,
      шлях_до_теки_паків_ю8.дані::адреса
    );

    якщо не успіх {
      мавка::надрукувати_кд(М, "Неможливо отримати теку до паків.");
      вернути 1;
    }

    шлях_до_теки_модулів = мавка::створити_дані(М, шлях_до_теки_модулів_ю8.розмір, шлях_до_теки_модулів_ю8.дані);
    шлях_до_теки_паків = мавка::створити_дані(М, шлях_до_теки_паків_ю8.розмір, шлях_до_теки_паків_ю8.дані);
    шлях_до_стандартного_вводу = мавка::створити_дані(М, шлях_до_стандартного_вводу_ю8.розмір, шлях_до_стандартного_вводу_ю8.дані);

    мавка::пристрій::записати_шлях_до_теки_модулів_та_паків(
      М,
      шлях_до_теки_модулів,
      шлях_до_теки_паків,
    );

    змінна версія_мавки_кд: кд;
    пристрій_мавки_отримати_версію(версія_мавки_кд.розмір::адреса, версія_мавки_кд.дані::адреса);

    мавка::вивести_кд(М, "Діалог Мавки ");
    мавка::надрукувати_кд(М, версія_мавки_кд);

    мавка::звільнити(М, версія_мавки_кд.дані);

    мавка::пристрій::почати_діалог(
      М,
      шлях_до_теки_модулів,
      шлях_до_стандартного_вводу
    );
  }

  // результат = обробити_чергу_здійснення(М);

  // якщо результат != 0 {
  //   вернути результат;
  // }

  // потім: запустити очікувач подій

  вернути 0;
}