package com.fr.solution.tools.search.conf;

import com.fr.base.FRContext;
import com.fr.base.Utils;
import com.fr.general.IOUtils;
import com.fr.stable.ProductConstants;
import com.fr.stable.StableUtils;
import com.fr.stable.project.ProjectConstants;
import com.fr.stable.xml.*;

import java.io.*;

/**
 * Created by richie on 16/3/2.
 */
public class SearchConfig implements XMLReadable, XMLWriter {

    private static SearchConfig config;
    private static File configFile = null;

    public static SearchConfig getConfig() {
        if (config == null) {
            config = new SearchConfig();
            try {
                XMLTools.readFileXML(config, config.getPluginConfig());
            } catch (Exception e) {
                FRContext.getLogger().error(e.getMessage());
            }
        }
        return config;
    }

    private boolean onlyTpl = true;
    private boolean onlyContent = true;
    private boolean searchCpt = true;
    private boolean searchFrm = true;


    public boolean isOnlyTpl() {
        return onlyTpl;
    }

    public void setOnlyTpl(boolean onlyTpl) {
        this.onlyTpl = onlyTpl;
    }

    public boolean isOnlyContent() {
        return onlyContent;
    }

    public void setOnlyContent(boolean onlyContent) {
        this.onlyContent = onlyContent;
    }



    public boolean isSearchCpt() {
        return searchCpt;
    }

    public void setSearchCpt(boolean searchCpt) {
        this.searchCpt = searchCpt;
    }

    public boolean isSearchFrm() {
        return searchFrm;
    }

    public void setSearchFrm(boolean searchFrm) {
        this.searchFrm = searchFrm;
    }

    private File getPluginConfig() {
        File configFile = getConfigFile();
        if (!configFile.exists()) {
            createConfigFile(configFile);
        }

        return configFile;
    }

    private void createConfigFile(File envFile) {
        try {
            FileWriter writer = new FileWriter(envFile);
            StringReader stringReader = new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\" ?><Config></Config>");
            Utils.copyCharTo(stringReader, writer);
            stringReader.close();
            writer.close();
        } catch (IOException e) {
            FRContext.getLogger().error(e.getMessage(), e);
        }
    }

    private File getConfigFile() {
        if (configFile == null) {
            configFile = new File(ProductConstants.getEnvHome() + File.separator  + "Plugin_Search.xml");
        }
        return configFile;
    }

    public void saveXMLFile() {
        File xmlFile = this.getConfigFile();
        if (xmlFile == null) {
            return;
        }
        if (!xmlFile.getParentFile().exists()) {//建立目录.
            StableUtils.mkdirs(xmlFile.getParentFile());
        }

        String tempName = xmlFile.getName() + ProjectConstants.TEMP_SUFFIX;
        File tempFile = new File(xmlFile.getParentFile(), tempName);

        writeTempFile(tempFile);
        IOUtils.renameTo(tempFile, xmlFile);
    }

    private void writeTempFile(File tempFile){
        try{
            OutputStream out = new FileOutputStream(tempFile);
            XMLTools.writeOutputStreamXML(this, out);
            out.flush();
            out.close();
        }catch (Exception e) {
            FRContext.getLogger().error(e.getMessage());
        }
    }


    @Override
    public void readXML(XMLableReader reader) {
        if (reader.isChildNode()) {
            String tagName = reader.getTagName();
            if ("Attr".equals(tagName)) {
                onlyTpl = reader.getAttrAsBoolean("onlyTpl", true);
                onlyContent = reader.getAttrAsBoolean("onlyContent", true);
                searchCpt = reader.getAttrAsBoolean("searchCpt", true);
                searchFrm = reader.getAttrAsBoolean("searchFrm", true);
            }
        }
    }

    @Override
    public void writeXML(XMLPrintWriter writer) {
        writer.startTAG("Config");
        writer.startTAG("Attr");
        writer.attr("onlyTpl", onlyTpl);
        writer.attr("onlyContent", onlyContent);
        writer.attr("searchCpt", searchCpt);
        writer.attr("searchFrm", searchFrm);
        writer.end();
        writer.end();
    }
}
