package com.learnncode.mediachooser.fragment;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.MediaStore.Video.VideoColumns;
import android.support.v4.app.Fragment;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.Toast;

import com.learnncode.mediachooser.R;
import com.learnncode.mediachooser.Utilities.BucketEntry;
import com.learnncode.mediachooser.Utilities.MediaChooserConstants;
import com.learnncode.mediachooser.activity.HomeScreenMediaChooser;
import com.learnncode.mediachooser.adapter.BucketGridAdapter;

import java.util.ArrayList;


/*
 * Copyright 2015 - learnNcode ([email protected])
 *
 * 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.
 */


public class BucketVideoFragment extends Fragment {

    // The indices should match the following projections.
    private final int INDEX_BUCKET_ID = 0;
    private final int INDEX_BUCKET_NAME = 1;
    private final int INDEX_BUCKET_URL = 2;

    private final String[] PROJECTION_BUCKET = {
            VideoColumns.BUCKET_ID,
            VideoColumns.BUCKET_DISPLAY_NAME,
            VideoColumns.DATA,
    };

    private View mView;
    private BucketGridAdapter mBucketAdapter;
    private GridView mGridView;
    private Cursor mCursor;


    public BucketVideoFragment() {
        setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        getActivity().getWindow().setBackgroundDrawable(null);

        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(broadcastReceiver, new IntentFilter(MediaChooserConstants.BRAODCAST_VIDEO_RECEIVER));


        if (mView == null) {
            mView = inflater.inflate(R.layout.view_grid_layout_media_chooser, container, false);
            mGridView = (GridView) mView.findViewById(R.id.gridViewFromMediaChooser);
            init();
        } else {
            if (mView.getParent() != null) {
                ((ViewGroup) mView.getParent()).removeView(mView);
            }
            if (mBucketAdapter == null || mBucketAdapter.getCount() == 0) {
                Toast.makeText(getActivity(), getActivity().getString(R.string.no_media_file_available), Toast.LENGTH_SHORT).show();
            }
        }
        return mView;
    }


    private void init() {
        final String orderBy = MediaStore.Video.Media.DATE_TAKEN;
        mCursor = getActivity().getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, PROJECTION_BUCKET, null, null, orderBy + " DESC");
        ArrayList<BucketEntry> buffer = new ArrayList<BucketEntry>();
        try {
            while (mCursor.moveToNext()) {
                BucketEntry entry = new BucketEntry(
                        mCursor.getInt(INDEX_BUCKET_ID),
                        mCursor.getString(INDEX_BUCKET_NAME), mCursor.getString(INDEX_BUCKET_URL));


                if (!buffer.contains(entry)) {
                    buffer.add(entry);
                    Log.i("BucketGridAdapter", "BucketVideoFragment--buffer|" + buffer.size()+ "--entry|" + entry.bucketName + "---------|" + entry.bucketUrl);
                }
            }
            if (mCursor.getCount() > 0) {
                mBucketAdapter = new BucketGridAdapter(getActivity(), buffer, true);
                mBucketAdapter.bucketVideoFragment = this;
                mGridView.setAdapter(mBucketAdapter);
            } else {
                Toast.makeText(getActivity(), getActivity().getString(R.string.no_media_file_available), Toast.LENGTH_SHORT).show();
            }
            mGridView.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> adapter, View view,
                                        int position, long id) {

                    BucketEntry bucketEntry = (BucketEntry) adapter.getItemAtPosition(position);
                    Intent selectImageIntent = new Intent(getActivity(), HomeScreenMediaChooser.class);
                    selectImageIntent.putExtra("name", bucketEntry.bucketName);
                    selectImageIntent.putExtra("isFromBucket", true);
                    getActivity().startActivityForResult(selectImageIntent, MediaChooserConstants.BUCKET_SELECT_VIDEO_CODE);

                }
            });

        } finally {
            mCursor.close();
        }
    }

    public BucketGridAdapter getAdapter() {
        if (mBucketAdapter != null) {
            return mBucketAdapter;
        }
        return null;
    }


    BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            mBucketAdapter.addLatestEntry(intent.getStringExtra("value"));
            mBucketAdapter.notifyDataSetChanged();
        }
    };


    @Override
    public void onDestroy() {
        LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(broadcastReceiver);
        super.onDestroy();
    }

}