package com.lateensoft.pathfinder.toolkit.views.character;
import android.content.Intent;
import com.lateensoft.pathfinder.toolkit.R;
import com.lateensoft.pathfinder.toolkit.adapters.character.SkillListAdapter;
import com.lateensoft.pathfinder.toolkit.dao.DataAccessException;
import com.lateensoft.pathfinder.toolkit.db.dao.set.AbilitySetDAO;
import com.lateensoft.pathfinder.toolkit.db.dao.set.SkillSetDAO;
import com.lateensoft.pathfinder.toolkit.db.dao.table.ArmorDAO;
import com.lateensoft.pathfinder.toolkit.db.dao.table.SkillDAO;
import com.lateensoft.pathfinder.toolkit.model.character.stats.AbilitySet;
import com.lateensoft.pathfinder.toolkit.model.character.stats.Skill;
import com.lateensoft.pathfinder.toolkit.model.character.stats.SkillSet;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import com.lateensoft.pathfinder.toolkit.model.character.stats.SkillType;
import com.lateensoft.pathfinder.toolkit.views.ParcelableEditorActivity;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class CharacterSkillsFragment extends ParcelableListFragment<Skill, SkillDAO> {
private static final String TAG = CharacterSkillsFragment.class.getSimpleName();
private ListView skillsListView;
private CheckBox applyACPCheckBox;
private CheckBox trainedFilterCheckBox;
private Skill skillSelectedForEdit;
private SkillSetDAO skillSetDao;
private SkillSet skillSet;
private ArmorDAO armorDao;
private AbilitySetDAO abilitySetDao;
private AbilitySet abilitySet;
private int maxDex = Integer.MAX_VALUE;
private int armorCheckPenalty = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
skillSetDao = new SkillSetDAO(getContext());
armorDao = new ArmorDAO(getContext());
abilitySetDao = new AbilitySetDAO(getContext());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setRootView(inflater.inflate(
R.layout.character_skills_fragment, container, false));
applyACPCheckBox = (CheckBox) getRootView().findViewById(R.id.checkboxApplyACP);
applyACPCheckBox.setChecked(false);
applyACPCheckBox.setOnCheckedChangeListener(acpCheckboxListener);
trainedFilterCheckBox = (CheckBox) getRootView().findViewById(R.id.checkboxFilterTrained);
trainedFilterCheckBox.setChecked(true);
trainedFilterCheckBox.setOnCheckedChangeListener(trainedFilterCheckboxListener);
skillsListView = (ListView) getRootView()
.findViewById(R.id.listViewCharacterSkills);
skillsListView.setOnItemClickListener(listClickListener);
return getRootView();
}
private OnCheckedChangeListener acpCheckboxListener = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
((SkillListAdapter) skillsListView.getAdapter())
.setArmorCheckPenalty(isChecked ? armorCheckPenalty : 0);
}
};
private OnCheckedChangeListener trainedFilterCheckboxListener = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
updateFragmentUI();
}
};
private OnItemClickListener listClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (trainedFilterCheckBox.isChecked()) {
skillSelectedForEdit = skillSet.getTrainedSkill(position);
} else {
skillSelectedForEdit = skillSet.getSkillByIndex(position);
}
showEditorActivity(skillSelectedForEdit);
}
};
@Override
protected Class<? extends ParcelableEditorActivity> getParcelableEditorActivity() {
return SkillEditActivity.class;
}
@Override
protected void addCustomExtrasToEditorActivityIntent(Intent intent, Skill toEdit) {
intent.putExtra(SkillEditActivity.INTENT_EXTRAS_KEY_SKILL_DELETABLE_BOOLEAN,
(toEdit.canBeSubTyped() && skillSet.hasMultipleOfSkill(toEdit.getType())));
}
@Override
protected EditAction getActionForResult(@NotNull Skill result) {
return skillSelectedForEdit != null ? EditAction.UPDATE : EditAction.NONE;
}
@Override
protected SkillDAO getDAO() {
return skillSetDao.getComponentDAO();
}
@Override
protected void updateModel(EditAction action, Skill updatedParcelable) {
skillSelectedForEdit.setSubType(updatedParcelable.getSubType());
skillSelectedForEdit.setAbility(updatedParcelable.getAbility());
skillSelectedForEdit.setRank(updatedParcelable.getRank());
skillSelectedForEdit.setMiscMod(updatedParcelable.getMiscMod());
skillSelectedForEdit.setClassSkill(updatedParcelable.isClassSkill());
addNewSubSkills();
}
private void addNewSubSkills() {
Skill newSkill;
for (SkillType type : SkillType.values()) {
if (type.canBeSubTyped() && skillSet.allSubSkillsUsed(type)) {
try {
newSkill = skillSet.addNewSubSkill(type);
skillSetDao.getComponentDAO().add(getCurrentCharacterID(), newSkill);
} catch (DataAccessException e) {
Log.e(TAG, "Failed to add skill ", e);
}
}
}
}
@Override
protected Skill getObjectMarkedForDeletion() {
if (skillSelectedForEdit != null && skillSelectedForEdit.canBeSubTyped()
&& skillSet.hasMultipleOfSkill(skillSelectedForEdit.getType())) {
return skillSelectedForEdit;
} else {
return null;
}
}
@Override
protected void removeFromModel(Skill toRemove) {
skillSet.deleteSkill(toRemove);
addNewSubSkills();
}
@Override
public void updateFragmentUI() {
updateSkillsList();
}
private void updateSkillsList() {
if (skillSet == null || abilitySet == null) return;
List<Skill> skills = trainedFilterCheckBox.isChecked() ?
skillSet.getTrainedSkills() : skillSet.getSkills();
SkillListAdapter adapter = new SkillListAdapter(getContext(),
R.layout.character_skill_row, skills,
maxDex, abilitySet, getAppliedArmorCheckPenalty());
skillsListView.setAdapter(adapter);
}
private int getAppliedArmorCheckPenalty() {
return applyACPCheckBox.isChecked() ? armorCheckPenalty : 0;
}
@Override
public String getFragmentTitle() {
return getString(R.string.tab_character_skills);
}
@Override
public void loadFromDatabase() {
long characterId = getCurrentCharacterID();
skillSet = skillSetDao.findSet(characterId);
addNewSubSkills();
maxDex = armorDao.getMaxDexForCharacter(characterId);
armorCheckPenalty = armorDao.getArmorCheckPenaltyForCharacter(characterId);
abilitySet = abilitySetDao.findSet(characterId);
}
}