package org.tio.sitexxx.service.service.jpush.huawei.android;

import com.alibaba.fastjson.annotation.JSONField;
import org.apache.commons.lang.StringUtils;
import org.tio.sitexxx.service.service.jpush.huawei.util.ValidatorUtils;

/**
 * <pre>
 *    @author : vagrancy
 *    e-mail : 18050829067@163.com
 *    time   : 2025-02-21 10:45
 *    desc   :
 * </pre>
 */
public class ClickAction {
    private static final String PATTERN = "^https.*";

    @JSONField(name = "type")
    private Integer type;

    @JSONField(name = "intent")
    private String intent;

    @JSONField(name = "url")
    private String url;

    @JSONField(name = "rich_resource")
    private String richResource;

    @JSONField(name = "action")
    private String action;

    private ClickAction(Builder builder) {
        this.type = builder.type;
        switch (this.type) {
            case 1:
                this.intent = builder.intent;
                this.action = builder.action;
                break;
            case 2:
                this.url = builder.url;
                break;
            case 4:
                this.richResource = builder.richResource;
                break;
        }
    }

    /**
     * check clickAction's parameters
     */
    public void check() {
        boolean isTrue = this.type == 1 ||
                this.type == 2 ||
                this.type == 3 ||
                this.type == 4;
        ValidatorUtils.checkArgument(isTrue, "click type should be one of 1: customize action, 2: open url, 3: open app, 4: open rich media");

        switch (this.type) {
            case 1:
                ValidatorUtils.checkArgument(StringUtils.isNotEmpty(this.intent) || StringUtils.isNotEmpty(this.action), "intent or action is required when click type=1");
                break;
            case 2:
                ValidatorUtils.checkArgument(StringUtils.isNotEmpty(this.url), "url is required when click type=2");
                ValidatorUtils.checkArgument(this.url.matches(PATTERN), "url must start with https");
                break;
            case 4:
                ValidatorUtils.checkArgument(StringUtils.isNotEmpty(this.richResource), "richResource is required when click type=4");
                ValidatorUtils.checkArgument(this.richResource.matches(PATTERN), "richResource must start with https");
                break;
        }
    }

    /**
     * getter
     */
    public int getType() {
        return type;
    }

    public String getIntent() {
        return intent;
    }

    public String getUrl() {
        return url;
    }

    public String getRichResource() {
        return richResource;
    }

    public String getAction() {
        return action;
    }

    /**
     * builder
     */
    public static Builder builder() {
        return new Builder();
    }

    public static class Builder {
        private Integer type;
        private String intent;
        private String url;
        private String richResource;
        private String action;

        private Builder() {
        }

        public Builder setType(Integer type) {
            this.type = type;
            return this;
        }

        public Builder setIntent(String intent) {
            this.intent = intent;
            return this;
        }

        public Builder setUrl(String url) {
            this.url = url;
            return this;
        }

        public Builder setRichResource(String richResource) {
            this.richResource = richResource;
            return this;
        }

        public Builder setAction(String action) {
            this.action = action;
            return this;
        }

        public ClickAction build() {
            return new ClickAction(this);
        }
    }

}
