<?php
require_once __DIR__ . '/../dbPDO.php';

class arbTracking
{
    private $db;

    public function __construct()
    {
        $this->db = CommonPDOConnector::connect('ConnectToWhale');
    }

    public function handle($action, $data)
    {
        switch ($action) {
            case 'start':
                return $this->startSession($data);
            case 'event':
                return $this->trackEvent($data);
            case 'end': // 🔥 updated
                return $this->endSession($data);
            default:
                return ['status' => 'invalid_action'];
        }
    }

    /* =========================
       START SESSION
    ========================= */
    public function startSession($d)
    {
        $sql = "INSERT INTO trk_sessions 
        (session_id, source, campaign_id, adset_id, creative_id, tag,
         ip, user_agent, platform, is_bot, url,device_type, created_at)

        VALUES 
        (:sid, :source, :cid, :adset, :creative, :tag,
         :ip, :ua, :platform, :is_bot, :url, :device_type, NOW())

        ON DUPLICATE KEY UPDATE
            source = VALUES(source),
            campaign_id = VALUES(campaign_id),
            adset_id = VALUES(adset_id),
            creative_id = VALUES(creative_id),
            tag = VALUES(tag),
            ip = VALUES(ip),
            user_agent = VALUES(user_agent),
            platform = VALUES(platform),
            is_bot = VALUES(is_bot),
            url = VALUES(url)";

        $stmt = $this->db->prepare($sql);

        $stmt->execute([
            ':sid'      => $d['session_id'],
            ':source'   => $d['source'] ?? 'unknown',
            ':cid'      => $d['campaign_id'] ?? null,
            ':adset'    => $d['adset_id'] ?? null,
            ':creative' => $d['creative_id'] ?? null,
            ':tag'      => $d['tag'] ?? 'testing',

            ':ip'       => $d['ip'],
            ':ua'       => $d['user_agent'],
            ':platform' => $d['platform'] ?? '',
            ':is_bot'   => $d['is_bot'] ?? 0,
            ':url'      => $d['url'] ?? '',
            ':device_type'=>$d['device_type']
        ]);

        return ['status' => 'session_started'];
    }

    /* =========================
       EVENT TRACKING
    ========================= */
    public function trackEvent($d)
    {
        $sql = "INSERT INTO trk_events 
        (session_id, event_type, event_data, event_time, ip)
        VALUES (:sid, :event, :data, :time, :ip)";

        $stmt = $this->db->prepare($sql);

        $stmt->execute([
            ':sid'   => $d['session_id'],
            ':event' => $d['event_type'],
            ':data'  => $d['event_data'] ?? json_encode($d),
            ':time'  => $d['event_time'] ?? date('Y-m-d H:i:s'),
            ':ip'    => $d['ip'] ?? null
        ]);

        return ['status' => 'event_tracked'];
    }

    /* =========================
       END SESSION (FINAL)
    ========================= */
    public function endSession($d)
    {
        // prevent double end
        $stmt = $this->db->prepare("
            SELECT engagement_time, total_clicks, user_agent, ended_at
            FROM trk_sessions
            WHERE session_id = :sid
            LIMIT 1
        ");

        $stmt->execute([':sid' => $d['session_id']]);
        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$row) return ['status' => 'not_found'];

        // already ended → ignore
        if (!empty($row['ended_at'])) {
            return ['status' => 'already_ended'];
        }

        $engagement = max((int)$row['engagement_time'], (int)$d['engagement_time']);
        $clicks     = max((int)$row['total_clicks'], (int)$d['total_clicks']);

        $ivt = $this->calculateIVT($row['user_agent'], $engagement, $clicks);

        $sql = "UPDATE trk_sessions 
        SET 
            engagement_time = :eng,
            total_clicks = :clk,
            ivt_score = :ivt,
            end_reason = :reason,
            ended_at = NOW()
        WHERE session_id = :sid";

        $stmt = $this->db->prepare($sql);

        $stmt->execute([
            ':eng'    => $engagement,
            ':clk'    => $clicks,
            ':ivt'    => $ivt,
            ':reason' => $d['end_reason'] ?? 'exit',
            ':sid'    => $d['session_id']
        ]);

        return ['status' => 'session_ended'];
    }

    /* =========================
       IVT SCORE
    ========================= */
    public function calculateIVT($ua, $engagement, $clicks)
    {
        $bot = (stripos($ua, 'bot') !== false) ? 100 : 0;
        $eng = ($engagement < 3) ? 100 : (($engagement < 10) ? 60 : 0);
        $clk = ($clicks == 0) ? 80 : (($clicks == 1) ? 40 : 0);

        return round(
            ($bot * 0.4) +
            ($eng * 0.25) +
            ($clk * 0.35),
            2
        );
    }
    
}