// Copyright (C) 2016 The Android Open Source Project
//
// 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.google.reviewit.app;

import android.app.Activity;
import android.app.Application;
import android.app.FragmentManager;
import android.os.Bundle;
import android.util.Log;

import com.google.gerrit.extensions.api.GerritApi;
import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.reviewit.ErrorFragment;
import com.google.reviewit.R;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ReviewItApp extends Application {
  private static final String TAG = ReviewItApp.class.getName();

  private QueryHandler queryHandler;
  private SortActionHandler sortActionHandler;
  private AvatarCache avatarCache;
  private ConfigManager cfgManager;
  private ExecutorService executor;
  private Gerrit gerrit;
  private PreferenceManager prefManager;
  private AccountInfo self;
  private Activity currentActivity;

  @Override
  public void onCreate() {
    registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
      @Override
      public void onActivityCreated(
          Activity activity, Bundle savedInstanceState) {
        currentActivity = activity;
      }

      @Override
      public void onActivityStarted(Activity activity) {
      }

      @Override
      public void onActivityResumed(Activity activity) {
      }

      @Override
      public void onActivityPaused(Activity activity) {
      }

      @Override
      public void onActivityStopped(Activity activity) {
      }

      @Override
      public void onActivitySaveInstanceState(
          Activity activity, Bundle outState) {
      }

      @Override
      public void onActivityDestroyed(Activity activity) {
        currentActivity = null;
      }
    });

    Thread.setDefaultUncaughtExceptionHandler(
        new Thread.UncaughtExceptionHandler() {
      @Override
      public void uncaughtException(Thread thread, Throwable t) {
        Log.e(TAG, "Application failure", t);
        if (currentActivity != null) {
          FragmentManager fragmentManager =
              currentActivity.getFragmentManager();
          fragmentManager.beginTransaction()
              .replace(R.id.mainFrame, ErrorFragment.create(t))
              .commit();
        }
      }
    });
    super.onCreate();
  }

  public QueryHandler getQueryHandler() {
    if (queryHandler == null) {
      queryHandler = new QueryHandler(getConfigManager(), getGerrit());
    }
    return queryHandler;
  }

  public SortActionHandler getSortActionHandler() {
    if (sortActionHandler == null) {
      sortActionHandler = new SortActionHandler(getConfigManager(), getGerrit());
    }
    return sortActionHandler;
  }

  public AvatarCache getAvatarCache() {
    if (avatarCache == null) {
      avatarCache = new AvatarCache(this);
    }
    return avatarCache;
  }

  public ConfigManager getConfigManager() {
    if (cfgManager == null) {
      cfgManager = new ConfigManager(this);
    }
    return cfgManager;
  }

  public GerritApi getApi() {
    return getGerrit().api();
  }

  private Gerrit getGerrit() {
    if (gerrit == null) {
      gerrit = new Gerrit(getConfigManager());
    }
    return gerrit;
  }

  public ExecutorService getExecutor() {
    if (executor == null) {
      executor = Executors.newFixedThreadPool(10);
    }
    return executor;
  }

  public Preferences getPrefs() {
    return getPrefManager().getPreferences();
  }

  public PreferenceManager getPrefManager() {
    if (prefManager == null) {
      prefManager = new PreferenceManager(this);
    }
    return prefManager;
  }

  public AccountInfo getSelf() {
    if (self == null) {
      try {
        self = getApi().accounts().self().get();
      } catch (RestApiException e) {
        Log.e(TAG, "Failed to get self", e);
      }
    }
    return self;
  }
}
