package org.jeecg.modules.ctop.controller;

import android.accounts.Account;
import cn.com.ctop.common.module.entity.Project;
import cn.com.ctop.common.module.entity.UserAllocation;
import cn.com.ctop.common.module.mapper.MailLogMapper;
import cn.com.ctop.common.module.service.IMailLogService;
import cn.com.ctop.common.module.service.IProjectService;
import cn.com.ctop.common.module.service.ISysRoleExtService;
import cn.com.ctop.common.module.service.IUserAllocationService;
import cn.com.ctop.common.module.utils.Check;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.ctop.entity.ProjectMember;
import org.jeecg.modules.ctop.entity.TransferAccount;
import org.jeecg.modules.ctop.service.IProjectMemberService;
import org.jeecg.modules.ctop.service.ITransferAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;

/**
 * 转户记录表
 *
 * @author jeecg-boot
 * @version V1.0
 * @date 2020-03-26
 */
@Slf4j
@Api(tags = "转户记录表")
@RestController
@RequestMapping("/ctop/transferAccount")
public class TransferAccountController {
    @Autowired
    private ITransferAccountService transferAccountService;
    @Autowired
    private IUserAllocationService userAllocationService;
    @Autowired
    private IProjectService projectService;
    @Autowired
    private IMailLogService mailLogService;
    @Autowired
    private MailLogMapper mailLogMapper;
    @Autowired
    private ISysRoleExtService sysRoleService;
    @Autowired
    private IProjectMemberService projectMemberService;

    /**
     * 添加
     *
     * @param transferAccount
     * @return
     */
    @ApiOperation(value = "转户记录表-添加", notes = "转户记录表-添加")
    @PostMapping(value = "/add")
    public Result<TransferAccount> add(@RequestBody TransferAccount transferAccount) {
        Result<TransferAccount> result = new Result<>();
        try {
            QueryWrapper<TransferAccount> transferAccountQueryWrapper = new QueryWrapper<>();
            transferAccountQueryWrapper.eq("account_id", transferAccount.getAccountId());
            transferAccountQueryWrapper.eq("status", 0);
            List<TransferAccount> list = transferAccountService.list(transferAccountQueryWrapper);
            if (!Check.isNull(list)) {
                result.setSuccess(false);
                result.setMessage("此账户有未完成的转户操作");
                return result;
            }

            if (transferAccount.getAssigneeDate().equals(transferAccount.getTransferorDate())) {
                result.setSuccess(false);
                result.setMessage("转户人绩效截止日期不能与受让人绩效开始日期相同");
                return result;
            }
            //  转户日期 要 大于 受让日期
            Integer count = transferAccountService.checkDate(transferAccount.getAccountId(), transferAccount.getTransferorDate());
            if (count > 0) {
                result.setSuccess(false);
                result.setMessage("此账户转户日期不能早于历史转户日期");
                return result;
            }
            transferAccountService.save(transferAccount);
            Long projectId = transferAccount.getProjectId();
            Project project = projectService.getById(projectId);
            if (!Check.isNull(project)) {
                String responsibleId = project.getResponsibleId();
                mailLogService.sendWeChat(responsibleId, transferAccount.getAccountId(), project.getProjectName(), transferAccount.getTransferor(), transferAccount.getAssignee());
            }
            result.success("添加成功！");
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            result.error500("操作失败");
        }
        return result;
    }


    /**
     * 分页列表查询
     *
     * @param transferAccount
     * @param req
     * @return
     */
    @ApiOperation(value = "转户记录表-分页列表查询", notes = "转户记录表-分页列表查询")
    @GetMapping(value = "/list")
    public Result<List<TransferAccount>> queryPageList(TransferAccount transferAccount, HttpServletRequest req) {
        Result<List<TransferAccount>> result = new Result<>();
        QueryWrapper<TransferAccount> queryWrapper = QueryGenerator.initQueryWrapper(transferAccount, req.getParameterMap());
        List<TransferAccount> records = transferAccountService.list(queryWrapper);
        if (!Check.isNull(records)) {
            for (TransferAccount transfer : records) {
                // 转让人姓名
                String transferorName = mailLogMapper.getUserNameByUserId(transfer.getTransferor());
                transfer.setTransferorName(transferorName);
                // 转让人姓名
                String assigneeName = mailLogMapper.getUserNameByUserId(transfer.getAssignee());
                transfer.setAssigneeName(assigneeName);
            }
        }

        result.setSuccess(true);
        result.setResult(records);
        return result;
    }


    /**
     * 编辑
     *
     * @param transferAccount
     * @return
     */
    @ApiOperation(value = "转户记录表-编辑", notes = "转户记录表-编辑")
    @PutMapping(value = "/edit")
    public Result<TransferAccount> edit(@RequestBody TransferAccount transferAccount) {
        Result<TransferAccount> result = new Result<>();
        TransferAccount transferAccountEntity = transferAccountService.getById(transferAccount.getId());
        if (transferAccountEntity == null) {
            result.error500("未找到对应实体");
        } else {
            Integer status = transferAccount.getStatus();

            Long projectId = transferAccountEntity.getProjectId();
            Project project = projectService.getById(projectId);

            if (status == 1) { // 审核通过 修改账户所属人信息 添加受让人到项目成员列表
                QueryWrapper<UserAllocation> updateQueryWrapper = new QueryWrapper<>();
                updateQueryWrapper.eq("account_id", transferAccountEntity.getAccountId());
                updateQueryWrapper.eq("project_id", transferAccountEntity.getProjectId());
                UserAllocation updateUserAllocation = new UserAllocation();
                updateUserAllocation.setUserId(transferAccountEntity.getAssignee());
                String getAssigneeName = mailLogMapper.getUserNameByUserId(transferAccountEntity.getAssignee()); // 转让人姓名
                updateUserAllocation.setUserName(getAssigneeName);
                userAllocationService.update(updateUserAllocation, updateQueryWrapper);
                QueryWrapper<ProjectMember> projectMemberQueryWrapper = new QueryWrapper<>();
                projectMemberQueryWrapper.eq("project_id", transferAccountEntity.getProjectId());
                projectMemberQueryWrapper.eq("user_id", transferAccountEntity.getAssignee());
                projectMemberQueryWrapper.last("limit 1");
                ProjectMember projectMember = projectMemberService.getOne(projectMemberQueryWrapper);
                if (Check.isNull(projectMember)) {
                    ProjectMember addProjectMember = new ProjectMember();
                    String roleCode = sysRoleService.getRoleCodeByUserId(transferAccountEntity.getAssignee());
                    addProjectMember.setRoleCode(roleCode);
                    addProjectMember.setUserId(transferAccountEntity.getAssignee());
                    addProjectMember.setUserName(getAssigneeName);
                    addProjectMember.setProjectId(project.getId());
                    addProjectMember.setProjectName(project.getProjectName());
                    projectMemberService.save(addProjectMember);
                }

                try {
                    //根据账户ID获取总监
                    JSONObject accountJson = mailLogMapper.getAccountInfo(transferAccountEntity.getAccountId());
                    BigDecimal cost = new BigDecimal(0);
                    if (!Check.isNull(accountJson)) {
                        Integer mediaId = accountJson.getInteger("mediaId");
                        if (!Check.isNull(mediaId)) {
                            if (mediaId == 1) {
                                cost = mailLogMapper.getBytedanceCost(transferAccountEntity.getAccountId());
                            }
                            if (mediaId == 2) {
                                cost = mailLogMapper.getKuaishouCost(transferAccountEntity.getAccountId());
                            }
                        }
                        if (cost.compareTo(BigDecimal.ZERO) > 0) {
                            String leaderId = accountJson.getString("leaderId");
                            mailLogService.sendLeaderWeChat(project.getProjectName(), status, leaderId, transferAccountEntity.getAccountId(), transferAccountEntity.getTransferor(), transferAccountEntity.getAssignee(), cost);
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }


            }
            mailLogService.sendWeChatByStatus(project.getProjectName(), status, transferAccountEntity.getTransferor(), transferAccountEntity.getAccountId());
            mailLogService.sendWeChatByStatus(project.getProjectName(), status, transferAccountEntity.getAssignee(), transferAccountEntity.getAccountId());
            boolean ok = transferAccountService.updateById(transferAccount);
            if (ok) {
                result.success("修改成功!");
            }
        }
        return result;
    }


    @ApiOperation(value = "转户记录表-编辑", notes = "转户记录表-编辑")
    @GetMapping(value = "/projectTransfer")
    public Result<TransferAccount> projectTransfer(Long projectId, Integer status, String auditor) {
        Result<TransferAccount> result = new Result<>();
        QueryWrapper<TransferAccount> transferAccountQueryWrapper = new QueryWrapper<>();
        transferAccountQueryWrapper.eq("project_id", projectId);
        transferAccountQueryWrapper.eq("status", 0);
        List<TransferAccount> list = transferAccountService.list(transferAccountQueryWrapper);
        if (Check.isNull(list)) {
            result.error500("未找到对应实体");
        } else {
            for (int i = 0; i < list.size(); i++) {
                TransferAccount transferAccount = list.get(i);
                Project project = projectService.getById(transferAccount.getProjectId());
                if (status == 1) { // 审核通过 修改账户所属人信息 添加受让人到项目成员列表
                    QueryWrapper<UserAllocation> updateQueryWrapper = new QueryWrapper<>();
                    updateQueryWrapper.eq("account_id", transferAccount.getAccountId());
                    updateQueryWrapper.eq("project_id", transferAccount.getProjectId());
                    UserAllocation updateUserAllocation = new UserAllocation();
                    updateUserAllocation.setUserId(transferAccount.getAssignee());
                    String userName = mailLogMapper.getUserNameByUserId(transferAccount.getAssignee()); // 转让人姓名
                    updateUserAllocation.setUserName(userName);
                    userAllocationService.update(updateUserAllocation, updateQueryWrapper);
                    QueryWrapper<ProjectMember> projectMemberQueryWrapper = new QueryWrapper<>();
                    projectMemberQueryWrapper.eq("project_id", transferAccount.getProjectId());
                    projectMemberQueryWrapper.eq("user_id", transferAccount.getAssignee());
                    projectMemberQueryWrapper.last("limit 1");
                    ProjectMember projectMember = projectMemberService.getOne(projectMemberQueryWrapper);
                    if (Check.isNull(projectMember)) {
                        ProjectMember addProjectMember = new ProjectMember();
                        String roleCode = sysRoleService.getRoleCodeByUserId(transferAccount.getAssignee());
                        addProjectMember.setRoleCode(roleCode);
                        addProjectMember.setUserId(transferAccount.getAssignee());
                        addProjectMember.setUserName(userName);
                        addProjectMember.setProjectId(project.getId());
                        addProjectMember.setProjectName(project.getProjectName());
                        projectMemberService.save(addProjectMember);
                    }
                }
                //    mailLogService.sendWeChatByStatus(project.getProjectName(), status, transferAccount.getTransferor(), transferAccount.getAccountId());
                //  mailLogService.sendWeChatByStatus(project.getProjectName(), status, transferAccount.getAssignee(), transferAccount.getAccountId());


                transferAccount.setAuditor(auditor);
                transferAccount.setStatus(status);
                transferAccountService.updateById(transferAccount);
            }

            result.success("修改成功!");
        }
        return result;
    }


    //transferAccount

    /**
     * 通过id删除
     *
     * @param id
     * @return
     */
    @ApiOperation(value = "转户记录表-通过id删除", notes = "转户记录表-通过id删除")
    @DeleteMapping(value = "/delete")
    public Result<Object> delete(@RequestParam(name = "id", required = true) String id) {
        try {
            transferAccountService.removeById(id);
        } catch (Exception e) {
            log.error("删除失败", e.getMessage());
            return Result.error("删除失败!");
        }
        return Result.ok("删除成功!");
    }

    /**
     * 批量删除
     *
     * @param ids
     * @return
     */
    @ApiOperation(value = "转户记录表-批量删除", notes = "转户记录表-批量删除")
    @DeleteMapping(value = "/deleteBatch")
    public Result<TransferAccount> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
        Result<TransferAccount> result = new Result<>();
        if (ids == null || "".equals(ids.trim())) {
            result.error500("参数不识别！");
        } else {
            this.transferAccountService.removeByIds(Arrays.asList(ids.split(",")));
            result.success("删除成功!");
        }
        return result;
    }

    /**
     * 通过id查询
     *
     * @param id
     * @return
     */
    @ApiOperation(value = "转户记录表-通过id查询", notes = "转户记录表-通过id查询")
    @GetMapping(value = "/queryById")
    public Result<TransferAccount> queryById(@RequestParam(name = "id", required = true) String id) {
        Result<TransferAccount> result = new Result<>();
        TransferAccount transferAccount = transferAccountService.getById(id);
        if (transferAccount == null) {
            result.error500("未找到对应实体");
        } else {
            result.setResult(transferAccount);
            result.setSuccess(true);
        }
        return result;
    }
}
