package run.halo.app.core.freemarker.tag;

import cn.hutool.core.util.PageUtil;
import cn.hutool.core.util.RandomUtil;
import freemarker.core.Environment;
import freemarker.template.*;
import org.springframework.stereotype.Component;
import run.halo.app.model.support.HaloConst;

import java.io.IOException;
import java.util.Map;

/**
 * Freemarker custom tag of tools.
 *
 * @author ryanwang
 * @date 2020-01-17
 */
@Component
public class ToolTagDirective implements TemplateDirectiveModel {

    public ToolTagDirective(Configuration configuration) {
        configuration.setSharedVariable("toolTag", this);
    }

    @Override
    public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException {
        final DefaultObjectWrapperBuilder builder = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_25);

        if (params.containsKey(HaloConst.METHOD_KEY)) {
            String method = params.get(HaloConst.METHOD_KEY).toString();
            switch (method) {
                case "rainbowPage":
                    int page = Integer.parseInt(params.get("page").toString());
                    int total = Integer.parseInt(params.get("total").toString());
                    int display = Integer.parseInt(params.get("display").toString());
                    env.setVariable("numbers", builder.build().wrap(PageUtil.rainbow(page, total, display)));
                    break;
                case "random":
                    int min = Integer.parseInt(params.get("min").toString());
                    int max = Integer.parseInt(params.get("max").toString());
                    env.setVariable("number", builder.build().wrap(RandomUtil.randomInt(min, max)));
                    break;
                default:
                    break;
            }
        }
        body.render(env.getOut());
    }
}