Completed
Push — master ( 7f572e...bf04a1 )
by Benedikt
02:39
created

PlayerService   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 122
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Importance

Changes 0
Metric Value
dl 0
loc 122
c 0
b 0
f 0
rs 10
wmc 20
lcom 1
cbo 8

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 12 1
D mergePlayers() 0 74 19
1
<?php
2
declare(strict_types=1);
3
/**
4
 * Created by PhpStorm.
5
 * User: benedikt
6
 * Date: 1/29/17
7
 * Time: 11:10 PM
8
 */
9
10
namespace Tfboe\FmLib\Service;
11
12
13
use Doctrine\ORM\EntityManagerInterface;
14
use Tfboe\FmLib\Entity\PlayerInterface;
15
use Tfboe\FmLib\Entity\TournamentInterface;
16
17
/**
18
 * Class PlayerService
19
 * @package App\Service
20
 */
21
class PlayerService implements PlayerServiceInterface
22
{
23
//<editor-fold desc="Fields">
24
  /** @var EntityManagerInterface */
25
  private $em;
26
27
  /** @var LoadingServiceInterface */
28
  private $ls;
29
30
  /** @var DeletionServiceInterface */
31
  private $deletionService;
32
33
  /** @var RankingSystemServiceInterface */
34
  private $rankingSystemService;
35
//</editor-fold desc="Fields">
36
37
//<editor-fold desc="Constructor">
38
39
  /**
40
   * PlayerService constructor.
41
   * @param EntityManagerInterface $em
42
   * @param LoadingServiceInterface $ls
43
   * @param DeletionServiceInterface $deletionService
44
   * @param RankingSystemServiceInterface $rankingSystemService
45
   */
46
  public function __construct(
47
    EntityManagerInterface $em,
48
    LoadingServiceInterface $ls,
49
    DeletionServiceInterface $deletionService,
50
    RankingSystemServiceInterface $rankingSystemService
51
  )
52
  {
53
    $this->em = $em;
54
    $this->ls = $ls;
55
    $this->deletionService = $deletionService;
56
    $this->rankingSystemService = $rankingSystemService;
57
  }
58
//</editor-fold desc="Constructor">
59
60
61
//<editor-fold desc="Public Methods">
62
  /**
63
   * @param PlayerInterface $player
64
   * @param PlayerInterface $toMerge
65
   * @return bool|string
66
   */
67
  public function mergePlayers(PlayerInterface $player, PlayerInterface $toMerge)
68
  {
69
    if ($player->getId() == $toMerge->getId()) {
70
      return "Players are identical!";
71
    }
72
73
    /** @var TournamentInterface[] $ts */
74
    $ts = $this->em->createQueryBuilder()
75
      ->select("t")
76
      ->from(TournamentInterface::class, 't')
77
      ->innerJoin('t.competitions', 'c')
78
      ->innerJoin('c.teams', 'te')
79
      ->innerJoin('te.memberships', 'm')
80
      ->where('m.player = (:id)')->setParameter('id', $toMerge->getId())
81
      ->getQuery()->getResult();
82
83
    $tMap = [];
84
    foreach ($ts as $tournament) {
85
      $tMap[$tournament->getId()] = $tournament;
86
    }
87
    $ts = array_values($tMap);
88
89
    $this->ls->loadEntities($ts);
90
91
    //check if player is attendant in one of the tournaments of toMerge
92
    foreach ($ts as $tournament) {
93
      foreach ($tournament->getCompetitions() as $competition) {
94
        foreach ($competition->getTeams() as $team) {
95
          foreach ($team->getMemberships() as $membership) {
96
            if ($membership->getPlayer()->getId() == $player->getId()) {
97
              return "Player 1 and player 2 both attended the tournament " . $tournament->getName() .
98
                "(" . $tournament->getStartTime()->format('d.m.Y h:m') . ", id='" . $tournament->getId() . "')";
99
            }
100
          }
101
        }
102
      }
103
    }
104
105
    //change players
106
    foreach ($ts as $tournament) {
107
      foreach ($tournament->getCompetitions() as $competition) {
108
        $isMember = false;
109
        foreach ($competition->getTeams() as $team) {
110
          foreach ($team->getMemberships() as $membership) {
111
            if ($membership->getPlayer()->getId() == $toMerge->getId()) {
112
              $this->rankingSystemService->adaptOpenSyncFromValues($tournament, []);
113
              $membership->setPlayer($player);
114
              $isMember = true;
115
            }
116
          }
117
        }
118
        if ($isMember) {
119
          foreach ($competition->getPhases() as $phase) {
120
            foreach ($phase->getMatches() as $match) {
121
              foreach ($match->getGames() as $game) {
122
                if ($game->getPlayersA()->containsKey($toMerge->getId())) {
123
                  $game->getPlayersA()->remove($toMerge->getId());
124
                  $game->getPlayersA()->set($player->getId(), $player);
125
                }
126
                if ($game->getPlayersB()->containsKey($toMerge->getId())) {
127
                  $game->getPlayersB()->remove($toMerge->getId());
128
                  $game->getPlayersB()->set($player->getId(), $player);
129
                }
130
              }
131
            }
132
          }
133
        }
134
      }
135
    }
136
137
    $this->deletionService->deletePlayer($toMerge);
138
139
    return true;
140
  }
141
//</editor-fold desc="Public Methods">
142
}