<?php
declare(strict_types=1);

namespace Celena\Plugin\Analytics\Support;

use Celena\Core\Database\Connection;

/**
 * Доступ к настраиваемым целям аналитики (cl_analytics_goals).
 * Единая точка для контроллеров, трекера и подписи событий в дашборде.
 * Все запросы — через портируемый query builder (MySQL + PostgreSQL).
 */
final class GoalsRepo
{
    public const TYPES = ['selector_click', 'url_visit', 'form_submit', 'custom_event'];

    public function __construct(private readonly Connection $conn)
    {
    }

    /** @return array<int, array<string, mixed>> Все цели по порядку. */
    public function all(): array
    {
        return $this->conn->builder('analytics_goals')
            ->orderBy('sort_order', 'asc')->orderBy('id', 'asc')->get();
    }

    /** @return array<int, array<string, mixed>> Только активные цели. */
    public function active(): array
    {
        return $this->conn->builder('analytics_goals')
            ->where('active', '=', 1)
            ->orderBy('sort_order', 'asc')->orderBy('id', 'asc')->get();
    }

    public function find(int $id): ?array
    {
        return $this->conn->builder('analytics_goals')->where('id', '=', $id)->first();
    }

    public function findBySlug(string $slug): ?array
    {
        return $this->conn->builder('analytics_goals')->where('slug', '=', $slug)->first();
    }

    /** Карта slug → название (заменяет захардкоженный const EVT). */
    public function labelMap(): array
    {
        $map = [];
        foreach ($this->all() as $g) {
            $map[(string) $g['slug']] = (string) $g['name'];
        }
        return $map;
    }

    /**
     * Конфиг для трекера: только активные цели в компактном виде.
     * @return array<int, array{slug:string,type:string,match:string,value:float}>
     */
    public function forTracker(): array
    {
        $out = [];
        foreach ($this->active() as $g) {
            $out[] = [
                'slug'  => (string) $g['slug'],
                'type'  => (string) $g['type'],
                'match' => (string) ($g['match_value'] ?? ''),
                'value' => (float) ($g['value_eur'] ?? 0),
            ];
        }
        return $out;
    }

    /** Карта slug → ценность цели в €. */
    public function valueMap(): array
    {
        $map = [];
        foreach ($this->all() as $g) {
            $map[(string) $g['slug']] = (float) ($g['value_eur'] ?? 0);
        }
        return $map;
    }

    public function create(array $data): string
    {
        return $this->conn->builder('analytics_goals')->insert($data);
    }

    public function update(int $id, array $data): void
    {
        $this->conn->builder('analytics_goals')->where('id', '=', $id)->update($data);
    }

    public function delete(int $id): void
    {
        $this->conn->builder('analytics_goals')->where('id', '=', $id)->delete();
    }

    /** Уникальный slug на основе имени; при коллизии добавляем суффикс. */
    public function uniqueSlug(string $base, int $ignoreId = 0): string
    {
        $base = $base !== '' ? $base : 'goal';
        $slug = $base;
        $i = 2;
        while (true) {
            $row = $this->findBySlug($slug);
            if ($row === null || (int) $row['id'] === $ignoreId) {
                return $slug;
            }
            $slug = $base . '-' . $i;
            $i++;
        }
    }
}
