private void InternalCheckForCompilation()
        {
            if (_isRebuilding != EditorApplication.isCompiling)
            {
                if (!_isRebuilding && EditorApplication.isCompiling)
                {
                    var compilationText =
                        (TextAsset)AssetDatabase.LoadAssetAtPath(CompilationNumberFile, typeof(TextAsset));
                    if (compilationText != null)
                    {
                        CurrentCompilation = JsonConvert.DeserializeObject <JEMBuildCompilation>(compilationText.text);
                    }
                    if (CurrentCompilation == null)
                    {
                        Debug.LogError("Unable to load compilation data to update number.");
                        return;
                    }

                    CurrentCompilation.CompilationNumber++;
                    CurrentCompilation.CompilationTime = DateTime.UtcNow;

                    var json = JsonConvert.SerializeObject(CurrentCompilation, Formatting.Indented);
                    File.WriteAllText(CompilationNumberFile, json);
                    File.WriteAllText(LastContributorFile, JEMBuildEditor.ResolveCurrentContributorName());

                    AssetDatabase.Refresh(ImportAssetOptions.Default);
                    AssetDatabase.SaveAssets();
                    RefreshLocalData();
                }

                _isRebuilding = EditorApplication.isCompiling;
            }

            Repaint();
        }
        /// <summary>
        ///     Saves data to local file
        /// </summary>
        public static void SaveLocalData()
        {
            // save version info
            if (CurrentVersion != null)
            {
                var json = JsonConvert.SerializeObject(CurrentVersion, Formatting.Indented);
                var dir  = Path.GetDirectoryName(VersionFile);
                if (!Directory.Exists(dir))
                {
                    Directory.CreateDirectory(dir);
                }
                File.WriteAllText(VersionFile, json);
            }

            // save compilation info
            if (CurrentCompilation != null)
            {
                var json = JsonConvert.SerializeObject(CurrentCompilation, Formatting.Indented);
                var dir  = Path.GetDirectoryName(CompilationNumberFile);
                if (!Directory.Exists(dir))
                {
                    Directory.CreateDirectory(dir);
                }

                File.WriteAllText(CompilationNumberFile, json);
                File.WriteAllText(LastContributorFile, JEMBuildEditor.ResolveCurrentContributorName());
            }

            // save asset database
            AssetDatabase.Refresh(ImportAssetOptions.Default);
            AssetDatabase.SaveAssets();

            // refresh local data
            RefreshLocalData();
        }
        /// <summary>
        /// Increase build number.
        /// </summary>
        public static void IncreaseBuildNumber()
        {
            var compilationText = (TextAsset)AssetDatabase.LoadAssetAtPath(CompilationNumberFile, typeof(TextAsset));

            if (compilationText != null)
            {
                CurrentCompilation = JsonConvert.DeserializeObject <JEMBuildCompilation>(compilationText.text);
            }
            if (CurrentCompilation == null)
            {
                Debug.LogError("Unable to load compilation data to update number.");
                return;
            }

            CurrentCompilation.BuildNumber++;
            CurrentCompilation.BuildTime = DateTime.UtcNow;

            var json = JsonConvert.SerializeObject(CurrentCompilation, Formatting.Indented);

            File.WriteAllText(CompilationNumberFile, json);
            File.WriteAllText(LastContributorFile, JEMBuildEditor.ResolveCurrentContributorName());

            AssetDatabase.Refresh(ImportAssetOptions.Default);
            AssetDatabase.SaveAssets();
            RefreshLocalData();
        }
        private void OnGUI()
        {
            // check for contributor name
            if (!JEMBuildEditor.IsCurrentContributorNameFileExists())
            {
                GUI.backgroundColor = Color.red;
                EditorGUILayout.HelpBox(
                    $"System was unable to resolve username.txt file. Please, create {$@"{Environment.CurrentDirectory}\username.txt"}",
                    MessageType.Error, true);
                GUI.backgroundColor = Color.white;
                return;
            }

            if (CurrentCompilation == null || CurrentVersion == null)
            {
                GUI.backgroundColor = Color.red;
                EditorGUILayout.HelpBox("Failed to initialize compilation or version resource.", MessageType.Error,
                                        true);
                if (GUILayout.Button("Refresh", GUILayout.Height(30)))
                {
                    RefreshLocalData();
                }

                return;
            }

            _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition);
            {
                InternalDrawFlags();
                InternalDrawCompilationNumber();
                EditorGUILayout.Space();
                InternalDrawVersionInfo();
                GUILayout.FlexibleSpace();

                EditorGUILayout.BeginHorizontal(GUILayout.Height(25));
                {
                    if (GUILayout.Button("Save", GUILayout.Height(25)))
                    {
                        SaveLocalData();
                    }

                    if (GUILayout.Button("R", GUILayout.Width(25), GUILayout.Height(25)))
                    {
                        RefreshLocalData();
                    }
                }
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.BeginHorizontal(GUILayout.Height(20));
                {
                    if (JEMEditorConfiguration.Configuration?.UpdateBundleVersion ?? false)
                    {
                        GUI.enabled = false;
                        GUILayout.Button("Update Bundle Version (auto)", GUILayout.Height(20));
                        GUI.enabled = true;
                    }
                    else
                    {
                        if (GUILayout.Button("Update Bundle Version", GUILayout.Height(20)))
                        {
                            UpdateBundleVersion();
                        }
                    }
                }
                EditorGUILayout.EndHorizontal();
            }
            EditorGUILayout.EndScrollView();
        }
        /// <summary>
        ///     Loads local data.
        /// </summary>
        public static void RefreshLocalData()
        {
            // load version info
            var versionData = (TextAsset)AssetDatabase.LoadAssetAtPath(VersionFile, typeof(TextAsset));

            if (versionData == null)
            {
                // initialize new version file
                CurrentVersion = new JEMBuildVersion();
                var dir = Path.GetDirectoryName(VersionFile);
                if (!Directory.Exists(dir))
                {
                    Directory.CreateDirectory(dir ?? throw new InvalidOperationException());
                }

                File.WriteAllText(VersionFile, JsonConvert.SerializeObject(CurrentVersion, Formatting.Indented));

                AssetDatabase.Refresh(ImportAssetOptions.Default);
                AssetDatabase.SaveAssets();
                Debug.Log($"File {VersionFile} not exist. New file has been created.");
            }
            else
            {
                CurrentVersion = JsonConvert.DeserializeObject <JEMBuildVersion>(versionData.text);
            }

            if (CurrentVersion == null)
            {
                Debug.LogError("Unable to resolve current version data.");
            }

            // load compilation file
            var compilationText = !File.Exists(CompilationNumberFile)
                ? null
                : (TextAsset)AssetDatabase.LoadAssetAtPath(CompilationNumberFile, typeof(TextAsset));

            if (compilationText == null)
            {
                // initialize new compilation number file
                CurrentCompilation = new JEMBuildCompilation();
                var dir = Path.GetDirectoryName(CompilationNumberFile);
                if (!Directory.Exists(dir))
                {
                    Directory.CreateDirectory(dir ?? throw new InvalidOperationException());
                }
                File.WriteAllText(CompilationNumberFile,
                                  JsonConvert.SerializeObject(CurrentCompilation, Formatting.Indented));
                File.WriteAllText(LastContributorFile, JEMBuildEditor.ResolveCurrentContributorName());

                AssetDatabase.Refresh(ImportAssetOptions.Default);
                AssetDatabase.SaveAssets();
                Debug.Log($"File {CompilationNumberFile} not exist. New file has been created.");
            }
            else
            {
                CurrentCompilation = JsonConvert.DeserializeObject <JEMBuildCompilation>(compilationText.text);
            }

            if (CurrentCompilation == null)
            {
                Debug.LogError("Unable to resolve current compilation data.");
            }

            // apply compilation number
            CurrentCompilationNumber = JEMBuild.ResolveCurrentCompilationNumber();
            CurrentBuildNumber       = JEMBuild.ResolveCurrentBuildNumber();

            CurrentSessionTime = JEMBuild.ResolveCurrentSessionTime();

            // apply bundle version
            if (JEMEditorConfiguration.Configuration?.UpdateBundleVersion ?? false)
            {
                UpdateBundleVersion();
            }

            JEMBuildFlags.LoadFlags();
            JEMBuildFlags.ApplyFlags();
        }