#!/usr/bin/env python3

from pathlib import Path
import shutil
import datetime
import subprocess
import sys

target = Path("/home/pishvivy/social.pishibini.com/engine/fan_analyzer.php")

if not target.is_file():
    print("ERROR: fan_analyzer.php not found")
    sys.exit(1)

text = target.read_text(encoding="utf-8")

if "FAN PERSPECTIVE CONTEXT V1" in text:
    print("Already patched.")
    sys.exit(0)

backup = target.with_name(
    "fan_analyzer.php.backup_perspective_v1_"
    + datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
)

shutil.copy2(target, backup)
print("Backup:", backup)

needle = """    $eventTextParts = [];
"""

replacement = """    /*
    |--------------------------------------------------------------------------
    | FAN PERSPECTIVE CONTEXT V1
    |--------------------------------------------------------------------------
    */

    $eventPayload = [];

    $rawPayload =
        trim(
            (string)(
                $event['raw_payload']
                ??
                ''
            )
        );

    if ($rawPayload !== '') {

        $decodedPayload =
            json_decode(
                $rawPayload,
                true
            );

        if (is_array($decodedPayload)) {
            $eventPayload = $decodedPayload;
        }
    }

    $perspective =
        trim(
            (string)(
                $eventPayload['perspective']
                ??
                ''
            )
        );

    $eventTeamName =
        trim(
            (string)(
                $eventPayload['event_team_name']
                ??
                ''
            )
        );

    $eventPlayerName =
        trim(
            (string)(
                $eventPayload['player_name']
                ??
                ''
            )
        );

    $eventAssistName =
        trim(
            (string)(
                $eventPayload['assist_name']
                ??
                ''
            )
        );

    $eventMinute =
        isset($eventPayload['minute'])
        && $eventPayload['minute'] !== null
            ? (int)$eventPayload['minute']
            : null;

    $fanSide = '';
    $opponentTeamName = '';
    $homeTeamName = '';
    $awayTeamName = '';
    $homeGoals = null;
    $awayGoals = null;
    $fanGoals = null;
    $opponentGoals = null;

    $fixtureApiId =
        isset($event['fixture_api_id'])
        && $event['fixture_api_id'] !== null
            ? (int)$event['fixture_api_id']
            : 0;

    if ($fixtureApiId > 0) {

        $fixtureStmt = $pdo->prepare("
            SELECT
                f.*,
                ht.name AS home_name,
                at.name AS away_name,
                ht.persian_name AS home_name_fa,
                at.persian_name AS away_name_fa
            FROM football_fixtures f
            LEFT JOIN football_teams ht
                ON ht.api_team_id = f.home_api_team_id
            LEFT JOIN football_teams at
                ON at.api_team_id = f.away_api_team_id
            WHERE f.api_fixture_id = ?
            LIMIT 1
        ");

        $fixtureStmt->execute([$fixtureApiId]);

        $fixtureRow =
            $fixtureStmt->fetch(PDO::FETCH_ASSOC);

        if ($fixtureRow) {

            $homeTeamName =
                trim(
                    (string)(
                        $fixtureRow['home_name_fa']
                        ?:
                        $fixtureRow['home_name']
                        ?:
                        $fixtureRow['home_api_team_id']
                    )
                );

            $awayTeamName =
                trim(
                    (string)(
                        $fixtureRow['away_name_fa']
                        ?:
                        $fixtureRow['away_name']
                        ?:
                        $fixtureRow['away_api_team_id']
                    )
                );

            $homeGoals =
                $fixtureRow['home_goals'] !== null
                    ? (int)$fixtureRow['home_goals']
                    : null;

            $awayGoals =
                $fixtureRow['away_goals'] !== null
                    ? (int)$fixtureRow['away_goals']
                    : null;

            if (
                (int)$fixtureRow['home_api_team_id']
                ===
                $teamApiId
            ) {
                $fanSide = 'home';
                $opponentTeamName = $awayTeamName;
                $fanGoals = $homeGoals;
                $opponentGoals = $awayGoals;

            } elseif (
                (int)$fixtureRow['away_api_team_id']
                ===
                $teamApiId
            ) {
                $fanSide = 'away';
                $opponentTeamName = $homeTeamName;
                $fanGoals = $awayGoals;
                $opponentGoals = $homeGoals;
            }
        }
    }

    if ($perspective === '') {

        if (
            $eventTeamName !== ''
            &&
            $subjectName !== ''
        ) {
            $perspective =
                mb_strtolower(
                    $eventTeamName,
                    'UTF-8'
                )
                ===
                mb_strtolower(
                    $subjectName,
                    'UTF-8'
                )
                    ? 'own_team'
                    : 'opponent';
        }
    }

    echo "Perspective:    "
        . ($perspective !== '' ? $perspective : '-')
        . PHP_EOL;

    echo "Fan Side:       "
        . ($fanSide !== '' ? $fanSide : '-')
        . PHP_EOL;

    echo "Opponent:       "
        . ($opponentTeamName !== '' ? $opponentTeamName : '-')
        . PHP_EOL;

    if (
        $fanGoals !== null
        &&
        $opponentGoals !== null
    ) {
        echo "Fan Score:      "
            . $fanGoals
            . "-"
            . $opponentGoals
            . PHP_EOL;
    }

    $eventTextParts = [];
"""

if needle not in text:
    print("ERROR: eventTextParts marker not found")
    sys.exit(1)

text = text.replace(needle, replacement, 1)

needle2 = """        'style_memory' => $styleMemory,

        'target_language' => 'fa',
"""

replacement2 = """        'style_memory' => $styleMemory,

        /*
        | Fan perspective context
        */
        'perspective' => $perspective,
        'fan_side' => $fanSide,
        'opponent_team' => $opponentTeamName,
        'home_team' => $homeTeamName,
        'away_team' => $awayTeamName,
        'fan_goals' => $fanGoals,
        'opponent_goals' => $opponentGoals,
        'event_team_name' => $eventTeamName,
        'event_player_name' => $eventPlayerName,
        'event_assist_name' => $eventAssistName,
        'event_minute' => $eventMinute,

        'target_language' => 'fa',
"""

if needle2 not in text:
    print("ERROR: input style_memory block not found")
    sys.exit(1)

text = text.replace(needle2, replacement2, 1)

text = text.replace(
    "<?php\n",
    "<?php\n/* FAN PERSPECTIVE CONTEXT V1 */\n",
    1
)

tmp = target.with_suffix(".php.tmp")
tmp.write_text(text, encoding="utf-8")

check = subprocess.run(
    ["php", "-l", str(tmp)],
    capture_output=True,
    text=True
)

print(check.stdout.strip())

if check.returncode != 0:
    print(check.stderr.strip())
    tmp.unlink(missing_ok=True)
    sys.exit(1)

tmp.replace(target)

print("Fan Analyzer perspective context enabled ✅")
