package cn.iocoder.yudao.module.custom.service.impl;


import cn.iocoder.yudao.module.custom.entity.CarModel;
import cn.iocoder.yudao.module.custom.mapper.CarBrandMapper;
import cn.iocoder.yudao.module.custom.mapper.CarModelMapper;
import cn.iocoder.yudao.module.custom.service.CarModelService;
import cn.iocoder.yudao.module.custom.vo.*;
import cn.iocoder.yudao.module.custom.vo.CarModelReqVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import cn.iocoder.yudao.framework.common.util.object.BeanUtils;

import java.util.List;
import java.util.UUID;

/**
 * 车辆品牌型号 Service 实现类
 *
 * @author 后台管理员
 */
@Service
@Validated
public class CarModelServiceImpl extends ServiceImpl<CarModelMapper, CarModel> implements CarModelService {

    @Autowired
    CarBrandMapper carBrandMapper;

    /**
     * 创建车辆品牌型号
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    @Override
    public String createCarModel(CarModelReqVO createReqVO) {
        // 插入
        CarModel carModel = BeanUtils.toBean(createReqVO, CarModel.class);
        carModel.setModelValue(UUID.randomUUID().toString());
        baseMapper.insert(carModel);
        // 返回
        return carModel.getId();
    }

    /**
     * 更新车辆品牌型号
     *
     * @param updateReqVO 更新信息
     */
    @Override
    public void updateCarModel(CarModelReqVO updateReqVO) {
        // 更新
        CarModel updateObj = BeanUtils.toBean(updateReqVO, CarModel.class);
        baseMapper.updateById(updateObj);
    }

    /**
     * 删除车辆品牌型号
     *
     * @param id 编号
     */
    @Override
    public void deleteCarModel(String id) {
        // 删除
        baseMapper.deleteById(id);
    }

    /**
     * 获得车辆品牌型号
     *
     * @param id 编号
     * @return 车辆品牌型号
     */
    @Override
    public CarModel getCarModel(String id) {
        return baseMapper.selectById(id);
    }

    /**
     * 获得车辆品牌型号分页
     *
     * @param pageReqVO 分页查询
     * @return 车辆品牌型号分页
     */
    @Override
    public IPage<CarModelRespVO> getCarModelPage(CarModelReqVO pageReqVO) {
        //取分页参数
        Page<CarModelReqVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
        return baseMapper.findPage(page,pageReqVO);
    }

    /**
     * 获得车辆品牌型号分页
     *
     * @param pageReqVO 分页查询
     * @return 车辆品牌型号分页
     */
    @Override
    public IPage<CarModelRespVO> getCarModelPageByBrandId(CarModelReqVO pageReqVO) {
        //取分页参数
        Page<CarModelReqVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
        return baseMapper.findPage(page,pageReqVO);
    }

    /**
     * 获取品牌型号级联下拉
     *
     * @param reqVO
     * @return
     */
    @Override
    public List<CascaderOptionsVO> searchBrand(CarModelReqVO reqVO) {

        CarBrandReqVO brandQuery = new CarBrandReqVO();
        brandQuery.setBrandName(reqVO.getModelName());
        List<CascaderOptionsVO> nameResult = carBrandMapper.searchBrand(brandQuery);

        return getChildModel(nameResult,reqVO.getModelName());
    }

    @Override
    public List<CarModel> getCarModelList() {
        List<CarModel> carModels = baseMapper.selectByMap(null);
        return carModels;
    }

    /**
     * 根据父级品牌集合取所有的型号子选项
     *
     * @param brands
     * @return
     */
    private List<CascaderOptionsVO> getChildModel(List<CascaderOptionsVO> brands,String name){
        //遍历父级数据
        for (CascaderOptionsVO brandItem: brands) {
            CarModelReqVO query = new CarModelReqVO();
            query.setBrandId(brandItem.getValue());
            query.setModelName(name);
            //取品牌下属型号选项
            List<CascaderOptionsVO> models = baseMapper.searchModelByBrandid(query);
            //父级数据拼装
            brandItem.setChildren(models);

        }
        return brands;
    }

}