package com.example.timetable;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;

import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.example.timetable.fragments_bottom_navigation.Fragment_notifications;
import com.example.timetable.fragments_bottom_navigation.Fragment_settings;
import com.example.timetable.fragments_bottom_navigation.Fragment_staff;
import com.example.timetable.fragments_bottom_navigation.Fragment_timetable;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.MutableData;
import com.google.firebase.database.Transaction;
import com.google.firebase.database.ValueEventListener;

public class MainActivity extends AppCompatActivity
{
    //переменные для нижнего меню
    BottomNavigationView bottomNavigationView;

    //загрузка
    SharedPreferences sharedPreferences_load_uid, sharedPreferences_load_role, sharedPreferences_save_role,
            sharedPreferences_save_count_parse, sharedPreferences_save_parse_group;
    String UID, role;

    //окно диалога
    TextView title_alert_dialog, message_alert_dialog;
    Button positive_button_alert_dialog, negative_button_alert_dialog;
    AlertDialog.Builder builder;

    FirebaseDatabase database;
    DatabaseReference databaseReference, databaseReference_post, databaseReference_userCount, databaseReference_Under_userCount,
            databaseReference_versions, databaseReference_parse;

    Context context;

    private static final String ADMINS_NODE = "Админы";
    private static final String STUDENT_NODE = "Студент";
    private static final String USERS_NODE = "Пользователи";
    private static final String TEACHER_NODE = "Преподаватель";
    private static final String USERS_VERSION = "Приложение/Версия";
    private static final String REGULAR_USER = "Обычный пользователь";
    private static final String USERS_COUNT_NODE = "Количество пользователей";
    private static final String USERS_COUNT_PARSE = "Приложение/Количество парсинга";
    private static final String STUDENT_COUNT_NODE = "Количество пользователей студентов";
    private static final String TEACHER_COUNT_NODE = "Количество пользователей преподавателей";
    private static final String USERS_PARSE_GROUP = "Приложение/Группа парсинга преподавателей";
    private static final String URL = "https://timetable-studcal-default-rtdb.asia-southeast1.firebasedatabase.app/";
    private static final String URL_download = "https://drive.google.com/drive/u/0/folders/1N3He1a9LIJbA7vIdbN38rAMWvV-1pnjV";

    //меняются
    private static final String WELCOME_TEXT = "Вы студент или преподаватель?\nПозже вы можете изменить свою роль в: Настройки → Профиль → *нажать на Роль*";
    private static final String UPDATE_VERSION_TO = "\nОбновите приложение до версии: ";
    private static final String NOW_VERSION = "Текущая версия приложения: ";
    private static final String NEW_VERSION = "Доступна новая версия!";
    private static final String WELCOME = "Добро пожаловать!";
    private static final String WELCOME_TEACHER = "Препод.";
    private static final String WELCOME_STUDENT = "Студ.";
    private static final String DOWNLOAD = "Скачать";
    private static final String LATER = "Отложить";

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

        // Получение контекста активности
        context = this;

        database = FirebaseDatabase.getInstance(URL);

        //Загрузка из памяти роли пользователя
        sharedPreferences_load_role = context.getSharedPreferences("select_role", Context.MODE_PRIVATE);
        role = sharedPreferences_load_role.getString("Role", null);

        //Загрузка из памяти UID_User
        sharedPreferences_load_uid = context.getSharedPreferences("UID_User", Context.MODE_PRIVATE);
        UID = sharedPreferences_load_uid.getString("UID", null);

        //если роль не выбрана
        if (role == null)
        {
            showSelect(WELCOME, WELCOME_TEXT, WELCOME_TEACHER, WELCOME_STUDENT);
        }
        else
        {
            loadRole(role);

            if (role.equals(TEACHER_NODE))
            {
                // Получение количества парсинга расписания в день
                loadCountParseFireBase(USERS_PARSE_GROUP);
            }
        }

        //если UID создан узнать должность и сохранить
        if (UID != null && !UID.isEmpty())
        {
            postSave();
        }

        // Увеличиить счетчик открытия приложения и сохранить его
        OpenCount();

        // Получение версии приложения из Firebase для обновления
        loadVersionsFireBase();

        // Получение количества парсинга расписания в день
        loadCountParseFireBase(USERS_COUNT_PARSE);

        // Установить фрагмент по умолчанию при запуске активности
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new Fragment_timetable()).commit();

        bottomNavigationView = findViewById(R.id.bottomNavigationView);
        // Установить первую ячейку активной
        bottomNavigationView.setSelectedItemId(R.id.timetable);
        bottomNavigationView.setOnNavigationItemSelectedListener(navListener);
    }

    //загрузить роли пользователя
    public void loadRole(String role_str)
    {
        try
        {
            if (role == null || role.isEmpty())
            {
                // Создание Firebase Realtime Database и получение ссылки на нужную ветку
                databaseReference = database.getReference(USERS_NODE);
                databaseReference_userCount = databaseReference.child(USERS_COUNT_NODE);

                // Увеличить счетчик
                if (role_str.equals(STUDENT_NODE))
                {
                    databaseReference_Under_userCount = databaseReference.child(STUDENT_COUNT_NODE);
                }
                else if (role_str.equals(TEACHER_NODE))
                {
                    databaseReference_Under_userCount = databaseReference.child(TEACHER_COUNT_NODE);
                }

                //Всего пользователей
                loadUserCount(databaseReference_userCount);
                //Определенных пользователей
                loadUserCount(databaseReference_Under_userCount);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    private void loadUserCount(DatabaseReference databaseReference)
    {
        try
        {
            databaseReference.runTransaction(new Transaction.Handler()
            {
                @NonNull
                @Override
                public Transaction.Result doTransaction(@NonNull MutableData count)
                {
                    Long currentCount = count.getValue(Long.class);

                    if (currentCount == null)
                    {
                        currentCount = 0L;
                    }

                    currentCount++;
                    count.setValue(currentCount);

                    return Transaction.success(count);
                }

                @Override
                public void onComplete(DatabaseError databaseError, boolean committed, DataSnapshot dataSnapshot)
                {}
            });
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    //узнать должность и сохранить
    public void postSave()
    {
        try
        {
            databaseReference_post = database.getReference(USERS_NODE).child(ADMINS_NODE);
            databaseReference_post.child(UID).addListenerForSingleValueEvent(new ValueEventListener()
            {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot)
                {
                    sharedPreferences_save_role = context.getSharedPreferences("select_post", Context.MODE_PRIVATE);
                    SharedPreferences.Editor editor = sharedPreferences_save_role.edit();

                    // Если UID найден в databaseReference_post сохранить статус админа в памяти
                    if (dataSnapshot.exists())
                    {
                        String adminValue = dataSnapshot.getValue(String.class);

                        editor.putString("Post", adminValue);
                    }
                    else
                    {
                        editor.putString("Post", REGULAR_USER);
                    }

                    editor.apply();
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) { }
            });
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    // Получение версии приложения из Firebase
    public void loadVersionsFireBase()
    {
        try
        {
            databaseReference_versions = database.getReference(USERS_VERSION);
            databaseReference_versions.addListenerForSingleValueEvent(new ValueEventListener()
            {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot)
                {
                    // Установить версию Firebase
                    String firebaseVersion = dataSnapshot.getValue(String.class);

                    // Получить версию приложения из памяти
                    String Version = loadVersions();

                    // Сравнение версий
                    if (firebaseVersion != null && Version != null && !firebaseVersion.equals(Version))
                    {
                        showSelect(NEW_VERSION,  NOW_VERSION + Version + UPDATE_VERSION_TO + firebaseVersion, DOWNLOAD, LATER);
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError)
                { }
            });
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    // Получение версии приложения из памяти
    private String loadVersions()
    {
        try
        {
            PackageManager packageManager = getPackageManager();
            PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
            return packageInfo.versionName;
        }
        catch (PackageManager.NameNotFoundException e)
        {
            e.printStackTrace();
            return "";
        }
    }

    // Получение количества парсинга расписания в день группа для парсинга преподов
    public void loadCountParseFireBase(String parse_string)
    {
        try
        {
            databaseReference_parse = database.getReference(parse_string);
            databaseReference_parse.addListenerForSingleValueEvent(new ValueEventListener()
            {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot)
                {
                    //количество парсинга
                    if (parse_string.equals(USERS_COUNT_PARSE))
                    {
                        Integer firebaseParse = dataSnapshot.getValue(Integer.class);

                        sharedPreferences_save_count_parse = context.getSharedPreferences("count_parse", Context.MODE_PRIVATE);
                        SharedPreferences.Editor editor = sharedPreferences_save_count_parse.edit();
                        editor.putInt("Count", firebaseParse);
                        editor.apply();
                    }

                    //группа для парсинга преподов
                    if (parse_string.equals(USERS_PARSE_GROUP))
                    {
                        String firebaseParse = dataSnapshot.getValue(String.class);

                        sharedPreferences_save_parse_group = context.getSharedPreferences("parse_group_teacher", Context.MODE_PRIVATE);
                        SharedPreferences.Editor editor = sharedPreferences_save_parse_group.edit();
                        editor.putString("Group", firebaseParse);
                        editor.apply();
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError)
                { }
            });
        }
        catch (Exception e)
        { e.printStackTrace(); }
    }

    //счетчик открытия приложения
    private void OpenCount()
    {
        try
        {
            // текущее значение счетчика
            SharedPreferences sharedPreferences_count_open = getSharedPreferences("Count_open", MODE_PRIVATE);
            int appOpenCount = sharedPreferences_count_open.getInt("count", 0);
            appOpenCount++;

            // сохранить новое значение
            SharedPreferences.Editor editor = sharedPreferences_count_open.edit();
            editor.putInt("count", appOpenCount);
            editor.apply();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    // Метод для отображения диалога выбора
    private void showSelect(String welcome, String text, String pos, String neg)
    {
        // Версии разные, отобразить окно обновления
        builder = new AlertDialog.Builder(context);
        View dialogView = LayoutInflater.from(context).inflate(R.layout.custom_alert_dialog, null);
        builder.setView(dialogView);
        builder.setCancelable(false);

        title_alert_dialog = dialogView.findViewById(R.id.title_alert_dialog);
        message_alert_dialog = dialogView.findViewById(R.id.message_alert_dialog);
        positive_button_alert_dialog = dialogView.findViewById(R.id.positive_button_alert_dialog);
        negative_button_alert_dialog = dialogView.findViewById(R.id.negative_button_alert_dialog);

        //вывести текст
        title_alert_dialog.setText(welcome);
        message_alert_dialog.setText(text);
        positive_button_alert_dialog.setText(pos);
        negative_button_alert_dialog.setText(neg);

        AlertDialog dialog = builder.create();

        dialog.show();

        negative_button_alert_dialog.setOnClickListener(v ->
        {
            if(welcome.equals(WELCOME))
            {
                saveRole(STUDENT_NODE);
            }

            dialog.dismiss();
        });

        positive_button_alert_dialog.setOnClickListener(v ->
        {
            if(welcome.equals(WELCOME))
            {
                saveRole(TEACHER_NODE);
            }
            else
            {
                // Создать Intent для открытия веб-сайта
                Uri uri = Uri.parse(URL_download);
                Intent intent = new Intent(Intent.ACTION_VIEW, uri);

                // Проверить есть ли приложение для просмотра веб-сайтов
                if (intent.resolveActivity(getPackageManager()) != null)
                {
                    // Запустить Intent, чтобы открыть веб-сайт
                    startActivity(intent);
                }
            }

            dialog.dismiss();
        });
    }

    // Сохранить role в SharedPreferences
    public void saveRole(String role)
    {
        // Перезагрузить BottomNavigationView
        reloadBottomNavigationView();

        try
        {
            sharedPreferences_save_role = context.getSharedPreferences("select_role", Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences_save_role.edit();
            editor.putString("Role", role);
            editor.apply();

            //Генерация UID
            loadRole(role);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    // Перезагрузить BottomNavigationView
    private void reloadBottomNavigationView()
    {
        bottomNavigationView.setOnNavigationItemSelectedListener(navListener);
        bottomNavigationView.setSelectedItemId(bottomNavigationView.getSelectedItemId());
    }

    //функция BottomNavigationView
    private final BottomNavigationView.OnNavigationItemSelectedListener navListener = item ->
    {
        //фрагмент для смены окон в нижнем меню
        Fragment selectedFragment = null;

        switch (item.getItemId())
        {
            case R.id.timetable:
                selectedFragment = new Fragment_timetable();
                getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                break;
            case R.id.notifications:
                selectedFragment = new Fragment_notifications();
                getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                break;
            case R.id.staff:
                selectedFragment = new Fragment_staff();
                getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                break;
            case R.id.settings:
                selectedFragment = new Fragment_settings();
                getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                break;
        }

        //открыть выбранное окно
        if (selectedFragment != null)
        {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, selectedFragment).commit();
        }

        return true;
    };

    @Override
    public void onBackPressed()
    {
        if (getSupportFragmentManager().getBackStackEntryCount() > 0)
        {
            getSupportFragmentManager().popBackStack();
        }
        else
        {
            int selectedItemId = bottomNavigationView.getSelectedItemId();

            if (selectedItemId != R.id.timetable)
            {
                getSupportFragmentManager().popBackStack();
                Fragment selectedFragment = new Fragment_timetable();
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, selectedFragment).commit();

                bottomNavigationView.setSelectedItemId(R.id.timetable);
            }
            else
            {
                super.onBackPressed();
            }
        }
    }
}

как тебе мой код? оптимизируй и улучши код если возможно