/*
 * Copyright (C) 2014 Pedro Vicente Gómez Sánchez.
 *
 * 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.
 */
package com.github.pedrovgs.tuentitv.presenter;

import com.github.pedrovgs.tuentitv.R;
import com.github.pedrovgs.tuentitv.model.Accounts;
import com.github.pedrovgs.tuentitv.model.Agenda;
import com.github.pedrovgs.tuentitv.model.Chat;
import com.github.pedrovgs.tuentitv.model.Contact;
import com.github.pedrovgs.tuentitv.model.ConversationSummary;
import com.github.pedrovgs.tuentitv.model.MediaElement;
import com.github.pedrovgs.tuentitv.model.MediaGallery;
import com.github.pedrovgs.tuentitv.ui.data.CardInfo;
import com.github.pedrovgs.tuentitv.ui.data.IconInfo;
import com.github.pedrovgs.tuentitv.ui.data.ImageInfo;
import com.github.pedrovgs.tuentitv.ui.navigator.Navigator;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import javax.inject.Inject;

/**
 * Class created to work as main view presenter. This presenter has all the responsibility related
 * to the main view presentation logic: obtain a list of favorite contacts, obtain a list of recent
 * conversations, show a list of all user's contacts sorted alphabetically.
 *
 * Main collaborators of this class ar Accounts, Agenda, MediaGallery and Chat. Collaborators
 * needed
 * to perform all the business/presentation logic related to this view.
 *
 * @author Pedro Vicente Gómez Sánchez.
 */
public class MainPresenter {

  private final Accounts accounts;
  private final Agenda agenda;
  private final MediaGallery mediaGallery;
  private final Chat chat;
  private final Navigator navigator;

  private View view;

  @Inject
  public MainPresenter(Accounts accounts, Agenda agenda, MediaGallery mediaGallery, Chat chat,
      Navigator navigator) {
    this.accounts = accounts;
    this.agenda = agenda;
    this.mediaGallery = mediaGallery;
    this.chat = chat;
    this.navigator = navigator;
  }

  public void setView(View view) {
    this.view = view;
  }

  public void loadData() {
    view.showDefaultBackground();
    List<CardInfo> favorites = getFavoriteContacts();
    List<CardInfo> conversations = getConversations();
    List<CardInfo> contacts = getAllContacts();
    List<ImageInfo> mediaElements = getAllMediaElements();
    List<IconInfo> preferences = getPreferences();
    view.showMainInformation(favorites, conversations, contacts, mediaElements, preferences);
  }

  public void onCardInfoSelected(CardInfo cardInfo) {
    if (cardInfo != null) {
      view.updateBackground(cardInfo.getSecondaryImage());
    } else {
      view.showDefaultBackground();
    }
  }

  public void onCardInfoClicked(CardInfo item) {
    view.cancelPendingBackgroundUpdates();
    navigator.openDetailView(item.getId());
  }

  public void onImageInfoSelected(ImageInfo imageInfo) {
    if (imageInfo != null) {
      view.updateBackground(imageInfo.getImageUrl());
    }
  }

  public void onImageInfoClicked(ImageInfo item) {
    navigator.openImageView(item.getImageUrl());
  }

  public void onPreferencesSelected() {
    view.showDefaultBackground();
  }

  public void onSearchIconClicked() {
    navigator.openSearchView();
  }

  public void logout() {
    accounts.logout();
    navigator.openLoginView();
    view.closeView();
  }

  private List<CardInfo> getFavoriteContacts() {
    List<Contact> favorites = agenda.getFavorites();
    return new LinkedList<CardInfo>(favorites);
  }

  private List<CardInfo> getConversations() {
    List<ConversationSummary> conversations = chat.getRecentConversations();
    return new ArrayList<CardInfo>(conversations);
  }

  private List<CardInfo> getAllContacts() {
    List<Contact> contacts = agenda.getContacts();
    return new ArrayList<CardInfo>(contacts);
  }

  private List<ImageInfo> getAllMediaElements() {
    List<MediaElement> lastMediaElements = mediaGallery.getLatestMediaElements();
    return new ArrayList<ImageInfo>(lastMediaElements);
  }

  private List<IconInfo> getPreferences() {
    List<IconInfo> preferences = new LinkedList<IconInfo>();
    preferences.add(new IconInfo(R.string.change_pattern, R.drawable.icn_settings_change_pattern));
    preferences.add(new IconInfo(R.string.account, R.drawable.icn_settings_account));
    preferences.add(new IconInfo(R.string.settings, R.drawable.icn_settings));
    preferences.add(new IconInfo(R.string.close_session, R.drawable.icn_settings_log_out));
    return preferences;
  }

  public interface View {

    void updateBackground(String imageUrl);

    void showMainInformation(List<CardInfo> favorites, List<CardInfo> conversations,
        List<CardInfo> contacts, List<ImageInfo> mediaElements, List<IconInfo> preferences);

    void showDefaultBackground();

    void closeView();

    void cancelPendingBackgroundUpdates();
  }
}
