/*
 * 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.
 */

productStoreId = parameters.productStoreId;
storeThemeId = null;
if (parameters.ebayStore) {
    ebayStore = parameters.get("ebayStore");
    storeThemeId = ebayStore.get("storeThemeId");
}
if (productStoreId != null) {
    flag = null;
    storeBasicThemes = null;
    resultsBasicThemes = dispatcher.runSync("retrieveBasicThemeArray",["productStoreId":productStoreId, "userLogin": userLogin]);
    if(resultsBasicThemes){
        storeBasicThemes = resultsBasicThemes.get("storeThemeList");
        //check what kind of theme?
        context.put("storeThemeOptList",storeBasicThemes);
        if (storeThemeId != null && storeBasicThemes != null) {
            storeBasicThemes.each { storeTheme ->
                if (storeThemeId == storeTheme.storeThemeId) {
                    flag = "Basic";
                }
            }
        }
    }
    storeAdvanceThemes = null;
    storeAdvancedThemeColorOptList = null;
    resultsAdvanceThemes = dispatcher.runSync("retrieveAdvancedThemeArray",["productStoreId":productStoreId, "userLogin": userLogin]);
    if (resultsAdvanceThemes) {
        storeAdvanceThemes = resultsAdvanceThemes.get("storeThemeList");
        storeAdvancedThemeColorOptList = resultsAdvanceThemes.get("storeAdvancedThemeColorOptList");
        context.put("storeAdvanceThemeOptList",storeAdvanceThemes);
        context.put("storeAdvancedThemeColorOptList",storeAdvancedThemeColorOptList);

        if (storeThemeId != null && storeAdvanceThemes != null) {
            storeAdvanceThemes.each { storeAdvanceTheme ->
                if(storeThemeId == storeAdvanceTheme.storeThemeId){
                    flag = "Advanced";
                }
            }
        }
    }
    resultsFontTheme = dispatcher.runSync("retrieveStoreFontTheme",["productStoreId":productStoreId, "userLogin": userLogin]);
    if (resultsFontTheme) {
        storeFontTheme = resultsFontTheme.get("advanceFontTheme");
        context.put("storeFontTheme",storeFontTheme);
    }
    context.put("themeType",flag);
}
