/*
 * 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 = from("ProductContent").where("contentId", contentId, "productId", productId, "productContentTypeId", productContentTypeId, "fromDate", fromDate).queryOne();
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 = from("Content").where("contentId", contentId).queryOne();
    context.content = content;
} else {
    if (description) {
        content.description = description;
    }
}

//Email
if ("FULFILLMENT_EMAIL".equals(productContentTypeId)) {
    emailData = [:];
    if (contentId && content) {
        subjectDr = content.getRelatedOne("DataResource", false);
        if (subjectDr) {
            subject = subjectDr.getRelatedOne("ElectronicText", false);
            emailData.subject = subject.textData;
            emailData.subjectDataResourceId = subject.dataResourceId;
        }
        result = runService('findAssocContent', [userLogin : userLogin, contentId : contentId, mapKeys : ['plainBody', 'htmlBody']]);
        contentAssocs = result.get("contentAssocs");
        if (contentAssocs) {
            contentAssocs.each { contentAssoc ->
                bodyContent = contentAssoc.getRelatedOne("ToContent", false);
                bodyDr = bodyContent.getRelatedOne("DataResource", false);
                body = bodyDr.getRelatedOne("ElectronicText", false);
                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", false);
        if (downloadDr) {
            download = downloadDr.getRelatedOne("OtherDataResource", false);
            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", false);
        if (textDr) {
            text = textDr.getRelatedOne("ElectronicText", false);
            if (text) {
                textData.text = text.textData;
                textData.textDataResourceId = text.dataResourceId;
            }
        }
    }
    context.contentFormName = "EditProductContentSimpleText";
    context.textData = textData;
}
if (productContentTypeId) {
    productContentType = from("ProductContentType").where("productContentTypeId", productContentTypeId).queryOne();
    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;
