/**
   * Metoda puni Spinner koji se odnosi na odabir kategorije sa svim kategorijama koje se nalaze u
   * aplikacijskoj bazi.
   */
  private void fillCategorySpinner() {
    categoryList = dbc.getCategories();
    ArrayList<String> listaNazivaKategorija = new ArrayList<>();
    for (int i = 0; i < categoryList.size(); i++) {
      listaNazivaKategorija.add(categoryList.get(i).getName());
    }
    ArrayAdapter<String> adapterKategorija =
        new ArrayAdapter<String>(ctx, android.R.layout.simple_spinner_item, listaNazivaKategorija);

    spnCategory.setAdapter(adapterKategorija);
  }
  /**
   * Azurira atribut koji se odnosi na kategoriju na svim ciljevima u bazi koji predstavljaju
   * (posredne i neposredne) podciljeve onog cilja koji se azurira. Katgoriju im postavlja na
   * vrijednost koja je novo - postavljena ažuriranom cilju.
   *
   * @param updatedGoal - Goal koji se ažurira
   * @param newCategory - Novo - postavljena kategorija ažuriranog cilja
   */
  private void updateSubgoalsCategories(Goal updatedGoal, Category newCategory) {
    ArrayList<Goal> subGoals = SubGoalGenerator.getSubGoals(updatedGoal);

    for (int i = 0; i < subGoals.size(); i++) {
      subGoals.get(i).setCategory(newCategory);
      dbc.updateGoal(
          subGoals.get(i).getId(),
          subGoals.get(i).getName(),
          subGoals.get(i).getDeadline(),
          subGoals.get(i).getPriority(),
          subGoals.get(i).getCategory(),
          subGoals.get(i).isAchieved(),
          subGoals.get(i).getHigherGoal(),
          subGoals.get(i).getComment());

      updateSubgoalsCategories(subGoals.get(i), newCategory);
    }
  }
 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(com.foi.air.goalsettingassistant.app.R.layout.activity_input_goal);
   setToolbar();
   ctx = this;
   name = "";
   deadline = null;
   priority = 0;
   category = null;
   higherGoal = null;
   comment = "";
   dbc = DBConnector.getInstance();
   txtName = (EditText) findViewById(com.foi.air.goalsettingassistant.app.R.id.txtName);
   setBtnChooseDate();
   setTxtComment();
   setBtnConfirm();
   setRbPriority();
   setSpnHigherGoal();
   setSpnCategory();
   setBtnModifySetOfCategories();
   if (isUpdate()) initUpdateForm();
 }
  /**
   * Metoda daje podatke i funkcionalnosti Spinner - u koji se odnosi na postavljanje nadcilja.
   * Podaci se odnose na skup svih ciljeva u aplikacijskoj bazi, a funkcionalnost na dodjelu
   * vrijednosti prilikom nekog odabira.
   */
  private void setSpnHigherGoal() {
    spnHigherGoal = (Spinner) findViewById(com.foi.air.goalsettingassistant.app.R.id.spnHighergoal);
    goalList = dbc.getGoals();
    ArrayList<String> listaNazivaCiljeva = new ArrayList<>();
    listaNazivaCiljeva.add(getString(R.string.noHigherGoal));

    for (int i = 0; i < goalList.size(); i++) {
      listaNazivaCiljeva.add(
          goalList.get(i).getName()
              + getString(R.string.categoryBracket)
              + goalList.get(i).getCategory().getName()
              + ")");
    }

    ArrayAdapter<String> adapterCiljeva =
        new ArrayAdapter<String>(ctx, android.R.layout.simple_spinner_item, listaNazivaCiljeva);

    spnHigherGoal.setAdapter(adapterCiljeva);
    spnHigherGoal.setOnItemSelectedListener(
        new AdapterView.OnItemSelectedListener() {
          @Override
          public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            if (pos == 0) {
              higherGoal = null;
              return;
            }
            pos = pos - 1;
            higherGoal = goalList.get(pos);
          }

          @Override
          public void onNothingSelected(AdapterView<?> parent) {
            higherGoal = null;
          }
        });
  }
  /**
   * Metoda, u osnovi, inicira GUI u modu za azuriranje postojećeg cilja. To se koknretnije odnosi
   * na popunjavanje odgovarajucih polja za input sa trenutnim atributima cilja koji se azurira.
   * Takodjer se postavljaju vrijednosti teksta podnaslova Activity - a i Button - a za potvru, na
   * odgovarajucu vrijednost.
   */
  private void initUpdateForm() {
    toolbar.setSubtitle(getString(R.string.updateExistingGoal));
    Intent intent = getIntent();
    int goalId = intent.getIntExtra(getResources().getString(R.string.extraGoalIdTag), -1);

    if (goalId == -1) {
      Toast.makeText(ctx, getResources().getString(R.string.errorMessage), Toast.LENGTH_SHORT)
          .show();
      onBackPressed();
      return;
    }
    ArrayList<Goal> goals = dbc.getGoals();
    updatingGoal = new Goal();
    int i = 0;
    for (; i < goals.size(); i++) {
      if (goals.get(i).getId() == goalId) {
        updatingGoal = goals.get(i);
        break;
      }
    }
    txtName.setText(updatingGoal.getName());
    txtComment.setText(updatingGoal.getComment());

    int temp = -1;
    if (updatingGoal.getHigherGoal() == null) temp = -1;
    else {
      Goal higherGoal = HigherGoalGenerator.getHigherGoal(updatingGoal);

      for (int j = 0; j < goals.size(); j++) {
        try {
          if (goals.get(j).getId() == higherGoal.getId()) {
            temp = j;
            break;
          }
        } catch (Exception e) {

        }
      }
    }
    final int higherGoalIndex = temp + 1;
    spnHigherGoal.post(
        new Runnable() {
          @Override
          public void run() {
            spnHigherGoal.setSelection(higherGoalIndex);
          }
        });

    btnChooseDate.setText(DataParser.dateToString(updatingGoal.getDeadline()));
    rbPriority.setRating(updatingGoal.getPriority());

    ArrayList<Category> categories = dbc.getCategories();
    i = 0;
    for (; i < categories.size(); i++) {
      if (categories.get(i).getId() == updatingGoal.getCategory().getId()) {
        final int categoryIndex = i;

        spnCategory.post(
            new Runnable() {
              @Override
              public void run() {
                spnCategory.setSelection(categoryIndex);
              }
            });
        break;
      }
    }
  }