/*
 * 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.storagemanager.deletionhelper;

import android.content.Context;
import androidx.preference.Preference;
import androidx.preference.Preference.OnPreferenceChangeListener;
import androidx.preference.CheckBoxPreference;
import androidx.preference.PreferenceViewHolder;
import android.util.AttributeSet;

import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.android.storagemanager.R;

/**
 * Preference to handle the deletion of various data types in the Deletion Helper.
 */
public abstract class DeletionPreference extends CheckBoxPreference implements
        DeletionType.FreeableChangedListener, OnPreferenceChangeListener {
    private DeletionType.FreeableChangedListener mListener;
    private long mFreeableBytes;
    private int mFreeableItems;
    private DeletionType mDeletionService;
    private TextView mSummary;
    private View mWidget;
    private ProgressBar mProgressBar;
    private boolean mLoaded;

    public DeletionPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        setLayoutResource(R.layout.deletion_preference);
        setOnPreferenceChangeListener(this);
        setPersistent(false);
    }

    /**
     * Returns the number of bytes which can be cleared by the deletion service.
     *
     * @return The number of bytes.
     */
    public long getFreeableBytes(boolean countUnchecked) {
        return (isChecked() || countUnchecked) ? mFreeableBytes : 0;
    }

    /**
     * Register a listener to be called back on when the freeable bytes have changed.
     * @param listener The callback listener.
     */
    public void registerFreeableChangedListener(DeletionType.FreeableChangedListener listener) {
        mListener = listener;
    }

    /**
     * Registers a deletion service to update the preference's information.
     * @param deletionService A photo/video deletion service.
     */
    public void registerDeletionService(DeletionType deletionService) {
        mDeletionService = deletionService;
        if (mDeletionService != null) {
            mDeletionService.registerFreeableChangedListener(this);
        }
    }

    /**
     * Returns the deletion service powering the preference.
     * @return The deletion service.
     */
    public DeletionType getDeletionService() {
        return mDeletionService;
    }

    @Override
    public void onFreeableChanged(int numItems, long freeableBytes) {
        mFreeableItems = numItems;
        mFreeableBytes = freeableBytes;
        mLoaded = true;
        if (mDeletionService != null) {
            setEnabled(!mDeletionService.isEmpty());
        }
        if (!isEnabled()) {
            setChecked(false);
        }
        if (mWidget != null) {
            mWidget.setVisibility(View.VISIBLE);
        }
        if (mProgressBar != null) {
            mProgressBar.setVisibility(View.GONE);
        }
        maybeUpdateListener();
    }

    @Override
    public void onBindViewHolder(PreferenceViewHolder holder) {
        super.onBindViewHolder(holder);
        mSummary = (TextView) holder.findViewById(android.R.id.summary);
        mProgressBar = (ProgressBar) holder.findViewById(R.id.progress_bar);
        mProgressBar.setVisibility(mLoaded ? View.GONE : View.VISIBLE);
        mWidget = holder.findViewById(android.R.id.widget_frame);
        mWidget.setVisibility(mLoaded ? View.VISIBLE : View.GONE);
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        setChecked((boolean) newValue);
        mSummary.setActivated((boolean) newValue);
        maybeUpdateListener();
        return true;
    }

    private void maybeUpdateListener() {
        if (mListener != null) {
            mListener.onFreeableChanged(
                    mFreeableItems, getFreeableBytes(DeletionHelperSettings.COUNT_CHECKED_ONLY));
        }
    }
}
