package com.ruoyi.cron.runner;

import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ClassUtil;
import com.ruoyi.common.utils.JsonUtils;
import com.ruoyi.cron.annotation.Cron;
import com.ruoyi.cron.annotation.CronComponent;
import com.ruoyi.cron.annotation.CronParam;
import com.ruoyi.cron.vo.CronTaskVo;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Configuration;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

@Configuration
@RequiredArgsConstructor
@Slf4j
public class CronBeanPostProcessor implements BeanPostProcessor {

  @Getter
  private List<CronTaskVo> list = ListUtil.list(true);

  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    if (bean.getClass().isAnnotationPresent(CronComponent.class)) {
      for (Method method : ClassUtil.getPublicMethods(bean.getClass(), temp -> temp.isAnnotationPresent(Cron.class))) {
        Cron cron = method.getAnnotation(Cron.class);
        CronTaskVo vo = new CronTaskVo();
        vo.setBean(bean);
        vo.setCls(bean.getClass());
        vo.setMethod(method);
        vo.setGroup(cron.group());
        vo.setName(cron.value());
        vo.setOrder(cron.order());
        for (Parameter p : method.getParameters()) {
          if (p.isAnnotationPresent(CronParam.class)) {
            vo.getParams().add(p.getAnnotation(CronParam.class).value());
          } else {
            vo.getParams().add(p.getName());
          }
        }

        list.add(vo);
        if (log.isDebugEnabled()) {
          log.debug("可用的本地定时任务：{}", JsonUtils.toJsonString(vo));
        }
      }
    }
    return bean;
  }


}
