<?php

declare (strict_types = 1);

namespace App\Task;

use App\Model\Ad;
use App\Model\Order;
use App\Model\OrderAd;
use Hyperf\Contract\StdoutLoggerInterface;
use Hyperf\DbConnection\Db;
use Hyperf\Di\Annotation\Inject;
use Psr\Log\LoggerInterface;

class EndOrderAdminTask
{
    /**
     * @Inject
     * @var StdoutLoggerInterface
     */
    private $logger;
    public function __construct(LoggerInterface $logger)
    {
        date_default_timezone_set('Asia/Shanghai');
        $this->logger = $logger;
    }
    public function __invoke()
    {

        // 获取需要处理的订单ID列表  判断是否能够结束
        $currentTime = date('Y-m-d H:i:s');
        $orderIds = Order::where('status', 1) //已经审核,等待结束
            ->where('edtime', '<=', $currentTime)
            ->pluck('id')
            ->toArray();
        //获取需要处理的订单id,判断是否生效
        $orderIdsTO2 = Order::where('status', 1) //已经审核,等待开始
            ->where('sttime', '<=', $currentTime)
            ->where('edtime', '>=', $currentTime)
            ->pluck('id')
            ->toArray();

        //单个处理
        // foreach ($orderIds as $orderId) {
        //     $data = ['id' => $orderId];
        //     $this->singleOverOrder($data);
        // }
        // 批量处理结束订单
        if ($orderIds) {
            $this->logger->info('需要处理结束单ID列表:' . implode(', ', $orderIds));
            $this->OverOder($orderIds);
        }
        if ($orderIdsTO2) {
            $this->logger->info('需要处理开始单ID列表:' . implode(', ', $orderIdsTO2));
            $this->startOder($orderIdsTO2);
        }
        //过期时间
        //$exploredTime = date('Y-m-d H:i:s', (time() + 60 * 60 * 2));
        // 获取所有状态为6的订单
        $orders = Order::where('status', 6) // 未审核等待过期
            ->get();
        $expiredOrderIds = [];
        foreach ($orders as $order) {
            // 计算 created_at + 24小时
            $exploredTime = date('Y-m-d H:i:s', strtotime($order->created_at . ' +24 hours'));
            $this->logger->info('exploredTime: ' . $exploredTime . ' 当前时间' . $order->created_at);
            // 检查当前时间是否大于 exploredTime
            if (time() > strtotime($exploredTime)) {
                $expiredOrderIds[] = $order->id;
            }
        }
        if ($expiredOrderIds) {
            $this->logger->info('需要处理过期的订单ID列表:' . implode(', ', $expiredOrderIds));
            //单个处理
            // 获取需要处理的订单ID列表  判断是否能够过期
            $this->ExpiredOrder($expiredOrderIds);
        }
    }
    /**
     * 处理单个订单是否结束
     */
    private function singleOverOrder(array $data)
    {
        $order = Order::where('id', $data['id'])->first();
        if (empty($order)) {
            $this->logger->warning("没有找到订单ID: {$data['id']}");
            return;
        }
        Db::beginTransaction();
        try {
            $order->status = 7;
            $order->ad_status = 7;
            $order->save();
            //获取 order_ad 表中的记录
            $orderAds = OrderAd::where('order_id', $data['id'])->get();
            if ($orderAds->isEmpty()) {
                $this->logger->warning("没有找到订单ID: {$data['id']} 的 order_ad 记录");
                return;
            }
            //获取 order_ad 表中的记录
            OrderAd::where('order_id', $data['id'])
                ->update(['status' => 7]);
            //在ad表中删除的数据
            Ad::where('order_id', $data['id'])->delete();
            Db::commit();
        } catch (\Exception $e) {
            Db::rollBack();
            $this->logger->error("处理订单ID: {$data['id']} 时发生错误: " . $e->getMessage());
        }
    }
    private function startOder(array $data): void
    {
        Db::beginTransaction();
        try {
            //ad 变更状态为已经审核但是不生效,或者删除订单,或者加入别的状态:比如过期
            Order::whereIn('id', $data)->update(['status' => 1, 'ad_status' => 8]);
            OrderAd::whereIn('order_id', $data)->update(['status' => 1]);
            $pid = OrderAd::whereIn('order_id', $data)->pluck('pid')->toArray();
            Ad::whereIn('pid', $pid)->update(['status' => 1]);
            Db::commit();
        } catch (\Exception $e) {
            Db::rollBack();
            $this->logger->error("处理启用订单ID: {$data['id']} 时发生错误: " . $e->getMessage());
        }
    }
    private function OverOder(array $data): void
    {
        Db::beginTransaction();
        try {
            //设置订单状态
            Order::whereIn('id', $data)->update(['status' => 7, 'ad_status' => 7]);
            //设置广告状态
            OrderAd::whereIn('order_id', $data)->update(['status' => 7]);
            //ad 变更状态为已经审核但是不生效,或者删除订单,或者加入别的状态:比如过期
            $pid = OrderAd::whereIn('order_id', $data)->pluck('pid')->toArray();
            Ad::whereIn('pid', $pid)->update(['status' => 2]);
            Db::commit();
        } catch (\Exception $e) {
            Db::rollBack();
            $this->logger->error("处理结束订单ID: {$data['id']} 时发生错误: " . $e->getMessage());
        }
    }
    private function ExpiredOrder(array $data): void
    {
        Db::beginTransaction();try {
            //设置订单状态
            Order::whereIn('id', $data)->update(['status' => 5, 'ad_status' => 5]);
            //设置广告状态
            OrderAd::whereIn('order_id', $data)->update(['status' => 5]);
            Db::commit();
        } catch (\Exception $e) {
            Db::rollBack();
            $this->logger->error("处理过期订单ID: {$data['id']} 时发生错误: " . $e->getMessage());
        }
    }
}