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

взяти визначення КД;
взяти визначення мавка;
взяти визначення мавка/пристрій;
взяти визначення мавка/бібліотека;

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

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

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

    п += 1;
  }

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

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

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

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

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

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

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

внутрішня дія розмова_читати(
  М: *мавка::Машина,
  перед: кд,
  історія: логічне,
  вихід: *кд,
  вихід_кінець_файлу: *логічне
) -> логічне {
  змінна розмір: природне;
  змінна дані: *п8;
  змінна кінець_файлу = природне(ні);

  якщо не пристрій_мавки_читати_кд(
    перед.розмір,
    перед.дані,
    розмір::адреса,
    дані::адреса,
    природне(історія),
    кінець_файлу::адреса
  ) {
    вернути ні;
  }

  вихід::вміст = кд {
    розмір,
    дані
  };
  вихід_кінець_файлу::вміст = логічне(кінець_файлу);

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

внутрішня дія розмова_обробити_значення(
  М: *мавка::Машина,
  значення: мавка::Значення
) {
  мавка::надрукувати_значення(
    М,
    значення,
    2,
    0
  );
}

внутрішня дія розмова_обробити_падіння(
  М: *мавка::Машина,
  інформація_падіння: мавка::ІнформаціяПадіння
) {
  мавка::надрукувати_інформацію_падіння(
    М,
    інформація_падіння
  );
}

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

  п = 1;

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

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

    п += 1;
  }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  вернути 0;
}