/*
 * Copyright (C) 2017 Schürmann & Breitmoser GbR
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.sufficientlysecure.keychain.ui.base;


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.ui.util.ThemeChanger;

/**
 * Setups Toolbar
 */
public abstract class BaseActivity extends AppCompatActivity {
    protected Toolbar mToolbar;
    protected View mStatusBar;
    protected ThemeChanger mThemeChanger;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initTheme();
        initLayout();
        initToolbar();
    }

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

        if (mThemeChanger != null && mThemeChanger.changeTheme()) {
            Intent intent = getIntent();
            finish();
            overridePendingTransition(0, 0);
            startActivity(intent);
            overridePendingTransition(0, 0);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home :
                onBackPressed();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    protected void initLayout() {

    }

    protected void initToolbar() {
        mToolbar = findViewById(R.id.toolbar);
        if (mToolbar != null) {
            setSupportActionBar(mToolbar);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        }
        mStatusBar = findViewById(R.id.status_bar);
    }

    /**
     * Override if you want a different theme!
     */
    protected void initTheme() {
        mThemeChanger = new ThemeChanger(this);
        mThemeChanger.setThemes(R.style.Theme_Keychain_Light, R.style.Theme_Keychain_Dark);
        mThemeChanger.changeTheme();
    }

    protected void setActionBarIcon(int iconRes) {
        mToolbar.setNavigationIcon(iconRes);
    }

    /**
     * Inflate custom design to look like a full screen dialog, as specified in Material Design Guidelines
     * see http://www.google.com/design/spec/components/dialogs.html#dialogs-full-screen-dialogs
     */
    public void setFullScreenDialogDoneClose(int doneText, View.OnClickListener doneOnClickListener,
            View.OnClickListener cancelOnClickListener) {
        setActionBarIcon(R.drawable.ic_close_white_24dp);

        // Inflate the custom action bar view
        final LayoutInflater inflater = (LayoutInflater) getSupportActionBar().getThemedContext()
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        final View customActionBarView = inflater.inflate(R.layout.full_screen_dialog, null);

        TextView firstTextView = customActionBarView.findViewById(R.id.full_screen_dialog_done_text);
        firstTextView.setText(doneText);
        customActionBarView.findViewById(R.id.full_screen_dialog_done).setOnClickListener(
                doneOnClickListener);

        getSupportActionBar().setDisplayShowCustomEnabled(true);
        getSupportActionBar().setDisplayShowTitleEnabled(true);
        getSupportActionBar().setCustomView(customActionBarView, new ActionBar.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT,
                Gravity.END));
        mToolbar.setNavigationOnClickListener(cancelOnClickListener);
    }

    /** Close button only */
    protected void setFullScreenDialogClose(View.OnClickListener cancelOnClickListener, boolean white) {
        if (white) {
            setActionBarIcon(R.drawable.ic_close_white_24dp);
        } else {
            setActionBarIcon(R.drawable.ic_close_black_24dp);
        }
        getSupportActionBar().setDisplayShowTitleEnabled(true);
        mToolbar.setNavigationOnClickListener(cancelOnClickListener);
    }

    protected void setFullScreenDialogClose(View.OnClickListener cancelOnClickListener) {
        setFullScreenDialogClose(cancelOnClickListener, true);
    }

    /** Close button only, with finish-action and given return status, white. */
    protected void setFullScreenDialogClose(final int result, boolean white) {
        setFullScreenDialogClose(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setResult(result);
                finish();
            }
        }, white);
    }

    /**
     * Inflate custom design with two buttons using drawables.
     * This does not conform to the Material Design Guidelines, but we deviate here as this is used
     * to indicate "Allow access"/"Disallow access" to the API, which must be clearly indicated
     */
    protected void setFullScreenDialogTwoButtons(int firstText, int firstDrawableId, View.OnClickListener firstOnClickListener,
                                                 int secondText, int secondDrawableId, View.OnClickListener secondOnClickListener) {

        // Inflate the custom action bar view
        final LayoutInflater inflater = (LayoutInflater) getSupportActionBar().getThemedContext()
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        final View customActionBarView = inflater.inflate(
                R.layout.full_screen_dialog_2, null);

        TextView firstTextView = customActionBarView.findViewById(R.id.actionbar_done_text);
        firstTextView.setText(firstText);
        firstTextView.setCompoundDrawablesWithIntrinsicBounds(firstDrawableId, 0, 0, 0);
        customActionBarView.findViewById(R.id.actionbar_done).setOnClickListener(
                firstOnClickListener);
        TextView secondTextView = customActionBarView.findViewById(R.id.actionbar_cancel_text);
        secondTextView.setText(secondText);
        secondTextView.setCompoundDrawablesWithIntrinsicBounds(secondDrawableId, 0, 0, 0);
        customActionBarView.findViewById(R.id.actionbar_cancel).setOnClickListener(
                secondOnClickListener);

        // Show the custom action bar view and hide the normal Home icon and title.
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        getSupportActionBar().setDisplayShowHomeEnabled(false);
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        getSupportActionBar().setDisplayShowCustomEnabled(true);
        getSupportActionBar().setCustomView(customActionBarView, new ActionBar.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    }
}
