package com.alienpants.leafpicrevived.about;

import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.text.method.LinkMovementMethod;
import android.widget.ScrollView;
import android.widget.Toast;

import androidx.annotation.CallSuper;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.alienpants.leafpicrevived.BuildConfig;
import com.alienpants.leafpicrevived.R;
import com.alienpants.leafpicrevived.activities.base.BaseActivity;
import com.alienpants.leafpicrevived.util.AlertDialogsHelper;
import com.alienpants.leafpicrevived.util.ApplicationUtils;
import com.alienpants.leafpicrevived.util.ChromeCustomTabs;
import com.alienpants.leafpicrevived.util.preferences.Prefs;
import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial;

import org.horaapps.liz.ui.ThemedTextView;

import java.util.ArrayList;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

import static com.alienpants.leafpicrevived.util.ServerConstants.GITHUB_CALVIN;
import static com.alienpants.leafpicrevived.util.ServerConstants.GITHUB_DONALD;
import static com.alienpants.leafpicrevived.util.ServerConstants.GITHUB_LEAFPIC;
import static com.alienpants.leafpicrevived.util.ServerConstants.GITHUB_TOM;
import static com.alienpants.leafpicrevived.util.ServerConstants.GOOGLE_ABOUT_CALVIN;
import static com.alienpants.leafpicrevived.util.ServerConstants.LEAFPIC_CROWDIN;
import static com.alienpants.leafpicrevived.util.ServerConstants.LEAFPIC_ISSUES;
import static com.alienpants.leafpicrevived.util.ServerConstants.LEAFPIC_LICENSE;
import static com.alienpants.leafpicrevived.util.ServerConstants.MAIL_CALVIN;
import static com.alienpants.leafpicrevived.util.ServerConstants.MAIL_DONALD;
import static com.alienpants.leafpicrevived.util.ServerConstants.MAIL_GILBERT;
import static com.alienpants.leafpicrevived.util.ServerConstants.MAIL_TOM;
import static com.alienpants.leafpicrevived.util.ServerConstants.TWITTER_ABOUT_DONALD;
import static com.alienpants.leafpicrevived.util.ServerConstants.TWITTER_ABOUT_GILBERT;

/**
 * The Activity to show About application
 * <p>
 * Includes the following data:
 * - Developers
 * - Translators
 * - Relevant app links
 */
public class AboutActivity extends BaseActivity implements ContactListener {

    @BindView(R.id.toolbar)
    Toolbar toolbar;
    @BindView(R.id.about_version_item_sub)
    ThemedTextView appVersion;
    @BindView(R.id.aboutAct_scrollView)
    ScrollView aboutScrollView;
    @BindView(R.id.about_developer_donald)
    AboutCreator aboutDonald;
    @BindView(R.id.about_developer_gilbert)
    AboutCreator aboutGilbert;
    @BindView(R.id.about_patryk_goworowski_item_sub)
    ThemedTextView specialThanksPatryk;
    @BindView(R.id.about_link_changelog)
    AboutLink linkChangelog;
    @BindView(R.id.list_contributors)
    RecyclerView rvContributors;

    private ChromeCustomTabs chromeTabs;
    private int emojiEasterEggCount = 0;

    public static void startActivity(@NonNull Context context) {
        context.startActivity(new Intent(context, AboutActivity.class));
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_about);
        ButterKnife.bind(this);
        chromeTabs = new ChromeCustomTabs(AboutActivity.this);

        initUi();
        setTitle(R.string.about);
    }

    @Override
    public void onDestroy() {
        chromeTabs.destroy();
        super.onDestroy();
    }

    /**
     * Select List
     */
    @OnClick(R.id.about_link_report_bug)
    public void onReportBug() {
        chromeTabs.launchUrl(LEAFPIC_ISSUES);
    }

    @OnClick(R.id.about_link_translate)
    public void onTranslate() {
        chromeTabs.launchUrl(LEAFPIC_CROWDIN);
    }

    @OnClick(R.id.about_link_rate)
    public void onRate() {
        Uri uri = Uri.parse(String.format("market://details?id=%s", BuildConfig.APPLICATION_ID));
        Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
        /* To count with Play market backstack, After pressing back button,
         * to taken back to our application, we need to add following flags to intent. */

        int flags = Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_MULTIPLE_TASK;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
            flags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;

        goToMarket.addFlags(flags);

        try {
            startActivity(goToMarket);
        } catch (ActivityNotFoundException e) {
            startActivity(new Intent(Intent.ACTION_VIEW,
                    Uri.parse(String.format("http://play.google.com/store/apps/details?id=%s", BuildConfig.APPLICATION_ID))));
        }
    }

    @OnClick(R.id.about_link_github)
    public void onGitHub() {
        chromeTabs.launchUrl(GITHUB_LEAFPIC);
    }

    @OnClick(R.id.about_link_license)
    public void onLicense() {
        chromeTabs.launchUrl(LEAFPIC_LICENSE);
    }

    @OnClick(R.id.about_link_changelog)
    public void onChangelog() {
        AlertDialog alertDialog = AlertDialogsHelper.showChangelogDialog(this);
        alertDialog.setButton(
                DialogInterface.BUTTON_POSITIVE,
                getString(R.string.ok_action).toUpperCase(),
                (dialogInterface, i) -> {
                });
        alertDialog.show();
    }

    private void emojiEasterEgg() {
        emojiEasterEggCount++;
        if (emojiEasterEggCount > 3) {
            boolean showEasterEgg = Prefs.showEasterEgg();
            Toast.makeText(this,
                    (!showEasterEgg ? this.getString(R.string.easter_egg_enable) : this.getString(R.string.easter_egg_disable))
                            + " " + this.getString(R.string.emoji_easter_egg), Toast.LENGTH_SHORT).show();
            Prefs.setShowEasterEgg(!showEasterEgg);
            emojiEasterEggCount = 0;
        }
    }

    private void mail(String mail) {
        Intent intent = new Intent(Intent.ACTION_SENDTO);
        intent.setData(Uri.parse("mailto:" + mail));
        try {
            startActivity(intent);
        } catch (ActivityNotFoundException e) {
            Toast.makeText(this, getString(R.string.send_mail_error), Toast.LENGTH_SHORT).show();
        }
    }

    private void initUi() {
        setSupportActionBar(toolbar);
        appVersion.setText(ApplicationUtils.getAppVersion());
        linkChangelog.setDescription(ApplicationUtils.getAppVersion());


        ArrayList<Contributor> contributors = new ArrayList<>(1);

        /** Calvin */
        Contributor calvin = new Contributor(
                getString(R.string.developer_calvin_name),
                getString(R.string.about_developer_calvin_description),
                R.drawable.calvin_profile);
        calvin.setEmail(MAIL_CALVIN);
        calvin.addSocial(getString(R.string.google_plus_link), GOOGLE_ABOUT_CALVIN);
        calvin.addSocial(getString(R.string.github), GITHUB_CALVIN);
        contributors.add(calvin);

        Contributor tom = new Contributor(
                getString(R.string.developer_tom_name),
                getString(R.string.about_developer_tom_description),
                R.drawable.alienpants_logo);
        tom.setEmail(MAIL_TOM);
        tom.addSocial(getString(R.string.github), GITHUB_TOM);
        contributors.add(tom);

        ContributorsAdapter contributorsAdapter = new ContributorsAdapter(this, contributors, this);
        rvContributors.setHasFixedSize(true);
        rvContributors.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        rvContributors.setAdapter(contributorsAdapter);

        /** Donald */
        ArrayList<Contact> donaldContacts = new ArrayList<>();
        donaldContacts.add(new Contact(TWITTER_ABOUT_DONALD, getString(R.string.twitter_link)));
        donaldContacts.add(new Contact(GITHUB_DONALD, getString(R.string.github_link)));
        aboutDonald.setupListeners(this, MAIL_DONALD, donaldContacts);

        /** Jibo */
        ArrayList<Contact> jiboContacts = new ArrayList<>();
        jiboContacts.add(new Contact(TWITTER_ABOUT_GILBERT, getString(R.string.twitter_link)));
//        jiboContacts.add(new Contact(GITHUB_GILBERT, getString(R.string.github_link)));
        aboutGilbert.setupListeners(this, MAIL_GILBERT, jiboContacts);

        aboutGilbert.setOnClickListener(v -> emojiEasterEgg());
        specialThanksPatryk.setMovementMethod(LinkMovementMethod.getInstance());
    }

    @CallSuper
    @Override
    public void updateUiElements() {
        super.updateUiElements();
        toolbar.setBackgroundColor(getPrimaryColor());
        toolbar.setNavigationIcon(getToolbarIcon(GoogleMaterial.Icon.gmd_arrow_back));
        toolbar.setNavigationOnClickListener(v -> onBackPressed());

        setScrollViewColor(aboutScrollView);
        setStatusBarColor();
        setNavBarColor();

        specialThanksPatryk.setLinkTextColor(getAccentColor());
    }

    @Override
    public void onContactClicked(Contact contact) {
        chromeTabs.launchUrl(contact.getValue());
    }

    @Override
    public void onMailClicked(String mail) {
        mail(mail);
    }
}