package vehicle

import (
	"errors"
	"wails-app/internal/dao"
	"wails-app/internal/global"
	"wails-app/internal/model/vehicle/request"
)

type VehicleTypeService struct{}

// CreateVehicleType 创建车辆类型
func (s *VehicleTypeService) CreateVehicleType(req request.VehicleTypeCreate) error {
	var existingType dao.VehicleType
	result := global.GVA_DB.Where("name = ?", req.Name).First(&existingType)
	if result.RowsAffected > 0 {
		return errors.New("车辆类型名称已存在")
	}

	vehicleType := dao.VehicleType{
		Name:    req.Name,
		Remarks: req.Remarks,
	}

	return global.GVA_DB.Create(&vehicleType).Error
}

// UpdateVehicleType 更新车辆类型
func (s *VehicleTypeService) UpdateVehicleType(req request.VehicleTypeUpdate) error {
	var vehicleType dao.VehicleType
	result := global.GVA_DB.First(&vehicleType, req.ID)
	if result.RowsAffected == 0 {
		return errors.New("车辆类型不存在")
	}

	// 禁止编辑系统内置类型
	if vehicleType.IsSystem {
		return errors.New("系统内置类型，不可编辑")
	}

	var existingType dao.VehicleType
	result = global.GVA_DB.Where("name = ? AND id != ?", req.Name, req.ID).First(&existingType)
	if result.RowsAffected > 0 {
		return errors.New("车辆类型名称已被其他类型使用")
	}

	err := global.GVA_DB.Model(&vehicleType).Updates(map[string]interface{}{
		"name":    req.Name,
		"remarks": req.Remarks,
	}).Error

	return err
}

// GetVehicleTypeByID 根据ID获取车辆类型
func (s *VehicleTypeService) GetVehicleTypeByID(id uint) (dao.VehicleType, error) {
	var vehicleType dao.VehicleType
	result := global.GVA_DB.First(&vehicleType, id)
	if result.RowsAffected == 0 {
		return dao.VehicleType{}, errors.New("车辆类型不存在")
	}
	return vehicleType, nil
}

// ListVehicleTypes 获取车辆类型列表
func (s *VehicleTypeService) ListVehicleTypes(req request.VehicleTypeQuery) (int64, []dao.VehicleType, error) {
	var vehicleTypes []dao.VehicleType
	var total int64

	query := global.GVA_DB.Model(&dao.VehicleType{})

	if req.Name != "" {
		query = query.Where("name LIKE ?", "%"+req.Name+"%")
	}

	query.Count(&total)

	offset := (req.Page - 1) * req.PageSize
	result := query.Offset(offset).Limit(req.PageSize).Find(&vehicleTypes)
	if result.Error != nil {
		return 0, nil, result.Error
	}

	return total, vehicleTypes, nil
}

// DeleteVehicleType 删除车辆类型
func (s *VehicleTypeService) DeleteVehicleType(id uint) error {
	var vehicleType dao.VehicleType
	result := global.GVA_DB.First(&vehicleType, id)
	if result.RowsAffected == 0 {
		return errors.New("车辆类型不存在")
	}

	// 禁止删除系统内置类型
	if vehicleType.IsSystem {
		return errors.New("系统内置类型，不可删除")
	}

	var vehicleCount int64
	global.GVA_DB.Model(&dao.Vehicle{}).Where("vehicle_type_id = ?", id).Count(&vehicleCount)
	if vehicleCount > 0 {
		return errors.New("该车辆类型下存在车辆，无法删除")
	}

	var feeConfigCount int64
	global.GVA_DB.Model(&dao.FeeConfig{}).Where("vehicle_type_id = ?", id).Count(&feeConfigCount)
	if feeConfigCount > 0 {
		return errors.New("该车辆类型下存在收费配置，无法删除")
	}

	return global.GVA_DB.Delete(&vehicleType).Error
}

// GetAllVehicleTypes 获取所有车辆类型（用于下拉选择）
func (s *VehicleTypeService) GetAllVehicleTypes() ([]dao.VehicleType, error) {
	var vehicleTypes []dao.VehicleType
	err := global.GVA_DB.Find(&vehicleTypes).Error
	if err != nil {
		return nil, err
	}
	return vehicleTypes, nil
}
