package cn.bunny.services.service.financial.impl;

import cn.bunny.common.service.context.BaseContext;
import cn.bunny.common.service.exception.BunnyException;
import cn.bunny.dao.dto.financial.category.admin.CategoryAddDto;
import cn.bunny.dao.dto.financial.category.admin.CategoryDto;
import cn.bunny.dao.dto.financial.category.admin.CategoryUpdateDto;
import cn.bunny.dao.dto.financial.category.user.CategoryUserAddDto;
import cn.bunny.dao.dto.financial.category.user.CategoryUserDto;
import cn.bunny.dao.dto.financial.category.user.CategoryUserUpdateDto;
import cn.bunny.dao.entity.financial.Category;
import cn.bunny.dao.pojo.constant.UserConstant;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.pojo.result.ResultCodeEnum;
import cn.bunny.dao.vo.financial.admin.CategoryVo;
import cn.bunny.dao.vo.financial.user.CategoryUserVo;
import cn.bunny.services.mapper.financial.CategoryMapper;
import cn.bunny.services.service.financial.CategoryService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.validation.Valid;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 * 分类信息 服务实现类
 * </p>
 *
 * @author Bunny
 * @since 2024-11-08 10:29:58
 */
@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService {

    /**
     * * 用户分类分页查询分类信息 服务实现类
     *
     * @param pageParams 分类信息分页查询page对象
     * @param dto        分类信息分页查询对象
     * @return 查询分页分类信息返回对象
     */
    @Override
    public PageResult<CategoryUserVo> getCategoryUserList(Page<Category> pageParams, CategoryUserDto dto) {
        IPage<CategoryUserVo> page = baseMapper.selectUserListByPage(pageParams, dto, BaseContext.getUserId());

        return PageResult.<CategoryUserVo>builder()
                .list(page.getRecords())
                .pageNo(page.getCurrent())
                .pageSize(page.getSize())
                .total(page.getTotal())
                .build();
    }

    /**
     * 用戶分类添加分类信息
     *
     * @param dto 分类信息添加
     */
    @Override
    public void addCategoryUser(@Valid CategoryUserAddDto dto) {
        // 查询当前用户添加了多少条
        if (count(Wrappers.<Category>lambdaQuery().eq(Category::getIsBuiltin, false)) >= UserConstant.CATEGORY_COUNT) {
            throw new BunnyException(ResultCodeEnum.THE_MAXIMUM_BAR_CODE);
        }

        // 保存数据
        Category categoryUser = new Category();
        BeanUtils.copyProperties(dto, categoryUser);

        // 设置当前用户Id
        categoryUser.setUserId(BaseContext.getUserId());
        save(categoryUser);
    }

    /**
     * 用户分类更新分类信息
     *
     * @param dto 分类信息更新
     */
    @Override
    public void updateCategoryUser(@Valid CategoryUserUpdateDto dto) {
        Long userId = BaseContext.getUserId();
        String categoryName = dto.getCategoryName();

        // 判断用户修改的当前内容是否和系统内置的信息一致
        Category category = getOne(Wrappers.<Category>lambdaQuery().eq(Category::getId, dto.getId()));
        Long categoryUserId = category.getUserId();
        String categoryCategoryName = category.getCategoryName();

        if (!categoryUserId.equals(userId) || !categoryCategoryName.equals(categoryName)) {
            throw new BunnyException(ResultCodeEnum.ILLEGAL_DATA_REQUEST);
        }

        // 更新内容
        Category categoryUser = new Category();
        BeanUtils.copyProperties(dto, categoryUser);
        updateById(categoryUser);
    }

    /**
     * 用户分类删除|批量删除分类信息
     *
     * @param ids 删除id列表
     */
    @Override
    public void deleteCategoryUser(List<Long> ids) {
        baseMapper.deleteBatchIdsWithPhysics(ids);
    }

    /**
     * 查询当前用户下所有的分类
     *
     * @return 当前用户分类返回列表
     */
    @Override
    public List<CategoryUserVo> getCategoryUserAllList() {
        return list(Wrappers.<Category>lambdaQuery().eq(Category::getUserId, BaseContext.getUserId()))
                .stream().map(category -> {
                    CategoryUserVo categoryUserVo = new CategoryUserVo();
                    BeanUtils.copyProperties(category, categoryUserVo);
                    return categoryUserVo;
                }).toList();
    }

    /**
     * * 分类信息 服务实现类
     *
     * @param pageParams 分类信息分页查询page对象
     * @param dto        分类信息分页查询对象
     * @return 查询分页分类信息返回对象
     */
    @Override
    public PageResult<CategoryVo> getCategoryList(Page<Category> pageParams, CategoryDto dto) {
        IPage<CategoryVo> page = baseMapper.selectListByPage(pageParams, dto);

        return PageResult.<CategoryVo>builder()
                .list(page.getRecords())
                .pageNo(page.getCurrent())
                .pageSize(page.getSize())
                .total(page.getTotal())
                .build();
    }

    /**
     * 添加分类信息
     *
     * @param dto 分类信息添加
     */
    @Override
    public void addCategory(@Valid CategoryAddDto dto) {
        // 保存数据
        Category category = new Category();
        BeanUtils.copyProperties(dto, category);

        // 如果内置的id为空设置为当前用户的id
        category.setUserId(category.getUserId() == null ? BaseContext.getUserId() : dto.getUserId());
        save(category);
    }

    /**
     * 更新分类信息
     *
     * @param dto 分类信息更新
     */
    @Override
    public void updateCategory(@Valid CategoryUpdateDto dto) {
        // 更新内容
        Category category = new Category();
        BeanUtils.copyProperties(dto, category);
        updateById(category);
    }

    /**
     * 删除|批量删除分类信息
     *
     * @param ids 删除id列表
     */
    @Override
    public void deleteCategory(List<Long> ids) {
        baseMapper.deleteBatchIdsWithPhysics(ids);
    }
}
