package mapper;
import api.v1.*;
import com.ibm.util.CoordinateConversion;
import exceptions.PoseidonException;
import models.PositionModel;
import models.PositionTagModel;
import play.mvc.Http;
import java.util.*;
public class PositionMapper {
public List<Position> mapToApi(List<PositionModel> mPositions) {
List<Position> PositionList = new ArrayList<>();
for (PositionModel mPosition : mPositions) {
Position Position = mapToApi(mPosition);
PositionList.add(Position);
}
return PositionList;
}
public Position mapToApi(PositionModel mPosition) {
Position position = null;
if ( mPosition != null ) {
position = new Position();
position.id = mPosition.id;
position.name = mPosition.name;
position.alias = mPosition.alias;
position.dec = new PositionDecimalDegrees();
position.dec.setLatitude(mPosition.latitude);
position.dec.setLongitude(mPosition.longitude);
position.isDeletable = mPosition.isDeletable;
CoordinateConversion coordinateConversion = new CoordinateConversion();
double[] dms = coordinateConversion.latLon2dms(mPosition.latitude, mPosition.longitude);
position.dms = new PositionDMS();
position.dms.latDirection = dms[0] >= 0.0 ? "N":"S";
position.dms.latDeg = (int) Math.abs(dms[0]);
position.dms.latMin = (int) dms[1];
position.dms.latSec = (int) dms[2];
position.utm = new PositionUTM();
position.dms.longDirection = dms[3] >= 0.0 ? "E":"W";
position.dms.longDeg = (int) Math.abs(dms[3]);
position.dms.longMin = (int) dms[4];
position.dms.longSec = (int) dms[5];
CoordinateConversion.UTM utm = coordinateConversion.latLon2UTM(mPosition.latitude, mPosition.longitude);
position.utm = convertUTM(utm);
if (mPosition.tags != null && mPosition.tags.size() > 0) {
position.tags = new PositionTag[mPosition.tags.size()];
} else {
position.tags = new PositionTag[0];
}
int i = 0;
for (Iterator<PositionTagModel> itr = mPosition.tags.iterator(); itr.hasNext(); i++) {
PositionTagModel tagModel = itr.next();
int numPositionsWithThisTag = tagModel.positionModels != null ? tagModel.positionModels.size():0;
position.tags[i] = new PositionTag(tagModel.id, tagModel.name, numPositionsWithThisTag);
}
}
return position;
}
private PositionUTM convertUTM(CoordinateConversion.UTM utm) {
PositionUTM result = new PositionUTM();
result.zone = utm.zone;
result.band = utm.band;
result.easting = utm.easting;
result.northing = utm.northing;
return result;
}
private CoordinateConversion.UTM convertUTM(PositionUTM utm) {
CoordinateConversion.UTM result = new CoordinateConversion.UTM();
result.zone = utm.zone;
result.band = utm.band;
result.northing= utm.northing;
result.easting= utm.easting;
return result;
}
private CoordinateConversion.DMS convertGMS(PositionDMS gms) {
CoordinateConversion.DMS result = new CoordinateConversion.DMS();
result.latD = gms.latDeg;
result.latM = gms.latMin;
result.latS = gms.latSec;
result.latDirection = gms.latDirection;
result.lngD = gms.longDeg;
result.lngM = gms.longMin;
result.lngS = gms.longSec;
result.longDirection = gms.longDirection;
return result;
}
public PositionModel mapToModel(Position aPosition) {
PositionModel model = new PositionModel();
if (aPosition == null) {
return null;
}
if (aPosition.id != null) {
model.id = aPosition.id;
}
model.name = aPosition.name;
model.alias= aPosition.alias;
model.isDeletable = aPosition.isDeletable;
mapCoordinate(aPosition, model);
if ( aPosition.tags != null ) {
model.tags = new ArrayList<>();
for(PositionTag tag : aPosition.tags){
PositionTagModel mTag = PositionTagModel.findByName(tag.name);
if ( mTag == null) {
mTag = new PositionTagModel();
mTag.name = tag.name;
}
model.tags.add(mTag);
}
}
return model;
}
public void mapCoordinate(Position aPosition, PositionModel model) {
CoordinateConversion coordinateConversion = new CoordinateConversion();
switch (aPosition.coordinateFormat){
case DEGREES_MINUTES_SECONDS:
if ( aPosition.dms == null)
throw new PoseidonException(Http.Status.BAD_REQUEST,"Ugyldig koordinat");
CoordinateConversion.DMS DMS = convertGMS(aPosition.dms);
double[] latlonDms = coordinateConversion.dms2LatLon(DMS);
model.latitude = latlonDms[0];
model.longitude = latlonDms[1];
break;
case UTM:
if ( aPosition.utm == null)
throw new PoseidonException(Http.Status.BAD_REQUEST,"Ugyldig koordinat");
CoordinateConversion.UTM utm = convertUTM(aPosition.utm);
double[] latlonUtm = coordinateConversion.utm2LatLon(utm);
model.latitude = latlonUtm[0];
model.longitude = latlonUtm[1];
break;
case DECIMAL_DEGREES:
default:
if ( aPosition.dec == null)
throw new PoseidonException(Http.Status.BAD_REQUEST,"Ugyldig koordinat");
model.latitude = aPosition.dec.getLatitude();
model.longitude = aPosition.dec.getLongitude();
}
}
}