/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the
 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */

package com.android.systemui.tuner;

import android.annotation.Nullable;
import android.content.Context;
import android.content.Intent;
import android.provider.Settings;
import android.provider.Settings.Global;
import android.util.AttributeSet;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Checkable;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.android.systemui.Prefs;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.volume.ZenModePanel;
import com.android.systemui.volume.ZenModePanel.Callback;

public class TunerZenModePanel extends LinearLayout implements OnClickListener {
    private static final String TAG = "TunerZenModePanel";

    private Callback mCallback;
    private ZenModePanel mZenModePanel;
    private View mHeaderSwitch;
    private int mZenMode;
    private ZenModeController mController;
    private View mButtons;
    private View mMoreSettings;
    private View mDone;
    private OnClickListener mDoneListener;
    private boolean mEditing;

    public TunerZenModePanel(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public void init(ZenModeController zenModeController) {
        mController = zenModeController;
        mHeaderSwitch = findViewById(R.id.tuner_zen_switch);
        mHeaderSwitch.setVisibility(View.VISIBLE);
        mHeaderSwitch.setOnClickListener(this);
        ((TextView) mHeaderSwitch.findViewById(android.R.id.title)).setText(
                R.string.quick_settings_dnd_label);
        mZenModePanel = (ZenModePanel) findViewById(R.id.zen_mode_panel);
        mZenModePanel.init(zenModeController);
        mButtons = findViewById(R.id.tuner_zen_buttons);
        mMoreSettings = mButtons.findViewById(android.R.id.button2);
        mMoreSettings.setOnClickListener(this);
        ((TextView) mMoreSettings).setText(R.string.quick_settings_more_settings);
        mDone = mButtons.findViewById(android.R.id.button1);
        mDone.setOnClickListener(this);
        ((TextView) mDone).setText(R.string.quick_settings_done);
        // Hide the resizing space because it causes issues in the volume panel.
        ViewGroup detail_header = findViewById(R.id.tuner_zen_switch);
        detail_header.getChildAt(0).setVisibility(View.GONE);
        // No background so it can blend with volume panel.
        findViewById(R.id.edit_container).setBackground(null);
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        mEditing = false;
    }

    public void setCallback(Callback zenPanelCallback) {
        mCallback = zenPanelCallback;
        mZenModePanel.setCallback(zenPanelCallback);
    }

    @Override
    public void onClick(View v) {
        if (v == mHeaderSwitch) {
            mEditing = true;
            if (mZenMode == Global.ZEN_MODE_OFF) {
                mZenMode = Prefs.getInt(mContext, Prefs.Key.DND_FAVORITE_ZEN,
                        Global.ZEN_MODE_ALARMS);
                mController.setZen(mZenMode, null, TAG);
                postUpdatePanel();
            } else {
                mZenMode = Global.ZEN_MODE_OFF;
                mController.setZen(Global.ZEN_MODE_OFF, null, TAG);
                postUpdatePanel();
            }
        } else if (v == mMoreSettings) {
            Intent intent = new Intent(Settings.ACTION_ZEN_MODE_SETTINGS);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            getContext().startActivity(intent);
        } else if (v == mDone) {
            mEditing = false;
            setVisibility(View.GONE);
            mDoneListener.onClick(v);
        }
    }

    public boolean isEditing() {
        return mEditing;
    }

    public void setZenState(int zenMode) {
        mZenMode = zenMode;
        postUpdatePanel();
    }

    private void postUpdatePanel() {
        // The complicated structure from reusing the same ZenPanel has resulted in some
        // unstableness/flickering from callbacks coming in quickly. To solve this just
        // post the UI updates a little bit.
        removeCallbacks(mUpdate);
        postDelayed(mUpdate, 40);
    }

    public void setDoneListener(OnClickListener onClickListener) {
        mDoneListener = onClickListener;
    }

    private void updatePanel() {
        boolean zenOn = mZenMode != Global.ZEN_MODE_OFF;
        ((Checkable) mHeaderSwitch.findViewById(android.R.id.toggle)).setChecked(zenOn);
        mZenModePanel.setVisibility(zenOn ? View.VISIBLE : View.GONE);
        mButtons.setVisibility(zenOn ? View.VISIBLE : View.GONE);
    }

    private final Runnable mUpdate = new Runnable() {
        @Override
        public void run() {
            updatePanel();
        }
    };
}
