package shop.alien.store.controller;

import io.swagger.annotations.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import shop.alien.entity.result.R;
import shop.alien.entity.store.dto.StoreBookingBusinessHoursDTO;
import shop.alien.entity.store.dto.StoreBookingSettingsDTO;
import shop.alien.store.service.StoreBookingSettingsService;

/**
 * 预订服务信息设置 前端控制器
 *
 * @author system
 * @since 2025-01-XX
 */
@Slf4j
@Api(tags = {"预订服务-信息设置"})
@ApiSort(17)
@CrossOrigin
@RestController
@RequestMapping("/store/booking/settings")
@RequiredArgsConstructor
public class StoreBookingSettingsController {

    private final StoreBookingSettingsService storeBookingSettingsService;

    @ApiOperationSupport(order = 1)
    @ApiOperation("查询预订服务信息设置（包含营业时间）")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "storeId", value = "门店ID", dataType = "Integer", paramType = "query", required = true)
    })
    @GetMapping("/detail")
    public R<StoreBookingSettingsDTO> getSettings(@RequestParam Integer storeId) {
        log.info("StoreBookingSettingsController.getSettings?storeId={}", storeId);
        
        if (storeId == null) {
            return R.fail("门店ID不能为空");
        }
        
        try {
            StoreBookingSettingsDTO dto = storeBookingSettingsService.getSettingsWithBusinessHoursByStoreId(storeId);
            if (dto == null) {
                return R.fail("未找到该门店的预订服务信息设置");
            }
            return R.data(dto);
        } catch (Exception e) {
            log.error("查询预订服务信息设置失败", e);
            return R.fail("查询失败：" + e.getMessage());
        }
    }

    @ApiOperationSupport(order = 2)
    @ApiOperation("保存预订服务信息设置（新增或更新，包含营业时间）")
    @PostMapping("/save")
    public R<String> saveSettings(@RequestBody StoreBookingSettingsDTO dto) {
        log.info("StoreBookingSettingsController.saveSettings?dto={}", dto);
        
        // 参数验证
        if (dto.getStoreId() == null) {
            return R.fail("门店ID不能为空");
        }
        if (dto.getRetainPositionFlag() == null) {
            return R.fail("未按时到店是否保留位置不能为空");
        }
        if (dto.getBookingDateDisplayDays() == null || dto.getBookingDateDisplayDays() <= 0) {
            return R.fail("预订日期显示天数必须大于0");
        }
        if (dto.getMaxCapacityPerSlot() == null || dto.getMaxCapacityPerSlot() <= 0) {
            return R.fail("单时段最大容纳人数必须大于0");
        }
        
        // 验证预订相关字段
        // 如果选择付费（reservation=1），必须填写预订金额
        if (StringUtils.hasText(dto.getReservation()) && "1".equals(dto.getReservation())) {
            if (dto.getReservationMoney() == null || dto.getReservationMoney() < 0) {
                return R.fail("选择付费时必须填写预订金额，且金额不能小于0");
            }
        }
        
        // 验证取消预订退费时长设置
        if (dto.getOffUnsubscribeHours() == null || dto.getOffUnsubscribeHours() < 0) {
            return R.fail("取消预订退费时长设置必须大于等于0");
        }
        
        // 验证营业时间结束前不可预订时间
        if (dto.getBookingNotAvailableTime() == null || dto.getBookingNotAvailableTime() < 0) {
            return R.fail("营业时间结束前不可预订时间必须大于等于0");
        }
        
        // 如果选择非全天，必须填写开始时间和结束时间
//        if (dto.getBookingTimeType() != null && dto.getBookingTimeType() == 0) {
//            if (!StringUtils.hasText(dto.getBookingStartTime())) {
//                return R.fail("非全天时必须填写开始时间");
//            }
//            if (!StringUtils.hasText(dto.getBookingEndTime())) {
//                return R.fail("非全天时必须填写结束时间");
//            }
//        }
        
        // 验证正常营业时间
//        if (dto.getNormalBusinessHours() != null) {
//            StoreBookingBusinessHoursDTO normalHours = dto.getNormalBusinessHours();
//            if (normalHours.getBookingTimeType() == null) {
//                return R.fail("正常营业时间的预订时间类型不能为空");
//            }
//            if (normalHours.getBookingTimeType() == 0) {
//                if (!StringUtils.hasText(normalHours.getStartTime())) {
//                    return R.fail("正常营业时间非全天时必须填写开始时间");
//                }
//                if (!StringUtils.hasText(normalHours.getEndTime())) {
//                    return R.fail("正常营业时间非全天时必须填写结束时间");
//                }
//            }
//        }
        
        // 验证特殊营业时间列表
//        if (dto.getSpecialBusinessHoursList() != null && !dto.getSpecialBusinessHoursList().isEmpty()) {
//            for (StoreBookingBusinessHoursDTO specialHours : dto.getSpecialBusinessHoursList()) {
//                if (specialHours.getBookingTimeType() == null) {
//                    return R.fail("特殊营业时间的预订时间类型不能为空");
//                }
//                if (specialHours.getBookingTimeType() == 0) {
//                    if (!StringUtils.hasText(specialHours.getStartTime())) {
//                        return R.fail("特殊营业时间非全天时必须填写开始时间");
//                    }
//                    if (!StringUtils.hasText(specialHours.getEndTime())) {
//                        return R.fail("特殊营业时间非全天时必须填写结束时间");
//                    }
//                }
//            }
//        }
        
        // 编辑校验：如果是编辑操作，检查正常营业时间的id是否有值
        // 注意：特殊营业时间列表中的项可以部分有id（编辑）部分没有id（新增）
        if (dto.getId() != null) {
            // 检查正常营业时间：编辑模式下，如果提供了正常营业时间，必须提供id
            if (dto.getNormalBusinessHours() != null && dto.getNormalBusinessHours().getId() == null) {
                return R.fail("编辑模式下，正常营业时间必须提供id");
            }
        }
        
        try {
            // 使用新的方法保存设置和营业时间
            boolean result = storeBookingSettingsService.saveSettingsWithBusinessHours(dto);
            if (result) {
                return R.success("保存成功");
            } else {
                return R.fail("保存失败");
            }
        } catch (Exception e) {
            log.error("保存预订服务信息设置失败", e);
            return R.fail("保存失败：" + e.getMessage());
        }
    }
}
