package com.bohuikeji.frame.module.admin.utils;

import com.bohuikeji.frame.module.admin.component.RedisUtil;
import com.bohuikeji.frame.module.admin.entity.vo.ShortUrlVo;
import lombok.extern.slf4j.Slf4j;

/**
 * url工具类
 * @author 孙劲辉
 */
@Slf4j
public class UrlUtils {

    private static final RedisUtil REDIS_UTIL = SpringUtil.getBean(RedisUtil.class);
    /**
     * 短地址缓存前缀
     */
    private static final String SHORT_URL_KEY="sys:url:short:pix:";


    /**
     * 获取短链接后缀(非重定向)
     * @param realUrl 真实链接地址
     * @param time 有效时间(秒)
     * @return 返回短链接后缀，拼接短链接域名后使用
     */
    public static String createShortUrl(String realUrl, long time) {
        return createShortUrl(realUrl, time, null,false);
    }
    /**
     * 获取短链接后缀(非重定向)
     * @param realUrl 真实链接地址
     * @param time 有效时间(秒)
     * @param data 需要携带的元数据
     * @return 返回短链接后缀，拼接短链接域名后使用
     */
    public static String createShortUrl(String realUrl, long time, String data) {
        return createShortUrl(realUrl, time, data,false);
    }

    /**
     * 获取短链接后缀
     * @param realUrl 真实链接地址
     * @param time 有效时间(秒)
     * @param isRedirect 是否重定向
     * @return 返回短链接后缀，拼接短链接域名后使用
     */
    public static String  createShortUrl(String realUrl,long time,String data,boolean isRedirect){
        ShortUrlVo vo=ShortUrlVo.init(realUrl,isRedirect);
        vo.setData(data);
        REDIS_UTIL.set(SHORT_URL_KEY+vo.getShortUrlPrefix(),vo,time);
        return vo.getShortUrlPrefix();
    }

    /**
     * 获取短链接
     * @param vo 短链接实体
     * @param time
     * @param isRedirect
     * @return
     */
    public static String createShortUrl(ShortUrlVo vo,long time,boolean isRedirect){
        if (vo.getId()==null){
            log.error("短链接实体尚未初始化");
            throw new RuntimeException("短链接实体尚未初始化");
        }
        REDIS_UTIL.set(SHORT_URL_KEY+vo.getShortUrlPrefix(),vo,time);
        return vo.getShortUrlPrefix();
    }

    /**
     * 解析短地址
     * @param shortUrlPrefix 短地址后缀
     * @return 返回真实地址
     */
    public static String  analysisShortUrl(String shortUrlPrefix){
        ShortUrlVo vo=REDIS_UTIL.get(SHORT_URL_KEY+shortUrlPrefix,ShortUrlVo.class);
        if (vo!=null){
            return vo.getRealUrl();
        }
        return null;
    }

    /**
     * 获取短地址实体信息 <br>
     * 【说明】通常用于实现自定义解析
     * @param shortUrlPrefix 短地址后缀
     * @return 返回短地址实体信息，包含创建时间戳，真实链接，元数据等信息
     */
    public static ShortUrlVo getSortUrlVo(String shortUrlPrefix){
        return REDIS_UTIL.get(SHORT_URL_KEY+shortUrlPrefix,ShortUrlVo.class);
    }
}
