/*
 * 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.tv.dvr.ui.browse;

import android.content.res.Resources;
import android.media.tv.TvInputManager;
import android.os.Bundle;
import androidx.leanback.widget.Action;
import androidx.leanback.widget.OnActionClickedListener;
import androidx.leanback.widget.SparseArrayObjectAdapter;
import com.android.tv.R;
import com.android.tv.TvSingletons;
import com.android.tv.common.util.PermissionUtils;
import com.android.tv.dvr.DvrDataManager;
import com.android.tv.dvr.DvrManager;
import com.android.tv.dvr.DvrWatchedPositionManager;
import com.android.tv.dvr.data.RecordedProgram;
import com.android.tv.dvr.ui.DvrUiHelper;
import com.android.tv.ui.DetailsActivity;

/** {@link androidx.leanback.app.DetailsFragment} for recorded program in DVR. */
public class RecordedProgramDetailsFragment extends DvrDetailsFragment
        implements DvrDataManager.RecordedProgramListener {
    private static final int ACTION_RESUME_PLAYING = 1;
    private static final int ACTION_PLAY_FROM_BEGINNING = 2;
    private static final int ACTION_DELETE_RECORDING = 3;

    private DvrWatchedPositionManager mDvrWatchedPositionManager;

    private RecordedProgram mRecordedProgram;
    private boolean mPaused;
    private DvrDataManager mDvrDataManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        mDvrDataManager = TvSingletons.getSingletons(getContext()).getDvrDataManager();
        mDvrDataManager.addRecordedProgramListener(this);
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onCreateInternal() {
        mDvrWatchedPositionManager =
                TvSingletons.getSingletons(getActivity()).getDvrWatchedPositionManager();
        setDetailsOverviewRow(
                DetailsContent.createFromRecordedProgram(getContext(), mRecordedProgram));
    }

    @Override
    public void onResume() {
        super.onResume();
        if (mPaused) {
            updateActions();
            mPaused = false;
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        mPaused = true;
    }

    @Override
    public void onDestroy() {
        mDvrDataManager.removeRecordedProgramListener(this);
        super.onDestroy();
    }

    @Override
    protected boolean onLoadRecordingDetails(Bundle args) {
        long recordedProgramId = args.getLong(DetailsActivity.RECORDING_ID);
        mRecordedProgram = mDvrDataManager.getRecordedProgram(recordedProgramId);
        return mRecordedProgram != null;
    }

    @Override
    protected SparseArrayObjectAdapter onCreateActionsAdapter() {
        SparseArrayObjectAdapter adapter =
                new SparseArrayObjectAdapter(new ActionPresenterSelector());
        Resources res = getResources();
        if (mDvrWatchedPositionManager.getWatchedStatus(mRecordedProgram)
                == DvrWatchedPositionManager.DVR_WATCHED_STATUS_WATCHING) {
            adapter.set(
                    ACTION_RESUME_PLAYING,
                    new Action(
                            ACTION_RESUME_PLAYING,
                            res.getString(R.string.dvr_detail_resume_play),
                            null,
                            res.getDrawable(R.drawable.lb_ic_play)));
            adapter.set(
                    ACTION_PLAY_FROM_BEGINNING,
                    new Action(
                            ACTION_PLAY_FROM_BEGINNING,
                            res.getString(R.string.dvr_detail_play_from_beginning),
                            null,
                            res.getDrawable(R.drawable.lb_ic_replay)));
        } else {
            adapter.set(
                    ACTION_PLAY_FROM_BEGINNING,
                    new Action(
                            ACTION_PLAY_FROM_BEGINNING,
                            res.getString(R.string.dvr_detail_watch),
                            null,
                            res.getDrawable(R.drawable.lb_ic_play)));
        }
        adapter.set(
                ACTION_DELETE_RECORDING,
                new Action(
                        ACTION_DELETE_RECORDING,
                        res.getString(R.string.dvr_detail_delete),
                        null,
                        res.getDrawable(R.drawable.ic_delete_32dp)));
        return adapter;
    }

    @Override
    protected OnActionClickedListener onCreateOnActionClickedListener() {
        return new OnActionClickedListener() {
            @Override
            public void onActionClicked(Action action) {
                if (action.getId() == ACTION_PLAY_FROM_BEGINNING) {
                    startPlayback(mRecordedProgram, TvInputManager.TIME_SHIFT_INVALID_TIME);
                } else if (action.getId() == ACTION_RESUME_PLAYING) {
                    startPlayback(
                            mRecordedProgram,
                            mDvrWatchedPositionManager.getWatchedPosition(
                                    mRecordedProgram.getId()));
                } else if (action.getId() == ACTION_DELETE_RECORDING) {
                    delete();
                }
            }
        };
    }

    private void delete() {
        if (!PermissionUtils.hasWriteExternalStorage(getContext())
                && DvrManager.isFile(mRecordedProgram.getDataUri())
                && !DvrManager.isFromBundledInput(mRecordedProgram)) {
            DvrUiHelper.showWriteStoragePermissionRationaleDialog(getActivity());
        } else {
            DvrManager dvrManager = TvSingletons.getSingletons(getActivity()).getDvrManager();
            dvrManager.removeRecordedProgram(mRecordedProgram, true);
            getActivity().finish();
        }
    }

    @Override
    public void onRecordedProgramsAdded(RecordedProgram... recordedPrograms) {}

    @Override
    public void onRecordedProgramsChanged(RecordedProgram... recordedPrograms) {}

    @Override
    public void onRecordedProgramsRemoved(RecordedProgram... recordedPrograms) {
        for (RecordedProgram recordedProgram : recordedPrograms) {
            if (recordedProgram.getId() == mRecordedProgram.getId()) {
                getActivity().finish();
            }
        }
    }
}
