/**
 * This file is part of the Meeds project (https://meeds.io/).
 *
 * Copyright (C) 2020 - 2025 Meeds Association contact@meeds.io
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */
package org.exoplatform.webui.form.wysiwyg;

import java.io.Writer;

import jakarta.servlet.http.HttpServletRequest;

import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.form.UIFormInputBase;

/*
 * Created by The eXo Platform SAS
 */
public class UIFormWYSIWYGInput extends UIFormInputBase<String> {
    public static final String BASIC_TOOLBAR = "Basic".intern();

    public static final String DEFAULT_TOOLBAR = "Default".intern();

    private FCKEditorConfig fckConfig;

    @Deprecated
    private boolean useBasicToolbar = true;

    private boolean sourceModeOnStartup = false;

    private String toolBarName;

    private String width;

    private String height;

    /**
     * Instantiates a new uI form wysiwyg input.
     *
     * @param name the name
     * @param bindingField the binding field
     * @param value the value
     * @param isBasic the is basic
     */
    @Deprecated
    public UIFormWYSIWYGInput(String name, String bindingField, String value, boolean isBasic) {
        super(name, bindingField, String.class);
        useBasicToolbar = isBasic;
        this.value_ = value;
    }

    public UIFormWYSIWYGInput(String name, String bindingField, String value) {
        super(name, bindingField, String.class);
        this.value_ = value;
    }

    /**
     * Gets the fCK config.
     *
     * @return the fCK config
     */
    public FCKEditorConfig getFCKConfig() {
        return fckConfig;
    }

    /**
     * Sets the fCK config.
     *
     * @param config the new fCK config
     */
    public void setFCKConfig(FCKEditorConfig config) {
        this.fckConfig = config;
    }

    public boolean getSourceModeOnStartup() {
        return this.sourceModeOnStartup;
    }

    public void setSourceModeOnStartup(boolean b) {
        this.sourceModeOnStartup = b;
    }

    public String getToolBarName() {
        return this.toolBarName;
    }

    public void setToolBarName(String name) {
        this.toolBarName = name;
    }

    public String getWidth() {
        return this.width;
    }

    public void setWidth(String s) {
        this.width = s;
    }

    public String getHeight() {
        return this.height;
    }

    public void setHeight(String s) {
        this.height = s;
    };

    /*
     * (non-Javadoc)
     *
     * @see org.exoplatform.webui.form.UIFormInputBase#decode(java.lang.Object,
     * org.exoplatform.webui.application.WebuiRequestContext)
     */
    public void decode(Object input, WebuiRequestContext context) {
        value_ = (String) input;
        if (value_ != null && value_.length() == 0)
            value_ = null;
    }

    /*
     * (non-Javadoc)
     *
     * @see org.exoplatform.webui.core.UIComponent#processRender(org.exoplatform.webui.application.WebuiRequestContext)
     */
    public void processRender(WebuiRequestContext context) throws Exception {
        HttpServletRequest request = ((WebuiRequestContext) context.getParentAppRequestContext()).getRequest();
        FCKEditor editor = new FCKEditor(request, getName());
        if (fckConfig == null) {
            FCKEditorConfig editorConfig = new FCKEditorConfig();
            configureFCKConfig(editorConfig);
            editor.setConfig(editorConfig);
        } else {
            configureFCKConfig(fckConfig);
            editor.setConfig(fckConfig);
        }
        if (toolBarName != null && toolBarName.length() > 0) {
            editor.setToolbarSet(toolBarName);
        } else {
            editor.setToolbarSet(BASIC_TOOLBAR);
        }
        if (value_ == null)
            value_ = "";
        if (height != null && height.length() > 0) {
            editor.setHeight(height);
        }
        if (width != null && width.length() > 0) {
            editor.setWidth(width);
        }
        editor.setValue(value_);
        Writer w = context.getWriter();
        w.write(editor.createHtml());
        if (this.isMandatory())
            w.write(" *");
    }

    private void configureFCKConfig(final FCKEditorConfig config) {
        WebuiRequestContext requestContext = WebuiRequestContext.getCurrentInstance();
        String currentLanguage = requestContext.getLocale().getLanguage();
        config.put("AutoDetectLanguage", "false");
        config.put("DefaultLanguage", currentLanguage);
        config.put("SourceModeOnStartup", Boolean.toString(sourceModeOnStartup));
    }
}
