<?php

namespace App\Models\Tenant;

use App\Models\Concerns\BelongsToTenant;
use App\Models\Concerns\Auditable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;

class Lead extends Model
{
    use Auditable, BelongsToTenant, SoftDeletes;

    public const STATUSES = [
        'new' => 'Nou',
        'contacted' => 'Contactat',
        'no_answer' => 'Fără răspuns',
        'scheduled' => 'Programat',
        'converted' => 'Convertit',
        'lost' => 'Pierdut',
    ];

    public const SOURCES = [
        'manual' => 'Manual',
        'call' => 'Apel',
        'site' => 'Site',
        'telegram' => 'Telegram',
        'whatsapp' => 'WhatsApp',
        'viber' => 'Viber',
        'facebook' => 'Facebook',
        'instagram' => 'Instagram',
        'tiktok' => 'TikTok',
        'google' => 'Google',
        'google_maps' => 'Google Maps',
        'seo' => 'SEO',
        'recommend' => 'Recomandare',
    ];

    protected $fillable = [
        'company_id', 'client_id', 'vehicle_id',
        'name', 'phone', 'email', 'car', 'model', 'message',
        'source', 'marketing_channel',
        'utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',
        'status', 'budget', 'assigned_to', 'deal_id',
        'contacted_at', 'converted_at', 'notes',
    ];

    protected $casts = [
        'budget' => 'decimal:2',
        'contacted_at' => 'datetime',
        'converted_at' => 'datetime',
    ];

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

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

    public function assignedTo(): BelongsTo
    {
        return $this->belongsTo(User::class, 'assigned_to');
    }

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

    /** Convert lead → client + deal (idempotent if already converted). */
    public function convert(?array $dealAttrs = null): Deal
    {
        if ($this->deal_id) {
            return $this->deal;
        }

        $client = $this->client_id
            ? $this->client
            : Client::firstOrCreate(
                ['company_id' => $this->company_id, 'phone' => $this->phone],
                ['type' => 'individual', 'name' => $this->name, 'email' => $this->email, 'source' => $this->source]
            );

        $deal = Deal::create(array_merge([
            'company_id' => $this->company_id,
            'client_id' => $client->id,
            'name' => trim(($this->car ?? '') . ' ' . ($this->model ?? '')) ?: $this->name,
            'price' => $this->budget,
            'stage' => 'new',
            'source' => $this->source,
            'note' => $this->message,
            'assigned_to' => $this->assigned_to,
        ], $dealAttrs ?? []));

        $this->update([
            'client_id' => $client->id,
            'deal_id' => $deal->id,
            'status' => 'converted',
            'converted_at' => now(),
        ]);

        return $deal;
    }
}
