package com.aiotagro.cattletrade.business.service.impl;

import com.aiotagro.cattletrade.business.entity.Vehicle;
import com.aiotagro.cattletrade.business.mapper.VehicleMapper;
import com.aiotagro.cattletrade.business.service.IVehicleService;
import com.aiotagro.common.core.utils.SecurityUtil;
import com.aiotagro.common.core.web.domain.AjaxResult;
import com.aiotagro.common.core.web.domain.PageResultResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 车辆管理服务实现类
 *
 * @author System
 * @date 2025-01-20
 */
@Service
public class VehicleServiceImpl extends ServiceImpl<VehicleMapper, Vehicle> implements IVehicleService {

    @Autowired
    private VehicleMapper vehicleMapper;

    /**
     * 分页查询车辆列表（只查询未删除的记录）
     */
    @Override
    public PageResultResponse<Vehicle> pageQuery(Map<String, Object> params) {
        Integer pageNum = params.get("pageNum") != null ? (Integer) params.get("pageNum") : 1;
        Integer pageSize = params.get("pageSize") != null ? (Integer) params.get("pageSize") : 10;
        String licensePlate = (String) params.get("licensePlate");


        // 使用PageHelper进行分页
        Page<Vehicle> page = PageHelper.startPage(pageNum, pageSize);

        // 构建查询条件
        LambdaQueryWrapper<Vehicle> queryWrapper = new LambdaQueryWrapper<>();
        // ✅ 只查询未删除的记录（is_delete=0 或 is_delete 为 null）
        queryWrapper.and(wrapper -> wrapper.eq(Vehicle::getIsDelete, 0).or().isNull(Vehicle::getIsDelete));
        queryWrapper.like(licensePlate != null && !licensePlate.isEmpty(), Vehicle::getLicensePlate, licensePlate);
        queryWrapper.orderByDesc(Vehicle::getCreateTime);

        // 执行查询
        List<Vehicle> list = vehicleMapper.selectList(queryWrapper);


        // 构建分页结果（使用构造函数）
        return new PageResultResponse<>(page.getTotal(), list);
    }

    /**
     * 新增车辆
     */
    @Override
    @Transactional
    public AjaxResult addVehicle(Vehicle vehicle) {
        // 验证车牌号是否已存在
        Vehicle existingVehicle = vehicleMapper.selectByLicensePlate(vehicle.getLicensePlate());
        if (existingVehicle != null) {
            return AjaxResult.error("车牌号已存在");
        }

        // 设置创建人和创建时间
        Integer userId = SecurityUtil.getCurrentUserId();
        vehicle.setCreatedBy(userId);
        vehicle.setCreateTime(new Date());

        try {
            // 插入数据库
            int result = vehicleMapper.insert(vehicle);

            if (result > 0) {
                return AjaxResult.success("新增车辆成功");
            } else {
                return AjaxResult.error("新增车辆失败");
            }
        } catch (DuplicateKeyException e) {
            // 捕获重复键异常（车牌号重复）
            String errorMessage = e.getMessage();
            if (errorMessage != null && errorMessage.contains("license_plate")) {
                return AjaxResult.error("车牌号已存在，请使用其他车牌号");
            }
            return AjaxResult.error("数据重复：" + errorMessage);
        } catch (DataIntegrityViolationException e) {
            // 捕获数据库约束异常，提供更友好的错误信息
            String errorMessage = e.getMessage();
            // 记录完整错误信息以便调试
            e.printStackTrace();
            if (errorMessage != null && errorMessage.contains("record_code") && errorMessage.contains("too long")) {
                return AjaxResult.error("牧运通备案码图片URL过长，请重新上传或联系管理员调整数据库字段长度。如果已修改数据库字段为TEXT类型，请重启应用或清空连接池缓存");
            } else if (errorMessage != null && errorMessage.contains("Data too long")) {
                return AjaxResult.error("上传的数据内容过长，请检查图片URL或联系管理员");
            } else if (errorMessage != null && errorMessage.contains("license_plate")) {
                return AjaxResult.error("车牌号已存在，请使用其他车牌号");
            }
            // 返回完整错误信息以便调试
            return AjaxResult.error("新增车辆失败：" + errorMessage);
        } catch (Exception e) {
            // 捕获其他可能的异常
            String errorMessage = e.getMessage();
            // 记录完整错误信息以便调试
            e.printStackTrace();
            if (errorMessage != null && errorMessage.contains("record_code") && errorMessage.contains("too long")) {
                return AjaxResult.error("牧运通备案码图片URL过长，请重新上传或联系管理员调整数据库字段长度。如果已修改数据库字段为TEXT类型，请重启应用或清空连接池缓存");
            } else if (errorMessage != null && errorMessage.contains("license_plate") && errorMessage.contains("Duplicate")) {
                return AjaxResult.error("车牌号已存在，请使用其他车牌号");
            }
            // 返回完整错误信息以便调试
            return AjaxResult.error("新增车辆失败：" + errorMessage);
        }
    }

    /**
     * 更新车辆信息
     */
    @Override
    @Transactional
    public AjaxResult updateVehicle(Vehicle vehicle) {
        if (vehicle.getId() == null) {
            return AjaxResult.error("车辆ID不能为空");
        }

        // 验证车牌号唯一性（排除当前记录）
        Vehicle existingVehicle = vehicleMapper.selectByLicensePlate(vehicle.getLicensePlate());
        if (existingVehicle != null && !existingVehicle.getId().equals(vehicle.getId())) {
            return AjaxResult.error("车牌号已存在");
        }

        // 设置更新人和更新时间
        Integer userId = SecurityUtil.getCurrentUserId();
        vehicle.setUpdatedBy(userId);
        vehicle.setUpdateTime(new Date());

        try {
            // 更新数据库
            int result = vehicleMapper.updateById(vehicle);

            if (result > 0) {
                return AjaxResult.success("更新车辆成功");
            } else {
                return AjaxResult.error("更新车辆失败");
            }
        } catch (DuplicateKeyException e) {
            // 捕获重复键异常（车牌号重复）
            String errorMessage = e.getMessage();
            if (errorMessage != null && errorMessage.contains("license_plate")) {
                return AjaxResult.error("车牌号已存在，请使用其他车牌号");
            }
            return AjaxResult.error("数据重复：" + errorMessage);
        } catch (DataIntegrityViolationException e) {
            // 捕获数据库约束异常，提供更友好的错误信息
            String errorMessage = e.getMessage();
            // 记录完整错误信息以便调试
            e.printStackTrace();
            if (errorMessage != null && errorMessage.contains("record_code") && errorMessage.contains("too long")) {
                return AjaxResult.error("牧运通备案码图片URL过长，请重新上传或联系管理员调整数据库字段长度。如果已修改数据库字段为TEXT类型，请重启应用或清空连接池缓存");
            } else if (errorMessage != null && errorMessage.contains("Data too long")) {
                return AjaxResult.error("上传的数据内容过长，请检查图片URL或联系管理员");
            } else if (errorMessage != null && errorMessage.contains("license_plate")) {
                return AjaxResult.error("车牌号已存在，请使用其他车牌号");
            }
            // 返回完整错误信息以便调试
            return AjaxResult.error("更新车辆失败：" + errorMessage);
        } catch (Exception e) {
            // 捕获其他可能的异常
            String errorMessage = e.getMessage();
            // 记录完整错误信息以便调试
            e.printStackTrace();
            if (errorMessage != null && errorMessage.contains("record_code") && errorMessage.contains("too long")) {
                return AjaxResult.error("牧运通备案码图片URL过长，请重新上传或联系管理员调整数据库字段长度。如果已修改数据库字段为TEXT类型，请重启应用或清空连接池缓存");
            } else if (errorMessage != null && errorMessage.contains("license_plate") && errorMessage.contains("Duplicate")) {
                return AjaxResult.error("车牌号已存在，请使用其他车牌号");
            }
            // 返回完整错误信息以便调试
            return AjaxResult.error("更新车辆失败：" + errorMessage);
        }
    }

    /**
     * 删除车辆（逻辑删除 - 直接执行 SQL）
     * 不依赖 @TableLogic 注解，直接执行 UPDATE 语句
     */
    @Override
    @Transactional
    public AjaxResult deleteVehicle(Integer id) {
        
        if (id == null) {
            return AjaxResult.error("车辆ID不能为空");
        }

        // 查询车辆是否存在
        Vehicle vehicle = vehicleMapper.selectById(id);
        if (vehicle == null) {
            return AjaxResult.error("车辆不存在");
        }


        // 获取当前用户ID
        Integer userId = SecurityUtil.getCurrentUserId();
        
        // ✅ 直接使用 SQL 更新，不依赖 @TableLogic
        com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<Vehicle> updateWrapper = 
            new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<>();
        
        updateWrapper.eq("id", id)
                    .eq("is_delete", 0);  // 只更新未删除的记录
        
        updateWrapper.set("is_delete", 1)
                    .set("updated_by", userId)
                    .set("update_time", new Date());
        
        
        int result = vehicleMapper.update(null, updateWrapper);

        if (result > 0) {
            return AjaxResult.success("删除车辆成功");
        } else {
            return AjaxResult.error("删除车辆失败");
        }
    }
}


