package com.yassirh.digitalocean.ui;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.ActionBar.LayoutParams;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Spinner;
import com.yassirh.digitalocean.R;
import com.yassirh.digitalocean.model.Domain;
import com.yassirh.digitalocean.model.Droplet;
import com.yassirh.digitalocean.model.Network;
import com.yassirh.digitalocean.model.Record;
import com.yassirh.digitalocean.service.DomainService;
import com.yassirh.digitalocean.service.DropletService;
import com.yassirh.digitalocean.service.RecordService;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
public class RecordCreateDialogFragment extends DialogFragment {
private long recordId = 0L;
private String domainName = "";
private RecordService recordService;
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Bundle args = getArguments();
if(args != null){
recordId = args.getLong("id",0);
domainName = args.getString("domain_name");
}
recordService = new RecordService(getActivity());
DomainService domainService = new DomainService(getActivity());
List<Domain> domains = domainService.getAllDomains();
LayoutInflater inflater;
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
inflater = getActivity().getLayoutInflater();
final View view = inflater.inflate(R.layout.dialog_record_create, null);
final Spinner domainSpinner = (Spinner) view.findViewById(R.id.domainSpinner);
domainSpinner.setAdapter(new DomainAdapter(getActivity(), domains));
final Record record = recordService.findById(recordId);
final Domain domain = domainService.findByDomainName(domainName);
final Spinner recordTypeSpinner = (Spinner) view.findViewById(R.id.recordTypeSpinner);
final Spinner dropletSpinner = (Spinner) view.findViewById(R.id.aIpAddressSpinner);
final DropletService dropletService = new DropletService(getActivity());
final DropletAdapter dropletAdapter = new DropletAdapter(getActivity(), dropletService.getAllDroplets());
dropletSpinner.setAdapter(dropletAdapter);
final RecordTypeAdapter recordTypeAdapter = new RecordTypeAdapter(getActivity());
recordTypeSpinner.setAdapter(recordTypeAdapter);
recordTypeSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
LinearLayout aLinearLayout = (LinearLayout) view.findViewById(R.id.aLinearLayout);
LinearLayout aaaaLinearLayout = (LinearLayout) view.findViewById(R.id.aaaaLinearLayout);
LinearLayout cnameLinearLayout = (LinearLayout) view.findViewById(R.id.cnameLinearLayout);
LinearLayout mxLinearLayout = (LinearLayout) view.findViewById(R.id.mxLinearLayout);
LinearLayout nsLinearLayout = (LinearLayout) view.findViewById(R.id.nsLinearLayout);
LinearLayout txtLinearLayout = (LinearLayout) view.findViewById(R.id.txtLinearLayout);
LinearLayout srvLinearLayout = (LinearLayout) view.findViewById(R.id.srvLinearLayout);
aLinearLayout.setVisibility(View.GONE);
aaaaLinearLayout.setVisibility(View.GONE);
cnameLinearLayout.setVisibility(View.GONE);
mxLinearLayout.setVisibility(View.GONE);
nsLinearLayout.setVisibility(View.GONE);
txtLinearLayout.setVisibility(View.GONE);
srvLinearLayout.setVisibility(View.GONE);
switch ((Integer)recordTypeAdapter.getItem(position)) {
case R.drawable.a:
aLinearLayout.setVisibility(View.VISIBLE);
break;
case R.drawable.aaaa:
aaaaLinearLayout.setVisibility(View.VISIBLE);
break;
case R.drawable.cname:
cnameLinearLayout.setVisibility(View.VISIBLE);
break;
case R.drawable.mx:
mxLinearLayout.setVisibility(View.VISIBLE);
break;
case R.drawable.txt:
txtLinearLayout.setVisibility(View.VISIBLE);
break;
case R.drawable.srv:
srvLinearLayout.setVisibility(View.VISIBLE);
break;
case R.drawable.ns:
nsLinearLayout.setVisibility(View.VISIBLE);
break;
default:
break;
}
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
}
});
if(record != null){
domainSpinner.setSelection(domains.indexOf(record.getDomain()));
builder.setTitle(getString(R.string.edit_record));
}
else if(domain != null){
domainSpinner.setSelection(domains.indexOf(domain));
builder.setTitle(getString(R.string.add_record));
}
final EditText aHostnameEditText = (EditText) view.findViewById(R.id.aHostnameEditText);
final EditText aIpAddressEditText = (EditText) view.findViewById(R.id.aIpAddressEditText);
final EditText aaaaHostnameEditText = (EditText) view.findViewById(R.id.aaaaHostnameEditText);
final EditText aaaaIpAddressEditText = (EditText) view.findViewById(R.id.aaaaIpAddressEditText);
final EditText cnameHostnameEditText = (EditText) view.findViewById(R.id.cnameHostnameEditText);
final EditText cnameNameEditText = (EditText) view.findViewById(R.id.cnameNameEditText);
final EditText mxHostnameEditText = (EditText) view.findViewById(R.id.mxHostnameEditText);
final EditText mxPriorityEditText = (EditText) view.findViewById(R.id.mxPriorityEditText);
final EditText txtNameEditText = (EditText) view.findViewById(R.id.txtNameEditText);
final EditText txtTextEditText = (EditText) view.findViewById(R.id.txtTextEditText);
final EditText srvNameEditText = (EditText) view.findViewById(R.id.srvNameEditText);
final EditText srvHostnameEditText = (EditText) view.findViewById(R.id.srvHostnameEditText);
final EditText srvPriorityEditText = (EditText) view.findViewById(R.id.srvPriorityEditText);
final EditText srvPortEditText = (EditText) view.findViewById(R.id.srvPortEditText);
final EditText srvWeightEditText = (EditText) view.findViewById(R.id.srvWeightEditText);
final EditText nsHostnameEditText = (EditText) view.findViewById(R.id.nsHostnameEditText);
dropletSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
Droplet droplet = (Droplet)dropletAdapter.getItem(position);
for(Network network : droplet.getNetworks()) {
if(network.getType().equals("public")) {
aIpAddressEditText.setText(network.getIpAddress());
break;
}
}
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
}
});
if(record != null){
switch (record.getRecordType()) {
case "SRV":
recordTypeSpinner.setSelection(1);
srvNameEditText.setText(record.getName());
srvHostnameEditText.setText(record.getData());
srvPriorityEditText.setText(String.format(Locale.US, "%d", record.getPriority()));
srvPortEditText.setText(record.getPort());
srvWeightEditText.setText(String.format(Locale.US, "%d", record.getWeight()));
break;
case "MX":
recordTypeSpinner.setSelection(3);
mxHostnameEditText.setText(record.getData());
mxPriorityEditText.setText(String.format(Locale.US, "%d", record.getPriority()));
break;
case "NS":
recordTypeSpinner.setSelection(0);
nsHostnameEditText.setText(record.getData());
break;
case "CNAME":
recordTypeSpinner.setSelection(4);
cnameNameEditText.setText(record.getName());
cnameHostnameEditText.setText(record.getData());
break;
case "TXT":
recordTypeSpinner.setSelection(2);
txtNameEditText.setText(record.getName());
txtTextEditText.setText(record.getData());
break;
case "A":
recordTypeSpinner.setSelection(5);
aHostnameEditText.setText(record.getName());
aIpAddressEditText.setText(record.getData());
break;
case "AAAA":
recordTypeSpinner.setSelection(6);
aaaaHostnameEditText.setText(record.getName());
aaaaIpAddressEditText.setText(record.getData());
break;
}
}
builder.setView(view);
int positiveString = R.string.edit_record;
if(record == null)
positiveString = R.string.add_record;
builder.setPositiveButton(positiveString, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
HashMap<String, String> params = new HashMap<>();
/*if(record != null)
params.put("id", record.getId() + "");*/
switch ((Integer) recordTypeAdapter.getItem(recordTypeSpinner.getSelectedItemPosition())) {
case R.drawable.a:
params.put("type", "A");
params.put("name", aHostnameEditText.getText().toString());
params.put("data", aIpAddressEditText.getText().toString());
break;
case R.drawable.aaaa:
params.put("type", "AAAA");
params.put("name", aaaaHostnameEditText.getText().toString());
params.put("data", aaaaIpAddressEditText.getText().toString());
break;
case R.drawable.cname:
params.put("type", "CNAME");
params.put("name", cnameNameEditText.getText().toString());
params.put("data", cnameHostnameEditText.getText().toString());
break;
case R.drawable.mx:
params.put("type", "MX");
params.put("data", mxHostnameEditText.getText().toString());
params.put("priority", mxPriorityEditText.getText().toString());
break;
case R.drawable.txt:
params.put("type", "TXT");
params.put("name", txtNameEditText.getText().toString());
params.put("data", txtTextEditText.getText().toString());
break;
case R.drawable.srv:
params.put("type", "SRV");
params.put("name", srvNameEditText.getText().toString());
params.put("data", srvHostnameEditText.getText().toString());
params.put("priority", srvPriorityEditText.getText().toString());
params.put("port", srvPortEditText.getText().toString());
params.put("weight", srvWeightEditText.getText().toString());
break;
case R.drawable.ns:
params.put("record_type", "NS");
params.put("data", nsHostnameEditText.getText().toString());
break;
default:
break;
}
long recordId;
if (record != null) {
recordId = record.getId();
recordService.updateRecord(((Domain) domainSpinner.getSelectedItem()).getName(), params, recordId, true);
} else {
recordService.createRecord(((Domain) domainSpinner.getSelectedItem()).getName(), params, true);
}
}
});
builder.setNegativeButton(R.string.cancel, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
return builder.create();
}
@Override
public void onStart() {
super.onStart();
getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
}
}