<?php

namespace App\Models;

use Database\Factories\PromptLandingPageLeadFactory;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;

#[Fillable([
    'prompt_landing_page_id', 'page_load_id', 'payload', 'query_params', 'ip', 'user_agent',
])]
class PromptLandingPageLead extends Model
{
    /** @use HasFactory<PromptLandingPageLeadFactory> */
    use HasFactory;

    /**
     * @return array<string, string>
     */
    protected function casts(): array
    {
        return [
            'payload' => 'array',
            'query_params' => 'array',
        ];
    }

    /**
     * @param  Builder<self>  $query
     * @return Builder<self>
     */
    #[Scope]
    protected function submitted(Builder $query): Builder
    {
        return $query
            ->whereNotNull('payload')
            ->whereRaw("cast(payload as char) not in ('[]', '{}')");
    }

    /**
     * @param  Builder<self>  $query
     * @return Builder<self>
     */
    #[Scope]
    protected function pageViews(Builder $query): Builder
    {
        return $query->where(function (Builder $query): void {
            $query->whereNull('payload')
                ->orWhereRaw("cast(payload as char) in ('[]', '{}')");
        });
    }

    public function page(): BelongsTo
    {
        return $this->belongsTo(PromptLandingPage::class, 'prompt_landing_page_id');
    }

    public function clickouts(): HasMany
    {
        return $this->hasMany(PromptLandingPageClickout::class);
    }

    public function payloadField(string $key): string
    {
        if (! is_array($this->payload) || ! array_key_exists($key, $this->payload)) {
            return '';
        }

        $value = $this->payload[$key];

        if (is_string($value)) {
            return $value;
        }

        $encoded = json_encode($value, JSON_UNESCAPED_UNICODE);

        return is_string($encoded) ? $encoded : '';
    }

    public function queryParamsSummary(): string
    {
        if (! is_array($this->query_params) || $this->query_params === []) {
            return '';
        }

        $parts = [];

        foreach ($this->query_params as $key => $value) {
            $parts[] = $key.'='.(is_scalar($value) ? (string) $value : (string) json_encode($value, JSON_UNESCAPED_UNICODE));
        }

        return implode(', ', $parts);
    }
}
