package com.bonus.material.codeCollection.service.impl;

import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.material.codeCollection.domain.WsMaInfo;
import com.bonus.material.codeCollection.mapper.WsMaInfoMapper;
import com.bonus.material.codeCollection.service.WsMaInfoService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * {@code WsMaInfoServiceImpl}
 * <p>
 * 机具信息服务实现类，实现了 {@link WsMaInfoService} 接口。
 * 提供对 {@code ws_ma_info} 表的增删改查业务逻辑，并统一返回 {@link AjaxResult} 格式结果。
 * </p>
 *
 * <p>核心功能：</p>
 * <ul>
 *     <li>根据ID获取机具信息</li>
 *     <li>获取全部机具信息</li>
 *     <li>新增机具信息</li>
 *     <li>更新机具信息</li>
 *     <li>删除机具信息</li>
 * </ul>
 */
@Slf4j
@Service
public class WsMaInfoServiceImpl implements WsMaInfoService {

    /**
     * 注入 Mapper，执行实际的数据库操作
     */
    @Resource
    private WsMaInfoMapper mapper;

    /**
     * 根据主键 ID 获取单条机具信息
     *
     * @param id 机具主键ID
     * @return AjaxResult，成功时返回 WsMaInfo 数据，失败时返回提示信息
     */
    @Override
    public AjaxResult getById(Integer id) {
        try {
            WsMaInfo info = mapper.selectById(id);
            return ObjectUtils.isNotEmpty(info) ? AjaxResult.success(info) : AjaxResult.error("未找到对应的机具信息，ID: " + id);
        } catch (Exception e) {
            log.error(e.getMessage());
            return AjaxResult.error("未找到对应的机具信息，ID: " + id);
        }
    }

    /**
     * 获取全部机具信息列表（无分页）
     *
     * @return List<WsMaInfo> 数据集合，由 Controller 封装为 AjaxResult
     */
    @Override
    public List<WsMaInfo> getAll() {
        return mapper.selectAll();
    }

    /**
     * 新增一条机具信息记录
     *
     * @param info 机具实体对象，需包含有效字段（如 maName, maCode 等）
     * @return AjaxResult，成功或失败信息
     */
    @Override
    public AjaxResult save(WsMaInfo info) {
        try {
            int i = mapper.existsByModelAndCode(info.getMaModel(), info.getMaCode());
            if (ObjectUtils.isNotEmpty(i)) {
                mapper.updateCheckTime(i);
                return AjaxResult.error("该机具规格与编码已存在，请勿重复添加！");
            }
            int result = mapper.insert(info);
            return result > 0 ? AjaxResult.success("新增成功") : AjaxResult.error("新增失败");
        } catch (Exception e) {
            log.error(e.getMessage());
            return AjaxResult.error("新增失败");
        }

    }

    /**
     * 根据 ID 更新已有机具信息
     *
     * @param info 包含更新字段及主键ID的机具实体
     * @return AjaxResult，操作成功与否
     */
    @Override
    public AjaxResult update(WsMaInfo info) {
        try {
            if (info.getId() == null) {
                return AjaxResult.error("ID不能为空");
            }
            int result = mapper.update(info);
            return result > 0
                    ? AjaxResult.success("更新成功")
                    : AjaxResult.error("更新失败");
        } catch (Exception e) {
            log.error(e.getMessage());
            return AjaxResult.error("更新失败");
        }
    }

    /**
     * 根据主键 ID 删除机具信息记录
     *
     * @param id 待删除记录的主键 ID
     * @return AjaxResult，操作是否成功
     */
    @Override
    public AjaxResult delete(Integer id) {
        try {
            int result = mapper.deleteById(id);
            return result > 0
                    ? AjaxResult.success("删除成功")
                    : AjaxResult.error("删除失败");
        } catch (Exception e) {
            log.error(e.getMessage());
            return AjaxResult.error("删除失败");
        }
    }

    /**
     * 获取机具类型下拉选
     *
     * @return 机具类型集合
     */
    @Override
    public AjaxResult getMaTypeData() {
        try {
            List<Map<String, Objects>> maTypeData = mapper.getMaTypeData();
            return ObjectUtils.isNotEmpty(maTypeData) ? AjaxResult.success(maTypeData) : AjaxResult.error("");
        } catch (Exception e) {
            log.error(e.getMessage());
            return AjaxResult.error("");
        }
    }

    /**
     * 获取机具规格下拉选
     *
     * @param parentId 父类id
     * @return 机具规格集合
     */
    @Override
    public AjaxResult getMaModeData(Integer parentId) {
        try {
            List<Map<String, Objects>> maModeData = mapper.getMaModeData(parentId);
            return ObjectUtils.isNotEmpty(maModeData) ? AjaxResult.success(maModeData) : AjaxResult.error("");
        } catch (Exception e) {
            log.error(e.getMessage());
            return AjaxResult.error("");
        }
    }

    /**
     * 获取出厂厂家
     *
     * @return 出厂厂家集合
     */
    @Override
    public AjaxResult getSupplier() {
        try {
            List<Map<String, Objects>> supplier = mapper.getSupplier();
            return ObjectUtils.isNotEmpty(supplier) ? AjaxResult.success(supplier) : AjaxResult.error("");
        } catch (Exception e) {
            log.error(e.getMessage());
            return AjaxResult.error("");
        }
    }
}
