<?php namespace App\Controllers;
/**
 * Class Analytics
 * Creates Analytics controller
 * @copyright  2020 Podlibre
 * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
 * @link       https://castopod.org/
 */

use CodeIgniter\Controller;

class Analytics extends Controller
{
    function __construct()
    {
        $session = \Config\Services::session();
        $session->start();
        $db = \Config\Database::connect();
        $country = 'N/A';

        // Finds country:
        if (!$session->has('country')) {
            try {
                $reader = new \GeoIp2\Database\Reader(
                    WRITEPATH . 'uploads/GeoLite2-Country/GeoLite2-Country.mmdb'
                );
                $geoip = $reader->country($_SERVER['REMOTE_ADDR']);
                $country = $geoip->country->isoCode;
            } catch (\Exception $e) {
                // If things go wrong the show must go on and the user must be able to download the file
            }
            $session->set('country', $country);
        }

        // Finds player:
        if (!$session->has('player')) {
            $playerName = '-unknown-';
            $error = '';

            try {
                $useragent = $_SERVER['HTTP_USER_AGENT'];
                $jsonUserAgents = json_decode(
                    file_get_contents(
                        WRITEPATH . 'uploads/user-agents/src/user-agents.json'
                    ),
                    true
                );

                //Search for current HTTP_USER_AGENT in json file:
                foreach ($jsonUserAgents as $player) {
                    foreach ($player['user_agents'] as $useragentsRegexp) {
                        //Does the HTTP_USER_AGENT match this regexp:
                        if (preg_match("#{$useragentsRegexp}#", $useragent)) {
                            if (isset($player['bot'])) {
                                //It’s a bot!
                                $playerName = '-bot-';
                            } else {
                                //It isn’t a bot, we store device/os/app:
                                $playerName =
                                    (isset($player['device'])
                                        ? $player['device'] . '/'
                                        : '') .
                                    (isset($player['os'])
                                        ? $player['os'] . '/'
                                        : '') .
                                    (isset($player['app'])
                                        ? $player['app']
                                        : '?');
                            }
                            //We found it!
                            break 2;
                        }
                    }
                }
            } catch (\Exception $e) {
                // If things go wrong the show must go on and the user must be able to download the file
            }
            if ($playerName == '-unknown-') {
                // Add to unknown list
                try {
                    $procedureNameAUU = $db->prefixTable(
                        'analytics_unknown_useragents'
                    );
                    $db->query("CALL $procedureNameAUU(?)", [$useragent]);
                } catch (\Exception $e) {
                    // If things go wrong the show must go on and the user must be able to download the file
                }
            }
            $session->set('player', $playerName);
        }
    }

    // Add one hit to this episode:
    public function hit($p_podcast_id, $p_episode_id, ...$filename)
    {
        $session = \Config\Services::session();
        $db = \Config\Database::connect();
        $procedureName = $db->prefixTable('analytics_podcasts');
        $p_country_code = $session->get('country');
        $p_player = $session->get('player');
        try {
            $db->query("CALL $procedureName(?,?,?,?);", [
                $p_podcast_id,
                $p_episode_id,
                $p_country_code,
                $p_player,
            ]);
        } catch (\Exception $e) {
            // If things go wrong the show must go on and the user must be able to download the file
        }
        return redirect()->to(media_url(implode('/', $filename)));
    }
}