/*
 * Copyright (c) 2010-2021 BSI Business Systems Integration AG.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     BSI Business Systems Integration AG - initial API and implementation
 */
package org.eclipse.scout.sdk.s2i.element

import org.eclipse.scout.sdk.core.model.api.IJavaEnvironment
import org.eclipse.scout.sdk.core.s.ISdkConstants
import org.eclipse.scout.sdk.core.s.apidef.IScoutApi
import org.eclipse.scout.sdk.core.s.codetype.CodeTypeNewOperation
import org.eclipse.scout.sdk.core.s.entity.EntityNewOperation
import org.eclipse.scout.sdk.core.s.form.FormNewOperation
import org.eclipse.scout.sdk.core.s.lookupcall.LookupCallNewOperation
import org.eclipse.scout.sdk.core.s.page.PageNewOperation
import org.eclipse.scout.sdk.core.s.util.ScoutTier
import org.eclipse.scout.sdk.core.util.JavaTypes
import org.eclipse.scout.sdk.s2i.util.SourceFolderHelper

class ElementCreationManagerImplementor : ElementCreationManager {
    override val operationMap = ElementCreationManager.OperationMap()

    init {
        initEntity()
        initForm()
        initPage()
        initLookupCall()
        initCodeType()
    }

    private fun initEntity() {
        operationMap.put(EntityNewOperation::class.java, object : ElementCreationManager.OperationStrategy<EntityNewOperation> {
            override var createOperationFunc: (IJavaEnvironment) -> EntityNewOperation = {
                EntityNewOperation()
            }
            override var prepareOperationFuncList: MutableList<(EntityNewOperation, String, String?, SourceFolderHelper) -> Unit> = mutableListOf({ op, elementName, pkg, sourceFolderHelper ->
                op.entityName = elementName
                op.clientPackage = sourceFolderHelper.tier()!!.convert(ScoutTier.Client, pkg)

                op.clientSourceFolder = sourceFolderHelper.clientSourceFolder()
                op.sharedSourceFolder = sourceFolderHelper.sharedSourceFolder()
                op.serverSourceFolder = sourceFolderHelper.serverSourceFolder()

                op.sharedGeneratedSourceFolder = sourceFolderHelper.sharedGeneratedSourceFolder()

                op.clientTestSourceFolder = sourceFolderHelper.clientTestSourceFolder()
                op.sharedTestSourceFolder = sourceFolderHelper.sharedTestSourceFolder()
                op.serverTestSourceFolder = sourceFolderHelper.serverTestSourceFolder()

                op.clientMainTestSourceFolder = sourceFolderHelper.clientMainTestSourceFolder()
                op.sharedMainTestSourceFolder = sourceFolderHelper.sharedMainTestSourceFolder()
                op.serverMainTestSourceFolder = sourceFolderHelper.serverMainTestSourceFolder()
            })
        })
    }

    private fun initForm() {
        operationMap.put(FormNewOperation::class.java, object : ElementCreationManager.OperationStrategy<FormNewOperation> {
            override var createOperationFunc: (IJavaEnvironment) -> FormNewOperation = {
                FormNewOperation()
            }
            override var prepareOperationFuncList: MutableList<(FormNewOperation, String, String?, SourceFolderHelper) -> Unit> = mutableListOf({ op, elementName, pkg, sourceFolderHelper ->
                op.formName = elementName.plus(ISdkConstants.SUFFIX_FORM)
                op.clientPackage = sourceFolderHelper.tier()!!.convert(ScoutTier.Client, pkg)

                op.clientSourceFolder = sourceFolderHelper.clientSourceFolder()
                op.sharedSourceFolder = sourceFolderHelper.sharedSourceFolder()
                op.serverSourceFolder = sourceFolderHelper.serverSourceFolder()
                op.formDataSourceFolder = sourceFolderHelper.sharedGeneratedSourceFolder() ?: sourceFolderHelper.sharedSourceFolder()

                op.clientTestSourceFolder = sourceFolderHelper.clientTestSourceFolder()
                op.serverTestSourceFolder = sourceFolderHelper.serverTestSourceFolder()

                sourceFolderHelper.clientSourceFolder()?.javaEnvironment()?.api(IScoutApi::class.java)?.ifPresent {
                    op.superType = it.AbstractForm().fqn()
                }
                sourceFolderHelper.serverSourceFolder()?.javaEnvironment()?.api(IScoutApi::class.java)?.ifPresent {
                    op.serverSession = it.IServerSession().fqn()
                }

                op.isCreateFormData = sourceFolderHelper.sharedSourceFolder() != null
                op.isCreatePermissions = sourceFolderHelper.sharedSourceFolder() != null
                op.isCreateOrAppendService = sourceFolderHelper.sharedSourceFolder() != null && sourceFolderHelper.serverSourceFolder() != null
            })
        })
    }

    private fun initPage() {
        operationMap.put(PageNewOperation::class.java, object : ElementCreationManager.OperationStrategy<PageNewOperation> {
            override var createOperationFunc: (IJavaEnvironment) -> PageNewOperation = {
                PageNewOperation()
            }
            override var prepareOperationFuncList: MutableList<(PageNewOperation, String, String?, SourceFolderHelper) -> Unit> = mutableListOf({ op, elementName, pkg, sourceFolderHelper ->
                op.pageName = elementName.plus(ISdkConstants.SUFFIX_PAGE_WITH_TABLE)
                op.`package` = sourceFolderHelper.tier()!!.convert(ScoutTier.Client, pkg)

                op.clientSourceFolder = sourceFolderHelper.clientSourceFolder()
                op.sharedSourceFolder = sourceFolderHelper.sharedSourceFolder()
                op.serverSourceFolder = sourceFolderHelper.serverSourceFolder()
                op.pageDataSourceFolder = sourceFolderHelper.sharedGeneratedSourceFolder() ?: sourceFolderHelper.sharedSourceFolder()

                op.testSourceFolder = sourceFolderHelper.serverTestSourceFolder()

                sourceFolderHelper.clientSourceFolder()?.javaEnvironment()?.api(IScoutApi::class.java)?.ifPresent {
                    op.superType = it.AbstractPageWithTable().fqn()
                }
                sourceFolderHelper.serverSourceFolder()?.javaEnvironment()?.api(IScoutApi::class.java)?.ifPresent {
                    op.serverSession = it.IServerSession().fqn()
                }

                op.isCreateAbstractPage = false
            })
        })
    }

    private fun initLookupCall() {
        operationMap.put(LookupCallNewOperation::class.java, object : ElementCreationManager.OperationStrategy<LookupCallNewOperation> {
            override var createOperationFunc: (IJavaEnvironment) -> LookupCallNewOperation = {
                LookupCallNewOperation()
            }
            override var prepareOperationFuncList: MutableList<(LookupCallNewOperation, String, String?, SourceFolderHelper) -> Unit> = mutableListOf({ op, elementName, pkg, sourceFolderHelper ->
                op.lookupCallName = elementName.plus(ISdkConstants.SUFFIX_LOOKUP_CALL)
                op.`package` = sourceFolderHelper.tier()!!.convert(ScoutTier.Shared, pkg)
                op.keyType = Long::class.javaObjectType.name

                op.sharedSourceFolder = sourceFolderHelper.sharedSourceFolder()
                op.serverSourceFolder = sourceFolderHelper.serverSourceFolder()

                op.testSourceFolder = sourceFolderHelper.clientTestSourceFolder()

                sourceFolderHelper.sharedSourceFolder()?.javaEnvironment()?.api(IScoutApi::class.java)?.ifPresent {
                    op.superType = it.LookupCall().fqn()
                    op.lookupServiceSuperType = it.AbstractLookupService().fqn()
                }
                sourceFolderHelper.serverSourceFolder()?.javaEnvironment()?.api(IScoutApi::class.java)?.ifPresent {
                    op.serverSession = it.IServerSession().fqn()
                }
            })
        })
    }

    private fun initCodeType() {
        operationMap.put(CodeTypeNewOperation::class.java, object : ElementCreationManager.OperationStrategy<CodeTypeNewOperation> {
            override var createOperationFunc: (IJavaEnvironment) -> CodeTypeNewOperation = {
                CodeTypeNewOperation()
            }
            override var prepareOperationFuncList: MutableList<(CodeTypeNewOperation, String, String?, SourceFolderHelper) -> Unit> = mutableListOf({ op, elementName, pkg, sourceFolderHelper ->
                val idDataType = JavaTypes.Long
                op.codeTypeName = elementName.plus(ISdkConstants.SUFFIX_CODE_TYPE)
                op.`package` = sourceFolderHelper.tier()!!.convert(ScoutTier.Shared, pkg)
                op.codeTypeIdDataType = idDataType

                op.sharedSourceFolder = sourceFolderHelper.sharedSourceFolder()

                sourceFolderHelper.sharedSourceFolder()?.javaEnvironment()?.api(IScoutApi::class.java)?.ifPresent {
                    op.superType = it.AbstractCodeType().fqn() + JavaTypes.C_GENERIC_START + idDataType + ", " + idDataType + JavaTypes.C_GENERIC_END
                }
            })
        })
    }
}