/**
 * Copyright (c) 2012 Todoroo Inc
 *
 * See the file "LICENSE" for the full license governing this code.
 */
package com.todoroo.astrid.activity;


import java.util.ArrayList;

import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.ActionBar;
import android.support.v4.app.ActionBar.Tab;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.MenuItem;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ListView;

import com.timsu.astrid.R;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.astrid.adapter.AddOnAdapter;
import com.todoroo.astrid.data.AddOn;
import com.todoroo.astrid.service.AddOnService;
import com.todoroo.astrid.service.AstridDependencyInjector;
import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.utility.Constants;

/**
 * TODO: fix deprecation or get rid of me
 *
 * @author Tim Su <tim@todoroo.com>
 *
 */
public class AddOnActivity extends FragmentActivity {

    /** boolean: whether to start on available page */
    public static final String TOKEN_START_WITH_AVAILABLE = "av"; //$NON-NLS-1$

    private View installedView;
    private View availableView;

    @Autowired
    AddOnService addOnService;

    static {
        AstridDependencyInjector.initialize();
    }

    public AddOnActivity() {
        DependencyInjectionService.getInstance().inject(this);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ThemeService.applyTheme(this);
        super.onCreate(savedInstanceState);

        LayoutInflater inflater = LayoutInflater.from(this);
        installedView = inflater.inflate(R.layout.addon_list_container, null);
        availableView = inflater.inflate(R.layout.addon_list_container, null);

        ActionBar ab = getSupportActionBar();
        ab.setDisplayHomeAsUpEnabled(true);
        ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        ActionBar.Tab installedTab = ab.newTab().setText("  " + getString(R.string.AOA_tab_installed)) //$NON-NLS-1$
                                      .setIcon(R.drawable.gl_pencil)
                                      .setTabListener(new AddOnTabListener(installedView));

        ActionBar.Tab availableTab = ab.newTab().setText("  " + getString(R.string.AOA_tab_available)) //$NON-NLS-1$
                                                .setIcon(R.drawable.gl_more)
                                                .setTabListener(new AddOnTabListener(availableView));

        ab.addTab(availableTab);
        ab.addTab(installedTab);

        setTitle(R.string.AOA_title);

        populate();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    private class AddOnTabListener implements ActionBar.TabListener {

        private final View mView;

        public AddOnTabListener(View v) {
            this.mView = v;
        }

        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            //
        }

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            setContentView(mView);
        }

        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            //
        }

    }

    private void populate() {
        AddOn[] list = addOnService.getAddOns();
        if(list == null)
            return;

        ArrayList<AddOn> installed = new ArrayList<AddOn>();
        ArrayList<AddOn> available = new ArrayList<AddOn>();

        for(AddOn addOn : list) {
            if (AddOnService.POWER_PACK_PACKAGE.equals(addOn.getPackageName())) {
                if (addOnService.hasPowerPack())
                    installed.add(addOn);
                else if (Constants.MARKET_STRATEGY.generateMarketLink(addOn.getPackageName()) != null)
                    available.add(addOn);
            } else {
                if(addOnService.isInstalled(addOn))
                    installed.add(addOn);
                else if (Constants.MARKET_STRATEGY.generateMarketLink(addOn.getPackageName()) != null)
                    available.add(addOn);

            }
        }

        ListView installedList = (ListView) installedView.findViewById(R.id.list);
        installedList.setAdapter(new AddOnAdapter(this, true, installed));
        if(installed.size() > 0)
            installedView.findViewById(R.id.empty).setVisibility(View.GONE);

        ListView availableList = (ListView) availableView.findViewById(R.id.list);
        availableList.setAdapter(new AddOnAdapter(this, false, available));
        if(available.size() > 0)
            availableView.findViewById(R.id.empty).setVisibility(View.GONE);
    }

    /**
     * Creates an on click listener
     * @param activity
     * @param finish whether to finish activity
     * @return
     */
    public static DialogInterface.OnClickListener createAddOnClicker(final Activity activity,
            final boolean finish) {
        return new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(activity,
                        AddOnActivity.class);
                intent.putExtra(AddOnActivity.TOKEN_START_WITH_AVAILABLE, true);
                activity.startActivity(intent);
                if(finish)
                    activity.finish();
            }
        };
    }

}
