package com.thinkbiganalytics.policy;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.thinkbiganalytics.policy.standardization.DateTimeStandardizer;
import com.thinkbiganalytics.policy.standardization.DefaultValueStandardizer;
import com.thinkbiganalytics.policy.validation.RangeValidator;
import com.thinkbiganalytics.policy.rest.model.FieldStandardizationRule;
import com.thinkbiganalytics.policy.rest.model.FieldValidationRule;
import com.thinkbiganalytics.standardization.transform.StandardizationAnnotationTransformer;
import com.thinkbiganalytics.validation.transform.ValidatorAnnotationTransformer;
import com.thinkbiganalytics.policy.rest.model.FieldPolicyBuilder;

import org.junit.Assert;
import org.junit.Test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Created by sr186054 on 4/22/16.
 */
public class TestJsonPolicies {


  @Test
  public void testJson() throws IOException {
    List<com.thinkbiganalytics.policy.rest.model.FieldPolicy> fieldPolicies = new ArrayList<>();
    List<FieldStandardizationRule> standardizationPolicyList = new ArrayList<>();
    List<FieldValidationRule> validationRules = new ArrayList<>();

    DefaultValueStandardizer defaultValueStandardizer = new DefaultValueStandardizer("My Default");
    standardizationPolicyList.add(StandardizationAnnotationTransformer.instance().toUIModel(defaultValueStandardizer));

    DateTimeStandardizer
        dateTimeStandardizer =
        new DateTimeStandardizer("MM/DD/YYYY", DateTimeStandardizer.OutputFormats.DATETIME_NOMILLIS);
    standardizationPolicyList.add(StandardizationAnnotationTransformer.instance().toUIModel(dateTimeStandardizer));

    RangeValidator validator = new RangeValidator(10, 20);
    validationRules.add(ValidatorAnnotationTransformer.instance().toUIModel(validator));

    fieldPolicies.add(new FieldPolicyBuilder("Field1").addStandardization(standardizationPolicyList).addValidations(
        validationRules).build());
    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(fieldPolicies);

    FieldPoliciesJsonTransformer fieldPolicyTransformer = new FieldPoliciesJsonTransformer(json);
    Map<String, com.thinkbiganalytics.policy.FieldPolicy> policyMap = fieldPolicyTransformer.buildPolicies();
    com.thinkbiganalytics.policy.FieldPolicy field1Policy = policyMap.get("Field1");
    Assert.assertEquals(2, field1Policy.getStandardizationPolicies().size());
    Assert.assertEquals(1, field1Policy.getValidators().size());

  }


  @Test
  public void test2() {
    String json = "[{\"partition\":false,\"profile\":true,\"index\":false,\"fieldName\":\"registration_dttm\",\"standardization\":[],\"validation\":[{\"name\":\"Timestamp\",\"displayName\":\"Timestamp\",\"description\":\"Validate ISO8601 format\",\"properties\":[],\"objectClassType\":\"com.thinkbiganalytics.policy.validation.TimestampValidator\",\"regex\":null,\"type\":null}]},{\"partition\":false,\"profile\":true,\"index\":false,\"fieldName\":\"id\",\"standardization\":null,\"validation\":null},{\"partition\":false,\"profile\":true,\"index\":true,\"fieldName\":\"first_name\",\"standardization\":[{\"name\":\"Uppercase\",\"displayName\":\"Uppercase\",\"description\":\"Convert string to uppercase\",\"properties\":[],\"objectClassType\":\"com.thinkbiganalytics.policy.standardization.UppercaseStandardizer\"}],\"validation\":null},{\"partition\":false,\"profile\":true,\"index\":true,\"fieldName\":\"last_name\",\"standardization\":null,\"validation\":null},{\"partition\":false,\"profile\":true,\"index\":false,\"fieldName\":\"email\",\"standardization\":null,\"validation\":[{\"name\":\"Email\",\"displayName\":\"Email\",\"description\":\"Valid email address\",\"properties\":[],\"objectClassType\":\"com.thinkbiganalytics.policy.validation.EmailValidator\",\"regex\":null,\"type\":null}]},{\"partition\":false,\"profile\":true,\"index\":false,\"fieldName\":\"gender\",\"standardization\":null,\"validation\":[{\"name\":\"Lookup\",\"displayName\":\"Lookup\",\"description\":\"Must be contained in the list\",\"properties\":[{\"name\":\"List\",\"displayName\":\"List\",\"value\":\"Male,Female\",\"placeholder\":\"\",\"type\":\"string\",\"hint\":\"Comma separated list of values\",\"objectProperty\":\"lookupList\",\"selectableValues\":[]}],\"objectClassType\":\"com.thinkbiganalytics.policy.validation.LookupValidator\",\"regex\":null,\"type\":null}]},{\"partition\":false,\"profile\":true,\"index\":false,\"fieldName\":\"ip_address\",\"standardization\":null,\"validation\":[{\"name\":\"IP Address\",\"displayName\":\"IP Address\",\"description\":\"Valid IP Address\",\"properties\":[],\"objectClassType\":\"com.thinkbiganalytics.policy.validation.IPAddressValidator\",\"regex\":null,\"type\":null}]},{\"partition\":false,\"profile\":true,\"index\":false,\"fieldName\":\"cc\",\"standardization\":[],\"validation\":[]},{\"partition\":false,\"profile\":true,\"index\":false,\"fieldName\":\"country\",\"standardization\":[],\"validation\":null},{\"partition\":false,\"profile\":true,\"index\":false,\"fieldName\":\"birthdate\",\"standardization\":[{\"name\":\"Date/Time\",\"displayName\":\"Date/Time\",\"description\":\"Converts any date to ISO8601\",\"properties\":[{\"name\":\"Date Format\",\"displayName\":\"Date Format\",\"value\":\"MM/dd/YYYY\",\"placeholder\":\"\",\"type\":\"string\",\"hint\":\"Format Example: MM/DD/YYYY\",\"objectProperty\":\"inputDateFormat\",\"selectableValues\":[]},{\"name\":\"Output Format\",\"displayName\":\"Output Format\",\"value\":\"DATE_ONLY\",\"placeholder\":\"\",\"type\":\"select\",\"hint\":\"Choose an output format\",\"objectProperty\":\"outputFormat\",\"selectableValues\":[{\"label\":\"DATE_ONLY\",\"value\":\"DATE_ONLY\"},{\"label\":\"DATETIME\",\"value\":\"DATETIME\"},{\"label\":\"DATETIME_NOMILLIS\",\"value\":\"DATETIME_NOMILLIS\"}]}],\"objectClassType\":\"com.thinkbiganalytics.policy.standardization.DateTimeStandardizer\"}],\"validation\":null},{\"partition\":false,\"profile\":true,\"index\":false,\"fieldName\":\"salary\",\"standardization\":[{\"name\":\"Strip Non Numeric\",\"displayName\":\"Strip Non Numeric\",\"description\":\"Remove any characters that are not numeric\",\"properties\":[],\"objectClassType\":\"com.thinkbiganalytics.policy.standardization.StripNonNumeric\"}],\"validation\":null},{\"partition\":false,\"profile\":true,\"index\":false,\"fieldName\":\"title\",\"standardization\":null,\"validation\":null},{\"partition\":false,\"profile\":true,\"index\":false,\"fieldName\":\"comments\",\"standardization\":[{\"name\":\"Uppercase\",\"displayName\":\"Uppercase\",\"description\":\"Convert string to uppercase\",\"properties\":[],\"objectClassType\":\"com.thinkbiganalytics.policy.standardization.UppercaseStandardizer\"}],\"validation\":null}]";
    FieldPoliciesJsonTransformer fieldPolicyTransformer = new FieldPoliciesJsonTransformer(json);
    Map<String, com.thinkbiganalytics.policy.FieldPolicy> policyMap = fieldPolicyTransformer.buildPolicies();
    int i = 0;

  }
}

@@ -1903,17 +1903,17 @@
 uilder(%22
-F
+f
 ield1%22).
@@ -2399,17 +2399,17 @@
 ap.get(%22
-F
+f
 ield1%22);

fix testcase for lowercase fields