/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import org.ofbiz.entity.*;
import org.ofbiz.entity.util.*;
import org.ofbiz.base.util.*;
import java.sql.Timestamp;
import org.ofbiz.base.util.ObjectType

contentId = parameters.contentId;
if (!contentId) {
    contentId = null;
}

productContentTypeId = parameters.productContentTypeId;

fromDate = parameters.fromDate;
if (!fromDate) {
    fromDate = null;
} else {
    fromDate = ObjectType.simpleTypeConvert(fromDate, "Timestamp", null, null, false)
}


description = parameters.description;
if (!description) {
    description = null;
}

productContent = delegator.findOne("ProductContent", [contentId : contentId, productId : productId, productContentTypeId : productContentTypeId, fromDate : fromDate], false);
if (!productContent) {
    productContent = [:];
    productContent.productId = productId;
    productContent.contentId = contentId;
    productContent.productContentTypeId = productContentTypeId;
    productContent.fromDate = fromDate;
    productContent.thruDate = parameters.thruDate;
    productContent.purchaseFromDate = parameters.purchaseFromDate;
    productContent.purchaseThruDate = parameters.purchaseThruDate;
    productContent.useCountLimit = parameters.useCountLimit;
    productContent.useTime = parameters.useTime;
    productContent.useTimeUomId = parameters.useTimeUomId;
    productContent.useRoleTypeId = parameters.useRoleTypeId;
}
context.productContent = productContent;

productContentData = [:];
productContentData.putAll(productContent);

content = [:];
context.contentId = contentId;
if (contentId) {
    content = delegator.findOne("Content", [contentId : contentId], false);
    context.content = content;
} else {
    if (description) {
        content.description = description;
    }
}

//Email
if ("FULFILLMENT_EMAIL".equals(productContentTypeId)) {
    emailData = [:];
    if (contentId && content) {
        subjectDr = content.getRelatedOne("DataResource");
        if (subjectDr) {
            subject = subjectDr.getRelatedOne("ElectronicText");
            emailData.subject = subject.textData;
            emailData.subjectDataResourceId = subject.dataResourceId;
        }
        serviceCtx = [userLogin : userLogin, contentId : contentId, mapKeys : ['plainBody', 'htmlBody']];
        result = dispatcher.runSync("findAssocContent", serviceCtx);
        contentAssocs = result.get("contentAssocs");
        if (contentAssocs) {
            contentAssocs.each { contentAssoc ->
                bodyContent = contentAssoc.getRelatedOne("ToContent");
                bodyDr = bodyContent.getRelatedOne("DataResource");
                body = bodyDr.getRelatedOne("ElectronicText");
                emailData.put(contentAssoc.mapKey, body.textData);
                emailData.put(contentAssoc.get("mapKey")+"DataResourceId", body.dataResourceId);
            }
        }
    }

    context.contentFormName = "EditProductContentEmail";
    context.emailData = emailData;
} else if ("DIGITAL_DOWNLOAD".equals(productContentTypeId)) {
    downloadData = [:];
    if (contentId && content) {
        downloadDr = content.getRelatedOne("DataResource");
        if (downloadDr) {
            download = downloadDr.getRelatedOne("OtherDataResource");
            if (download) {
                downloadData.file = download.dataResourceContent;
                downloadData.fileDataResourceId = download.dataResourceId;
            }
        }
    }
    context.contentFormName = "EditProductContentDownload";
    context.downloadData = downloadData;
} else if ("FULFILLMENT_EXTERNAL".equals(productContentTypeId)) {
    context.contentFormName = "EditProductContentExternal";
} else if (productContentTypeId && productContentTypeId.indexOf("_IMAGE") > -1) {
    context.contentFormName = "EditProductContentImage";
} else {
    //Assume it is a generic simple text content
    textData = [:];
    if (contentId && content) {
        textDr = content.getRelatedOne("DataResource");
        if (textDr) {
            text = textDr.getRelatedOne("ElectronicText");
            if (text) {
                textData.text = text.textData;
                textData.textDataResourceId = text.dataResourceId;
            }
        }
    }
    context.contentFormName = "EditProductContentSimpleText";
    context.textData = textData;
}
if (productContentTypeId) {
    productContentType = delegator.findOne("ProductContentType", [productContentTypeId : productContentTypeId], false);
    if (productContentType && "DIGITAL_DOWNLOAD".equals(productContentType.parentTypeId)) {
        context.contentFormName = "EditProductContentDownload";
    }
}
if (("PAGE_TITLE".equals(productContentTypeId))||("META_KEYWORD".equals(productContentTypeId))||("META_DESCRIPTION".equals(productContentTypeId))) {
    context.contentFormName = "EditProductContentSEO";
}

context.productContentData = productContentData;
context.content = content;
context.contentId = contentId;
