<?php

declare(strict_types=1);

namespace Kylin\Agriculture\Models;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use InvalidArgumentException;

/**
 * 农药使用记录模型
 *
 * 记录农药喷洒信息，包括农药名称、用量、安全间隔期等。
 *
 * 依据《农药管理条例》第二十七条，农药使用者应建立农药使用记录。
 * 依据《农药管理条例》第三十四条，严格执行农药安全间隔期。
 *
 * @property string $pesticide       农药名称
 * @property float  $dosage          用量
 * @property string $safe_until      安全间隔期截止日期
 */
class PesticideRecord extends Model
{
    protected $table = 'kylin_agri_pesticide_records';

    protected $fillable = [
        'plot_id',
        'pest_record_id',
        'pesticide',
        'dosage',
        'area',
        'safety_interval',
        'safe_until',
        'operator_id',
        'applied_at',
    ];

    protected function casts(): array
    {
        return [
            'dosage' => 'decimal:2',
            'area' => 'decimal:2',
            'safety_interval' => 'integer',
            'safe_until' => 'date',
            'applied_at' => 'datetime',
        ];
    }

    /**
     * 模型启动引导
     *
     * 依据《农药管理条例》：
     * - 保存前校验禁用农药
     * - 自动计算安全间隔期截止日期
     */
    protected static function booted(): void
    {
        static::saving(function (self $record) {
            // 校验禁用农药
            $record->validateNoBannedPesticide();

            // 自动计算安全间隔期
            if ($record->isDirty('applied_at') || $record->isDirty('safety_interval')) {
                $record->calculateSafeUntil();
            }
        });
    }

    /**
     * 校验是否为禁用农药
     *
     * 依据《农药管理条例》第二十七条，不得使用国家明令禁止的农药。
     *
     * @throws InvalidArgumentException
     */
    protected function validateNoBannedPesticide(): void
    {
        $bannedList = config('kylin-agriculture.banned_pesticides', []);

        if (empty($bannedList) || empty($this->pesticide)) {
            return;
        }

        foreach ($bannedList as $banned) {
            if (mb_strpos($this->pesticide, $banned) !== false) {
                throw new InvalidArgumentException(
                    sprintf('依据《农药管理条例》，农药 "%s" 已被国家明令禁止使用，不得使用。', $this->pesticide)
                );
            }
        }
    }

    /**
     * 自动计算安全间隔期截止日期
     *
     * 依据《农药管理条例》第三十四条，严格执行农药安全间隔期。
     * safe_until = applied_at + safety_interval 天
     */
    protected function calculateSafeUntil(): void
    {
        $appliedAt = $this->applied_at instanceof Carbon
            ? $this->applied_at
            : Carbon::parse($this->applied_at);

        $interval = $this->safety_interval
            ?? config('kylin-agriculture.default_safety_interval_days', 7);

        $this->safe_until = $appliedAt->copy()->addDays((int) $interval);
    }

    /**
     * 判断是否已过安全间隔期
     */
    public function isSafeIntervalPassed(): bool
    {
        if (! $this->safe_until) {
            return false;
        }

        return Carbon::parse($this->safe_until)->isPast();
    }

    public function plot(): BelongsTo
    {
        return $this->belongsTo(Plot::class);
    }

    public function pestRecord(): BelongsTo
    {
        return $this->belongsTo(PestRecord::class);
    }

    public function operator(): BelongsTo
    {
        return $this->belongsTo(config('auth.providers.users.model'), 'operator_id');
    }
}
