package com.apollographql.apollo.sample.detail;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.apollographql.apollo.ApolloCall;
import com.apollographql.apollo.api.Response;
import com.apollographql.apollo.cache.normalized.CacheControl;
import com.apollographql.apollo.rx2.Rx2Apollo;
import com.apollographql.apollo.sample.EntryDetailQuery;
import com.apollographql.apollo.sample.GitHuntApplication;
import com.apollographql.apollo.sample.R;

import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.observers.DisposableSingleObserver;
import io.reactivex.schedulers.Schedulers;

public class GitHuntEntryDetailActivity extends AppCompatActivity {

    private static final String TAG = GitHuntEntryDetailActivity.class.getSimpleName();
    private static final String ARG_REPOSITORY_FULL_NAME = "arg_repo_full_name";

    private GitHuntApplication application;

    ViewGroup content;
    ProgressBar progressBar;
    TextView description;
    TextView name;
    TextView postedBy;

    private String repoFullName;

    private CompositeDisposable disposables = new CompositeDisposable();

    public static Intent newIntent(Context context, String repositoryFullName) {
        Intent intent = new Intent(context, GitHuntEntryDetailActivity.class);
        intent.putExtra(ARG_REPOSITORY_FULL_NAME, repositoryFullName);
        return intent;
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_repository_detail);
        repoFullName = getIntent().getStringExtra(ARG_REPOSITORY_FULL_NAME);
        application = (GitHuntApplication) getApplication();
        content = (ViewGroup) findViewById(R.id.content_holder);
        progressBar = (ProgressBar) findViewById(R.id.loading_bar);
        name = (TextView) findViewById(R.id.tv_repository_name);
        description = (TextView) findViewById(R.id.tv_repository_description);
        postedBy = (TextView) findViewById(R.id.tv_posted_by);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        fetchRepositoryDetails();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    private void setEntryData(EntryDetailQuery.Data data) {
        content.setVisibility(View.VISIBLE);
        progressBar.setVisibility(View.GONE);

        final EntryDetailQuery.Entry entry = data.entry();
        if (entry != null) {
            name.setText(entry.repository().full_name());
            description.setText(entry.repository().description());
            postedBy.setText(getResources().getString(R.string.posted_by, entry.postedBy().login()));
        }
    }

    private void fetchRepositoryDetails() {
        ApolloCall<EntryDetailQuery.Data> entryDetailQuery = application.apolloClient()
                .query(new EntryDetailQuery(repoFullName))
                .cacheControl(CacheControl.CACHE_FIRST);

        //Example call using Rx2Support
        disposables.add(Rx2Apollo.from(entryDetailQuery)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new DisposableSingleObserver<Response<EntryDetailQuery.Data>>() {
                    @Override
                    public void onSuccess(Response<EntryDetailQuery.Data> dataResponse) {
                        setEntryData(dataResponse.data());
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, e.getMessage(), e);
                    }
                }));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        disposables.dispose();
    }
}