package com.door43.translationstudio.tasks;
import com.door43.translationstudio.core.Chapter;
import com.door43.translationstudio.core.ChapterTranslation;
import com.door43.translationstudio.core.Frame;
import com.door43.translationstudio.core.FrameTranslation;
import com.door43.translationstudio.core.Library;
import com.door43.translationstudio.core.ProjectTranslation;
import com.door43.translationstudio.core.SourceLanguage;
import com.door43.translationstudio.core.SourceTranslation;
import com.door43.translationstudio.core.TargetLanguage;
import com.door43.translationstudio.core.TargetTranslation;
import com.door43.translationstudio.core.TranslationFormat;
import com.door43.translationstudio.core.Translator;
import com.door43.translationstudio.newui.publish.ValidationItem;
import com.door43.translationstudio.AppContext;
import com.door43.util.tasks.ManagedTask;
import java.util.ArrayList;
import java.util.List;
/**
* Performs the validation on a target translation.
* This process should occure before a target translation is published.
*/
public class ValidationTask extends ManagedTask {
public static final String TASK_ID = "validation_task";
private final String mTargetTranslationId;
private final String mSourceTranslationId;
private List<ValidationItem> mValidations = new ArrayList<>();
public ValidationTask(String targetTranslationId, String sourceTranslationId) {
mTargetTranslationId = targetTranslationId;
mSourceTranslationId = sourceTranslationId;
}
@Override
public void start() {
Library library = AppContext.getLibrary();
Translator translator = AppContext.getTranslator();
TargetTranslation targetTranslation = translator.getTargetTranslation(mTargetTranslationId);
TargetLanguage targetLanguage = library.getTargetLanguage(targetTranslation.getTargetLanguageId());
SourceTranslation sourceTranslation = library.getSourceTranslation(mSourceTranslationId);
SourceLanguage sourceLanguage = library.getSourceLanguage(sourceTranslation.projectSlug, sourceTranslation.sourceLanguageSlug);
Chapter[] chapters = library.getChapters(sourceTranslation);
// validate chapters
int lastValidChapterIndex = -1;
List<ValidationItem> chapterValidations = new ArrayList<>();
//check for project title
String projectTitle = sourceTranslation.getProjectTitle();
if(projectTitle != null) {
ProjectTranslation projectTranslation = targetTranslation.getProjectTranslation();
boolean isFinished = projectTranslation.isTitleFinished();
if(!isFinished) {
mValidations.add(ValidationItem.generateInvalidGroup(projectTitle, sourceLanguage));
mValidations.add(ValidationItem.generateInvalidFrame(projectTitle, sourceLanguage, projectTranslation.getTitle(), targetLanguage, TranslationFormat.DEFAULT, mTargetTranslationId, "0", "0"));
}
}
for(int i = 0; i < chapters.length; i ++) {
Chapter chapter = chapters[i];
Frame[] frames = library.getFrames(sourceTranslation, chapter.getId());
// validate frames
int lastValidFrameIndex = -1;
boolean chapterIsValid = true;
List<ValidationItem> frameValidations = new ArrayList<>();
ChapterTranslation chapterTranslation = targetTranslation.getChapterTranslation(chapter.getId());
if((chapter.title != null) && (!chapter.title.isEmpty()) && !chapterTranslation.isTitleFinished()) {
chapterIsValid = false;
frameValidations.add(ValidationItem.generateInvalidFrame(chapter.title, sourceLanguage, chapterTranslation.title, targetLanguage, TranslationFormat.DEFAULT, mTargetTranslationId, chapter.getId(), "00"));
}
if((chapter.reference != null) && (!chapter.reference.isEmpty()) && !chapterTranslation.isReferenceFinished()) {
chapterIsValid = false;
frameValidations.add(ValidationItem.generateInvalidFrame(chapter.reference, sourceLanguage, chapterTranslation.reference, targetLanguage, TranslationFormat.DEFAULT, mTargetTranslationId, chapter.getId(), "00"));
}
for(int j = 0; j < frames.length; j ++) {
Frame frame = frames[j];
FrameTranslation frameTranslation = targetTranslation.getFrameTranslation(frame);
// TODO: also validate the checking questions
if(lastValidFrameIndex == -1 && (frameTranslation.isFinished() || frame.body.isEmpty())) {
// start new valid range
lastValidFrameIndex = j;
} else if(!(frameTranslation.isFinished() || frame.body.isEmpty()) || (frameTranslation.isFinished() || frame.body.isEmpty()) && j == frames.length - 1){
// close valid range
if(lastValidFrameIndex > -1) {
int previousFrameIndex = j - 1;
if(frameTranslation.isFinished() || frame.body.isEmpty()) {
previousFrameIndex = j;
}
if(lastValidFrameIndex < previousFrameIndex) {
// range
Frame previousFrame = frames[previousFrameIndex];
Frame lastValidFrame = frames[lastValidFrameIndex];
String frameTitle = sourceTranslation.getProjectTitle() + " " + Integer.parseInt(chapter.getId());
frameTitle += ":" + lastValidFrame.getStartVerse() + "-" + previousFrame.getEndVerse();
frameValidations.add(ValidationItem.generateValidFrame(frameTitle, sourceLanguage, true));
} else {
Frame lastValidFrame = frames[lastValidFrameIndex];
String frameTitle = sourceTranslation.getProjectTitle() + " " + Integer.parseInt(chapter.getId());
frameTitle += ":" + lastValidFrame.getStartVerse();
if(!lastValidFrame.getStartVerse().equals(lastValidFrame.getEndVerse())) {
frameTitle += "-" + lastValidFrame.getEndVerse();
}
frameValidations.add(ValidationItem.generateValidFrame(frameTitle, sourceLanguage, false));
}
lastValidFrameIndex = -1;
}
// add invalid frame
if(!(frameTranslation.isFinished() || frame.body.isEmpty())) {
chapterIsValid = false;
String frameTitle = sourceTranslation.getProjectTitle() + " " + Integer.parseInt(chapter.getId());
frameTitle += ":" + frame.getStartVerse();
if (!frame.getStartVerse().equals(frame.getEndVerse())) {
frameTitle += "-" + frame.getEndVerse();
}
frameValidations.add(ValidationItem.generateInvalidFrame(frameTitle, sourceLanguage, frameTranslation.body, targetLanguage, frameTranslation.getFormat(), mTargetTranslationId, chapter.getId(), frame.getId()));
}
}
}
if(lastValidChapterIndex == -1 && chapterIsValid) {
// start new valid range
lastValidChapterIndex = i;
} else if(!chapterIsValid || chapterIsValid && i == chapters.length - 1) {
// close valid range
if(lastValidChapterIndex > -1) {
int previousChapterIndex = i - 1;
if(chapterIsValid) {
previousChapterIndex = i;
}
if(lastValidChapterIndex < previousChapterIndex) {
// range
Chapter previousChapter = chapters[previousChapterIndex];
Chapter lastValidChapter = chapters[lastValidChapterIndex];
String chapterTitle = sourceTranslation.getProjectTitle() + " " + Integer.parseInt(lastValidChapter.getId()) + "-" + Integer.parseInt(previousChapter.getId());
chapterValidations.add(ValidationItem.generateValidGroup(chapterTitle, sourceLanguage, true));
} else {
Chapter lastValidChapter = chapters[lastValidChapterIndex];
String chapterTitle = sourceTranslation.getProjectTitle() + " " + Integer.parseInt(lastValidChapter.getId());
chapterValidations.add(ValidationItem.generateValidGroup(chapterTitle, sourceLanguage, false));
}
lastValidChapterIndex = -1;
}
// add invalid chapter
if(!chapterIsValid) {
String chapterTitle = chapter.title;
if (chapterTitle.isEmpty()) {
chapterTitle = sourceTranslation.getProjectTitle() + " " + Integer.parseInt(chapter.getId());
}
chapterValidations.add(ValidationItem.generateInvalidGroup(chapterTitle, sourceLanguage));
// add frame validations
chapterValidations.addAll(frameValidations);
}
}
}
// close validations
if(chapterValidations.size() > 1) {
mValidations.addAll(chapterValidations);
} else {
mValidations.add(ValidationItem.generateValidGroup(sourceTranslation.getProjectTitle(), sourceLanguage, true));
}
}
/**
* Returns an array of validation items
*
* @return
*/
public ValidationItem[] getValidations() {
return mValidations.toArray(new ValidationItem[mValidations.size()]);
}
}