package com.hrs.service.impl;

import com.hrs.dao.HouseDao;
import com.hrs.dao.OrderDao;
import com.hrs.dao.impl.HouseDaoImpl;
import com.hrs.dao.impl.OrderDaoImpl;
import com.hrs.model.entity.House;
import com.hrs.model.entity.Order;
import com.hrs.service.OrderService;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**   
* Copyright: Copyright (c) 2026 chinasofti
* 
* @ClassName: OrderServiceImpl.java
* @Description: 订单业务逻辑实现类
*
* @version: v1.0.0
* @author: 黄红
* @date: 2026年4月13日 上午10:09:00 
*
* Modification History:
* Date         Author          Version            Description
*---------------------------------------------------------*
* 2026年4月13日     黄红           v1.0.0               新建文件
*/
public class OrderServiceImpl implements OrderService {

    private OrderDao orderDao = new OrderDaoImpl();
    private HouseDao houseDao = new HouseDaoImpl();

    /**
     * 创建订单
     */
    @Override
    public CreateOrderResult createOrder(Long tenantId, Long houseId, Date startDate, Date endDate) {
        CreateOrderResult result = new CreateOrderResult();

        // 1. 参数校验
        if (tenantId == null || tenantId <= 0) {
            result.setSuccess(false);
            result.setMessage("用户未登录");
            return result;
        }

        if (houseId == null || houseId <= 0) {
            result.setSuccess(false);
            result.setMessage("房源信息错误");
            return result;
        }

        if (startDate == null || endDate == null) {
            result.setSuccess(false);
            result.setMessage("请选择租赁时间");
            return result;
        }

        // 2. 检查房源是否存在且已上架
        House house = houseDao.findById(houseId);
        if (house == null) {
            result.setSuccess(false);
            result.setMessage("房源不存在");
            return result;
        }

        if (!"1".equals(house.getStatus())) {
            result.setSuccess(false);
            result.setMessage("房源已下架，无法下单");
            return result;
        }

        // 3. 日期校验
        Date now = new Date();
        if (startDate.before(now)) {
            result.setSuccess(false);
            result.setMessage("租赁开始日期不能早于今天");
            return result;
        }

        if (endDate.before(startDate)) {
            result.setSuccess(false);
            result.setMessage("结束日期不能早于开始日期");
            return result;
        }

        // 4. 计算天数和总租金
        long diff = endDate.getTime() - startDate.getTime();
        int days = (int) TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
        if (days <= 0) {
            days = 1;
        }

        // 按比例计算租金
        BigDecimal monthlyRent = house.getRentPrice();
        BigDecimal dailyRent = monthlyRent.divide(BigDecimal.valueOf(30), 2, BigDecimal.ROUND_HALF_UP);
        BigDecimal totalRent = dailyRent.multiply(BigDecimal.valueOf(days)).setScale(2, BigDecimal.ROUND_HALF_UP);

        // 5. 生成订单编号
        String orderNo = generateOrderNo();

        // 6. 创建订单
        Order order = new Order();
        order.setTenantId(tenantId);
        order.setHouseId(houseId);
        order.setOrderNo(orderNo);
        order.setRentStartTime(startDate);
        order.setRentEndTime(endDate);
        order.setTotalRent(totalRent);
        order.setPayStatus("0");  // 待支付
        order.setStatus("0");      // 待签约

        boolean success = orderDao.add(order);

        result.setSuccess(success);
        result.setMessage(success ? "订单创建成功，请完成支付" : "订单创建失败，请稍后重试");
        if (success) {
            result.setOrderId(order.getId());
            result.setOrderNo(orderNo);
            result.setTotalRent(totalRent);
        }

        return result;
    }

    /**
     * 模拟支付
     */
    @Override
    public boolean payOrder(Long orderId, Long tenantId) {
        if (orderId == null || tenantId == null) {
            return false;
        }

        Order order = orderDao.findById(orderId);
        if (order == null || !order.getTenantId().equals(tenantId)) {
            return false;
        }

        // 只有待支付的订单可以支付
        if (!"0".equals(order.getPayStatus())) {
            return false;
        }

        return orderDao.updatePayStatus(orderId, "1");
    }

    /**
     * 取消订单（租客）
     */
    @Override
    public boolean cancelOrder(Long orderId, Long tenantId) {
        if (orderId == null || tenantId == null) {
            return false;
        }

        Order order = orderDao.findById(orderId);
        if (order == null || !order.getTenantId().equals(tenantId)) {
            return false;
        }

        // 只有待支付的订单可以取消
        if (!"0".equals(order.getPayStatus())) {
            return false;
        }

        return orderDao.updateStatus(orderId, "3"); // 3-已取消
    }

    /**
     * 获取租客订单列表
     */
    @Override
    public List<Order> getTenantOrders(Long tenantId) {
        if (tenantId == null || tenantId <= 0) {
            return null;
        }
        return orderDao.findByTenantId(tenantId);
    }

    /**
     * 获取房东订单列表
     */
    @Override
    public List<Order> getLandlordOrders(Long landlordId) {
        if (landlordId == null || landlordId <= 0) {
            return null;
        }
        return orderDao.findByLandlordId(landlordId);
    }

    /**
     * 获取所有订单（管理员）
     */
    @Override
    public List<Order> getAllOrders() {
        return orderDao.findAll();
    }

    /**
     * 获取订单详情
     */
    @Override
    public Order getOrderDetail(Long orderId) {
        if (orderId == null || orderId <= 0) {
            return null;
        }
        return orderDao.findById(orderId);
    }

    /**
     * 统计租客订单数量
     */
    @Override
    public int getTenantOrderCount(Long tenantId) {
        if (tenantId == null || tenantId <= 0) {
            return 0;
        }
        return orderDao.countByTenantId(tenantId);
    }

    /**
     * 统计所有订单数量
     */
    @Override
    public int getAllOrderCount() {
        return orderDao.countAll();
    }

    /**
     * 生成订单编号
     */
    private String generateOrderNo() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        return "ORD" + sdf.format(new Date());
    }
}
