package global.wrappers;

import com.intellij.ide.fileTemplates.FileTemplate;
import com.intellij.ide.fileTemplates.ui.CreateFromTemplatePanel;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ValidationInfo;
import com.intellij.ui.components.JBCheckBox;
import global.models.BaseElement;
import global.models.File;
import global.utils.i18n.Localizer;
import global.utils.templates.FileTemplateHelper;
import global.utils.validation.FieldType;
import global.utils.validation.TemplateValidator;
import global.views.IconLabel;
import global.views.IconLabelCustom;
import icons.PluginIcons;
import base.ElementVisitor;
import net.miginfocom.layout.CC;
import net.miginfocom.layout.LC;
import net.miginfocom.swing.MigLayout;
import org.jetbrains.annotations.NotNull;
import global.utils.*;

import javax.swing.*;

/**
 * Created by CeH9 on 06.07.2016.
 */
public class FileWrapper extends ElementWrapper {

    private File file;

    //=================================================================
    //  UI
    //=================================================================
    public CreateFromTemplatePanel panelVariables;

    @Override
    public void buildView(Project project, JPanel container) {
        jlName = new JLabel(UIHelper.getIconByFileExtension(getFile().getExtension()), SwingConstants.LEFT);
        jlName.setDisabledIcon(jlName.getIcon());
        jlName.setText(getFile().getTemplateName());

        etfDescription = UIHelper.getEditorTextField(getFile().getName(), project);

        container.add(getOptionsPanel(), new CC().spanX().split(3));
        container.add(jlName, new CC().pad(0, 0, 0, UIHelper.PADDING_LABEL));
        container.add(etfDescription, new CC().wrap().pushX().growX());
        updateComponentsState();

        addMouseListener();

        createUsageUI(container, project);
    }

    private void createUsageUI(JPanel container, Project project) {
        if (getPackageTemplateWrapper().getMode() != PackageTemplateWrapper.ViewMode.USAGE) {
            return;
        }
        FileTemplate fileTemplate = FileTemplateHelper.getTemplate(
                getFile().getTemplateName(),
                project,
                getPackageTemplateWrapper().getPackageTemplate().getFileTemplateSource()
        );

        if (fileTemplate == null) {
            return;
        }

        panelVariables = new CreateFromTemplatePanel(
                AttributesHelper.getUnsetAttributes(fileTemplate, getPackageTemplateWrapper()),
                false,
                null
        );

        container.add(panelVariables.getComponent(), new CC().spanX().pad(0, UIHelper.PADDING, 0, 0).wrap());
    }

    @NotNull
    private JPanel getOptionsPanel() {
        JPanel optionsPanel = new JPanel(new MigLayout(new LC().insets("0").gridGap("2pt","0")));

        cbEnabled = new JBCheckBox();
        cbEnabled.setSelected(file.isEnabled());
        cbEnabled.addItemListener(e -> setEnabled(cbEnabled.isSelected()));
        cbEnabled.setToolTipText(Localizer.get("tooltip.IfCheckedElementWillBeCreated"));

        // Script
        jlScript = new IconLabel(
                Localizer.get("tooltip.ColoredWhenItemHasScript"),
                PluginIcons.SCRIPT,
                PluginIcons.SCRIPT_DISABLED
        );

        // CustomPath
        jlCustomPath = new IconLabel(
                Localizer.get("tooltip.ColoredWhenItemHasCustomPath"),
                PluginIcons.CUSTOM_PATH,
                PluginIcons.CUSTOM_PATH_DISABLED
        );

        // WriteRules
        jlWriteRules = new IconLabelCustom<File>(Localizer.get("tooltip.WriteRules"), file) {
            @Override
            public void onUpdateIcon(File item) {
                setIcon(item.getWriteRules().toIcon());
            }
        };

        updateOptionIcons();

        optionsPanel.add(cbEnabled, new CC());
        optionsPanel.add(jlScript, new CC());
        optionsPanel.add(jlCustomPath, new CC());
        optionsPanel.add(jlWriteRules, new CC());
        return optionsPanel;
    }

    @Override
    public void updateComponentsState() {
        updateOptionIcons();

        jlName.setEnabled(file.isEnabled());
        etfDescription.setEnabled(file.isEnabled());
    }


    //=================================================================
    //  Utils
    //=================================================================
    @Override
    public void accept(ElementVisitor visitor) {
        visitor.visit(this);
    }

    @Override
    public void addElement(ElementWrapper element) {
        getParent().addElement(element);
    }

    @Override
    public ValidationInfo validateFields() {
        return TemplateValidator.validateText(etfDescription, etfDescription.getText(), FieldType.CLASS_NAME);
    }

    @Override
    public void setEnabled(boolean isEnabled) {
        cbEnabled.setSelected(isEnabled);
        file.setEnabled(isEnabled);
        updateComponentsState();
    }

    @Override
    public void removeMyself() {
        getParent().removeElement(this);
    }


    //=================================================================
    //  Getter | setter
    //=================================================================
    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

    @Override
    public BaseElement getElement() {
        return file;
    }

    @Override
    public boolean isDirectory() {
        return false;
    }

}