<?php

namespace App\Models;

use Illuminate\Support\Str;
use App\Models\BaseModel;
use App\Scopes\CompanyScope;

class Vendor extends BaseModel
{
    protected $table = 'vendors';

    protected $guarded = ['id', 'created_at', 'updated_at'];

    protected $hidden = ['id'];

    protected $appends = ['xid'];

    protected $filterable = [
        'agency_name',
        'agency_code',
        'email',
        'phone',
        'status',
        'city'
    ];

    protected $casts = [
        'service_categories' => 'array',
    ];

    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope(new CompanyScope);
    }

    protected static function booted()
    {
        static::creating(function (Vendor $vendor) {

            // Auto set company_id
            if (empty($vendor->company_id) && user()) {
                $vendor->company_id = user()->company_id;
            }

            // Auto generate agency_code
            if (empty($vendor->agency_code)) {
                $vendor->generateAgencyCode();
            }
        });
    }

    /**
     * Generate agency_code safely
     */
    protected function generateAgencyCode(): void
    {
        if (empty($this->agency_name)) {
            return;
        }

        $prefix = strtoupper(
            Str::substr(preg_replace('/\s+/', '', $this->agency_name), 0, 3)
        );

        $lastCode = self::where('company_id', $this->company_id)
            ->where('agency_code', 'like', "{$prefix}VEN%")
            ->orderBy('agency_code', 'desc')
            ->value('agency_code');

        $nextNumber = '001';

        if ($lastCode) {
            $lastNumber = (int) substr($lastCode, -3);
            $nextNumber = str_pad($lastNumber + 1, 3, '0', STR_PAD_LEFT);
        }

        $this->agency_code = "{$prefix}VEN{$nextNumber}";
    }
}
