package com.fekracomputers.islamiclibrary.tableOFContents;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

import com.fekracomputers.islamiclibrary.R;
import com.fekracomputers.islamiclibrary.appliation.IslamicLibraryApplication;
import com.fekracomputers.islamiclibrary.browsing.fragment.BookInformationFragment;
import com.fekracomputers.islamiclibrary.browsing.interfaces.BookCardEventListener;
import com.fekracomputers.islamiclibrary.browsing.interfaces.BookCardEventsCallback;
import com.fekracomputers.islamiclibrary.browsing.interfaces.BrowsingActivityListingFragment;
import com.fekracomputers.islamiclibrary.databases.BookDatabaseContract;
import com.fekracomputers.islamiclibrary.databases.BookDatabaseException;
import com.fekracomputers.islamiclibrary.databases.BookDatabaseHelper;
import com.fekracomputers.islamiclibrary.databases.BooksInformationDBContract;
import com.fekracomputers.islamiclibrary.model.BookPartsInfo;
import com.fekracomputers.islamiclibrary.model.Bookmark;
import com.fekracomputers.islamiclibrary.model.Highlight;
import com.fekracomputers.islamiclibrary.model.Title;
import com.fekracomputers.islamiclibrary.reading.ReadingActivity;
import com.fekracomputers.islamiclibrary.settings.SettingsActivity;
import com.fekracomputers.islamiclibrary.tableOFContents.fragment.BookmarkFragment;
import com.fekracomputers.islamiclibrary.tableOFContents.fragment.HighlightFragment;
import com.fekracomputers.islamiclibrary.tableOFContents.fragment.TableOfContentFragment;
import com.fekracomputers.islamiclibrary.utility.Util;

import java.util.ArrayList;

import timber.log.Timber;

/**
 * Activity to display pager for {@link TableOfContentFragment}, {@link HighlightFragment},
 * {@link TableOfContentFragment}
 * and {@link BookmarkFragment}
 */
public class TableOfContentsBookmarksActivity extends AppCompatActivity
        implements BookmarkFragment.onBookmarkClickListener,
        TableOfContentFragment.OnTableOfContentTitleClickListener,
        HighlightFragment.onHighlightClickListener,
        BookCardEventListener {

    private int bookId;
    private String bookName;
    private boolean mIsArabic;
    private int pageId;
    private boolean buildHistory;
    private int titleId;
    private BookPartsInfo mBooksPartInfo;
    @NonNull
    private ArrayList<BrowsingActivityListingFragment> mDownloadStatusUpdateListener = new ArrayList<>();
    @NonNull
    private BookCardEventsCallback bookCardEventsCallback = new BookCardEventsCallback(this) {


        @Override
        public synchronized void notifyBookDownloadStatusUpdate(int bookId, int downloadStatus) {
            for (BrowsingActivityListingFragment browsingActivityListingFragment : mDownloadStatusUpdateListener) {
                browsingActivityListingFragment.BookDownloadStatusUpdate(bookId, downloadStatus);
            }
        }

        @Override
        public void notifyBookDownloadStatusUpdate() {
            for (BrowsingActivityListingFragment browsingActivityListingFragment : mDownloadStatusUpdateListener) {
                browsingActivityListingFragment.reAcquireCursors();
            }
        }

        @Override
        protected void notifyBookDownloadFailed(int bookId, String failurReason) {

        }

    };

    @Override
    public void registerListener(BrowsingActivityListingFragment listener) {
        mDownloadStatusUpdateListener.add(listener);
    }

    @Override
    public void unRegisterListener(BrowsingActivityListingFragment listener) {
        mDownloadStatusUpdateListener.remove(listener);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ((IslamicLibraryApplication) getApplication()).refreshLocale(this, false);
        super.onCreate(savedInstanceState);
        Intent intent = getIntent();
        int initial_section = intent.getIntExtra(ReadingActivity.KEY_TAB_NAME, 0);
        bookId = intent.getIntExtra(BooksInformationDBContract.BooksAuthors.COLUMN_NAME_BOOK_ID, 0);
        bookName = intent.getStringExtra(BooksInformationDBContract.BookInformationEntery.COLUMN_NAME_TITLE);
        setContentView(R.layout.activity_book_toc_bookmarks);
        bookCardEventsCallback.intializeListener();
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        ActionBar supportActionBar = getSupportActionBar();
        if (supportActionBar != null) {
            supportActionBar.setDisplayHomeAsUpEnabled(true);
            supportActionBar.setTitle(bookName);
        }


        SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());


        ViewPager mViewPager = findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        if (intent.hasExtra(BookDatabaseContract.TitlesEntry.COLUMN_NAME_PAGE_ID)) {
            pageId = intent.getIntExtra(BookDatabaseContract.TitlesEntry.COLUMN_NAME_PAGE_ID, 0);
            titleId = intent.getIntExtra(BookDatabaseContract.TitlesEntry.COLUMN_NAME_ID, 0);
            buildHistory = true;
            mViewPager.setCurrentItem(initial_section);
        } else {
            mViewPager.setCurrentItem(initial_section);
        }
        TabLayout tabLayout = findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);
        try {
            mBooksPartInfo = BookDatabaseHelper.getInstance(this, bookId).getBookPartsInfo();
        } catch (BookDatabaseException e) {
            Timber.e(e);
            finish();
        }
        mIsArabic = Util.isArabicUi(this);


    }

    @Override
    protected void onResume() {
        super.onResume();
        Util.restartIfLocaleChanged(this, mIsArabic);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_book_toc_bookmarks, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            Intent intent = new Intent(this, SettingsActivity.class);
            startActivity(intent);
            return true;


        } else if (id == android.R.id.home) {
            finish();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onBookmarkClicked(@NonNull Bookmark bookmark) {
        finishAndGoTo(bookmark.pageInfo.pageId);
    }

    @Override
    public void OnOnTableOfContentTitleClicked(@NonNull Title title) {
        finishAndGoTo(title.pageInfo.pageId);
    }

    @Override
    public BookPartsInfo getBookPartsInfo() {
        return mBooksPartInfo;
    }

    @Override
    public void onHighlightClicked(@NonNull Highlight highlight) {
        finishAndGoTo(highlight.pageInfo.pageId);
    }

    private void finishAndGoTo(int pageId) {
        Intent intent = new Intent(this, ReadingActivity.class);
        intent.putExtra(BookDatabaseContract.PageEntry.COLUMN_NAME_PAGE_ID, pageId);
        setResult(Activity.RESULT_OK, intent);
        finish();
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        bookCardEventsCallback.removeBookDownloadBroadcastListener();
    }

    @NonNull
    @Override
    public BookCardEventsCallback getBookCardEventCallback() {
        return bookCardEventsCallback;
    }


    public enum TableOfContentAndNotesTab {
        TAB_TABLE_OF_CONTENTS(R.string.tab_Table_of_Contents),
        TAB_Notes_and_Highlights(R.string.tab_Notes_and_Highlights),
        TAB_BOOKMARKS(R.string.tab_Bookmarks),
        TAB_OVERVIEW(R.string.tab_Overview);

        private final int nameResId;

        TableOfContentAndNotesTab(int nameResId) {
            this.nameResId = nameResId;
        }

        public int getNameResId() {
            return nameResId;
        }


    }


    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */
    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a PlaceholderFragment (defined as a static inner class below).
            Fragment fragment;

            if (position == TableOfContentAndNotesTab.TAB_TABLE_OF_CONTENTS.ordinal()) {
                fragment = TableOfContentFragment.newInstance(bookId, bookName, buildHistory, pageId, titleId);

            } else if (position == TableOfContentAndNotesTab.TAB_OVERVIEW.ordinal()) {
                fragment = BookInformationFragment.newInstance(bookId);
            } else if (position == TableOfContentAndNotesTab.TAB_BOOKMARKS.ordinal()) {
                fragment = BookmarkFragment.newInstance(bookId);
            } else if (position == TableOfContentAndNotesTab.TAB_Notes_and_Highlights.ordinal()) {
                fragment = HighlightFragment.newInstance(bookId);
            } else {
                fragment = TableOfContentFragment.newInstance(bookId, bookName);

            }
            return fragment;
        }

        @Override
        public int getCount() {
            return TableOfContentAndNotesTab.values().length;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return getString(TableOfContentAndNotesTab.values()[position].getNameResId());
        }
    }
}