<?php

namespace App\Services\AgentSettlement;

use Illuminate\Support\Facades\DB;

/** 账期全部账单结清或核销后标记为 completed（§4）。 */
final class AgentSettlementPeriodCompletionService
{
    public function syncIfReady(int $periodId): void
    {
        if ($periodId <= 0) {
            return;
        }

        $period = DB::table('settlement_periods')->where('id', $periodId)->first();
        if ($period === null || (string) $period->status !== 'closed') {
            return;
        }

        if ($this->hasOpenSettlementWork($periodId)) {
            return;
        }

        DB::table('settlement_periods')
            ->where('id', $periodId)
            ->update([
                'status' => 'completed',
                'updated_at' => now(),
            ]);
    }

    public function isPeriodReadOnly(int $periodId): bool
    {
        if ($periodId <= 0) {
            return false;
        }

        $status = DB::table('settlement_periods')->where('id', $periodId)->value('status');

        return $status !== null && (string) $status === 'completed';
    }

    private function hasOpenSettlementWork(int $periodId): bool
    {
        return DB::table('settlement_bills')
            ->where('settlement_period_id', $periodId)
            ->whereNotIn('bill_type', ['bad_debt'])
            ->where(function ($query): void {
                $query->where('status', 'pending_confirm')
                    ->orWhere(function ($inner): void {
                        $inner->whereIn('status', ['confirmed', 'partial_paid', 'overdue'])
                            ->where('unpaid_amount', '>', 0);
                    });
            })
            ->exists();
    }
}
