package com.ruoyi.web.controller.system;

import cn.dev33.satoken.annotation.SaIgnore;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.domain.model.SmsLoginBody;
import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.pay.domain.bo.PaySubInfoBo;
import com.ruoyi.pay.domain.vo.PaySubInfoVo;
import com.ruoyi.pay.service.IPaySubInfoService;
import com.ruoyi.system.domain.vo.RouterVo;
import com.ruoyi.system.mapper.SysUserMapper;
import com.ruoyi.system.service.ISysMenuService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.SysLoginService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.constraints.NotBlank;
import java.text.ParseException;
import java.util.*;

/**
 * 登录验证
 *
 * @author Lion Li
 */
@Validated
@RequiredArgsConstructor
@RestController
public class SysLoginController {

    private final SysLoginService loginService;
    private final ISysMenuService menuService;
    private final ISysUserService userService;
    private final SysUserMapper userMapper;
    private final IPaySubInfoService iPaySubInfoService;
    /**
     * 登录方法
     *
     * @param loginBody 登录信息
     * @return 结果
     */
    @SaIgnore
    @PostMapping("/login")
    /*public R<Map<String, Object>> login(@Validated @RequestBody LoginBody loginBody) throws ParseException {
        Map<String, Object> ajax = new HashMap<>();
        // 生成令牌
        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
            loginBody.getUuid());

        //除管理员用户外,所有用户根据用户公司拿到到期时间   未到期允许登录 否则不允许登录
        String companyName = LoginHelper.getCompanyName();
        if(companyName!=null&&companyName!=""){
            String expire_time = dictService.getDictValue("expire_time", companyName);
            if(expire_time==null||expire_time.equals("")){
               // return R.fail("公司没有系统的使用期限，请联系管理员或开发人员！");
            }else{
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                int result = format.parse(expire_time).compareTo(new Date());
                if(result<0){
                    return R.fail("系统已到期，请联系管理员或开发人员！");
                }
            }
        }
        ajax.put(Constants.TOKEN, token);
        return R.ok(ajax);
    }*/
    public R<Map<String, Object>> login(@Validated @RequestBody LoginBody loginBody) throws ParseException {
        Map<String, Object> ajax = new HashMap<>();
        // 生成令牌
        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
            loginBody.getUuid());

        //除管理员用户外,所有用户根据用户公司拿到到期时间   未到期允许登录 否则不允许登录
       // String companyName = LoginHelper.getCompanyName();
        Long tenantId = LoginHelper.getTenantId();
       // if(companyName!=null&&companyName!=""){
        if(tenantId!=null){
            //查询订阅信息中的结束时间
            PaySubInfoBo bo = new PaySubInfoBo();
            bo.setTenantId(tenantId);
            List<PaySubInfoVo> subscriptionInfoVos = iPaySubInfoService.queryList(bo);
            if(subscriptionInfoVos!=null&&subscriptionInfoVos.size()>0){
                PaySubInfoVo subscriptionInfo = subscriptionInfoVos.get(0);
                //截止日期不为空并且激活状态为已激活（默认0已激活）
                if(subscriptionInfo.getEndTime()!=null&&subscriptionInfo.getActive().equals("0")){
                    Date endTime= subscriptionInfo.getEndTime();
                    Calendar calendar = Calendar.getInstance();
                    calendar.setTime(endTime);
                    // 在当前日期上加一天(包含失效日期)
                    calendar.add(Calendar.DAY_OF_MONTH, 1);
                    Date expireTime = calendar.getTime();
                    Date currentTime = new Date();
                    int result = expireTime.compareTo(currentTime);
                    if(result<0){
                        return R.fail("系统已到期，请联系管理员或开发人员！");
                    }
                }else{
                     return R.fail("公司没有系统的使用权限，请联系管理员或开发人员！");
                }
            }else{
                return R.fail("公司没有订阅信息，请联系管理员或开发人员！");
            }
        }
        ajax.put(Constants.TOKEN, token);
        return R.ok(ajax);
    }

    /**
     * 短信登录(示例)
     *
     * @param smsLoginBody 登录信息
     * @return 结果
     */
    @SaIgnore
    @PostMapping("/smsLogin")
    public R<Map<String, Object>> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) {
        Map<String, Object> ajax = new HashMap<>();
        // 生成令牌
        String token = loginService.smsLogin(smsLoginBody.getPhonenumber(), smsLoginBody.getSmsCode());
        ajax.put(Constants.TOKEN, token);
        return R.ok(ajax);
    }

    /**
     * 小程序登录(示例)
     *
     * @param xcxCode 小程序code
     * @return 结果
     */
    @SaIgnore
    @PostMapping("/xcxLogin")
    public R<Map<String, Object>> xcxLogin(@NotBlank(message = "{xcx.code.not.blank}") String xcxCode) {
        Map<String, Object> ajax = new HashMap<>();
        // 生成令牌
        String token = loginService.xcxLogin(xcxCode);
        ajax.put(Constants.TOKEN, token);
        return R.ok(ajax);
    }

    /**
     * 退出登录
     */
    @SaIgnore
    @PostMapping("/logout")
    public R<Void> logout() {
        loginService.logout();
        return R.ok("退出成功");
    }

    /**
     * 获取用户信息
     *
     * @return 用户信息
     */
    @GetMapping("getInfo")
    public R<Map<String, Object>> getInfo() {
        LoginUser loginUser = LoginHelper.getLoginUser();
        SysUser user = userService.selectUserById(loginUser.getUserId());
        if ("client".equals(user.getUserType())) {
            user.setClientId(userMapper.getClientIdByUserId(user.getUserId()));
        } else if ("maintenance".equals(user.getUserType())) {
            user.setMaintainerId(userMapper.getMaintainerIdByUserId(user.getUserId()));
        }
        Map<String, Object> ajax = new HashMap<>();
        ajax.put("user", user);
        ajax.put("roles", loginUser.getRolePermission());
        ajax.put("permissions", loginUser.getMenuPermission());
        ajax.put("companyName",LoginHelper.getCompanyName());
        return R.ok(ajax);
    }

    /**
     * 获取路由信息
     *
     * @return 路由信息
     */
    @GetMapping("getRouters")
    public R<List<RouterVo>> getRouters() {
        Long userId = LoginHelper.getUserId();
        List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
        return R.ok(menuService.buildMenus(menus));
    }
}
