package com.lemenzo.gallery;

import android.app.Activity;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.provider.MediaStore;
import android.view.View;
import android.widget.TextView;
import android.widget.PopupMenu;

import com.lemenzo.gallery.albums.AlbumsFragment;
import com.lemenzo.gallery.data.MediaObserver;
import com.lemenzo.gallery.favorites.FavoritesFragment;
import com.lemenzo.gallery.gallery.GalleryFragment;
import com.lemenzo.gallery.search.SearchActivity;
import com.lemenzo.gallery.smart.SmartFragment;
import com.lemenzo.gallery.trash.TrashActivity;
import com.lemenzo.gallery.util.PermissionUtils;
import com.lemenzo.gallery.ui.SystemInsets;

public final class MainActivity extends Activity {
    private static final String STATE_TAB = "selected_tab";
    private TextView photos;
    private TextView albums;
    private TextView favorites;
    private TextView smart;
    private View content;
    private View permissionPanel;
    private int current;
    private MediaObserver observer;

    @Override
    public void onCreate(Bundle state) {
        super.onCreate(state);
        setContentView(R.layout.activity_main);
        SystemInsets.apply(this);
        current = state == null ? 0 : Math.max(0, Math.min(3, state.getInt(STATE_TAB, 0)));

        photos = findViewById(R.id.tab_photos);
        albums = findViewById(R.id.tab_albums);
        favorites = findViewById(R.id.tab_favorites);
        smart = findViewById(R.id.tab_smart);
        content = findViewById(R.id.content);
        permissionPanel = findViewById(R.id.permission_panel);

        photos.setOnClickListener(v -> show(0));
        albums.setOnClickListener(v -> show(1));
        favorites.setOnClickListener(v -> show(2));
        smart.setOnClickListener(v -> show(3));
        findViewById(R.id.search_button).setOnClickListener(
                v -> startActivity(new Intent(this, SearchActivity.class)));
        findViewById(R.id.more_button).setOnClickListener(this::showOverflowMenu);
        findViewById(R.id.permission_button).setOnClickListener(
                v -> PermissionUtils.requestMediaAccess(this));

        updatePermissionState();
        if (PermissionUtils.hasMediaAccess(this)) updateTabVisuals(current);

        observer = new MediaObserver(new Handler(Looper.getMainLooper()), this::refreshCurrent);
        getContentResolver().registerContentObserver(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, observer);
        getContentResolver().registerContentObserver(
                MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true, observer);
    }

    @Override
    protected void onResume() {
        super.onResume();
        updatePermissionState();
    }

    private void showOverflowMenu(View anchor) {
        PopupMenu popup = new PopupMenu(this, anchor);
        popup.getMenu().add(0, 1, 0, R.string.trash);
        popup.getMenu().add(0, 2, 1, R.string.about_menu);
        popup.setOnMenuItemClickListener(item -> {
            if (item.getItemId() == 1) {
                startActivity(new Intent(this, TrashActivity.class));
                return true;
            }
            if (item.getItemId() == 2) {
                startActivity(new Intent(this, AboutActivity.class));
                return true;
            }
            return false;
        });
        popup.show();
    }

    private void updatePermissionState() {
        boolean access = PermissionUtils.hasMediaAccess(this);
        permissionPanel.setVisibility(access ? View.GONE : View.VISIBLE);
        content.setVisibility(access ? View.VISIBLE : View.GONE);
        if (access && getFragmentManager().findFragmentById(R.id.content) == null) {
            show(current);
        }
    }

    private void show(int which) {
        if (!PermissionUtils.hasMediaAccess(this)) {
            updatePermissionState();
            return;
        }
        Fragment existing = getFragmentManager().findFragmentById(R.id.content);
        if (which == current && existing != null) {
            updateTabVisuals(which);
            return;
        }
        current = which;
        Fragment fragment = which == 0
                ? new GalleryFragment()
                : which == 1 ? new AlbumsFragment() : which == 2 ? new FavoritesFragment() : new SmartFragment();
        getFragmentManager().beginTransaction().replace(R.id.content, fragment).commit();

        updateTabVisuals(which);
    }

    private void updateTabVisuals(int which) {
        int primary = getColor(R.color.gallery_text);
        int secondary = getColor(R.color.gallery_text_secondary);
        TextView[] tabs = { photos, albums, favorites, smart };
        for (int i = 0; i < tabs.length; i++) {
            boolean selected = i == which;
            tabs[i].setTextColor(selected ? primary : secondary);
            tabs[i].setBackgroundResource(
                    selected ? R.drawable.bg_tab_selected : R.drawable.bg_tab_unselected);
            tabs[i].setSelected(selected);
        }
    }

    private void refreshCurrent() {
        if (!PermissionUtils.hasMediaAccess(this)) {
            updatePermissionState();
            return;
        }
        Fragment fragment = getFragmentManager().findFragmentById(R.id.content);
        if (fragment instanceof GalleryFragment) {
            ((GalleryFragment) fragment).refresh();
        } else if (fragment instanceof AlbumsFragment) {
            ((AlbumsFragment) fragment).refresh();
        } else if (fragment instanceof FavoritesFragment) {
            ((FavoritesFragment) fragment).refresh();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] results) {
        super.onRequestPermissionsResult(requestCode, permissions, results);
        if (requestCode == PermissionUtils.REQUEST_MEDIA) {
            updatePermissionState();
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putInt(STATE_TAB, current);
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onDestroy() {
        if (observer != null) {
            getContentResolver().unregisterContentObserver(observer);
            observer.close();
            observer = null;
        }
        super.onDestroy();
    }
}
