Passed
Branch master (182172)
by Matthew
04:03 queued 01:23
created

PickRepository::SearchStrict()   C

Complexity

Conditions 8
Paths 64

Size

Total Lines 44
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 44
rs 5.3846
c 0
b 0
f 0
cc 8
eloc 28
nc 64
nop 1
1
<?php
2
namespace PhpDraft\Domain\Repositories;
3
4
use Silex\Application;
5
use PhpDraft\Domain\Entities\Pick;
6
use PhpDraft\Domain\Entities\Draft;
7
use PhpDraft\Domain\Models\PickSearchModel;
8
9
class PickRepository {
10
  private $app;
11
12
  public function __construct(Application $app) {
13
    $this->app = $app;
14
  }
15
16
  //Used for when a pick is entered (made)
17
  public function AddPick(Pick $pick) {
18
    $add_stmt = $this->app['db']->prepare("UPDATE players 
19
      SET first_name = ?, last_name = ?, team = ?, position = ?, player_counter = ?, pick_time = ?, pick_duration = ?
20
      WHERE player_id = ?");
21
22
    $add_stmt->bindParam(1, $pick->first_name);
23
    $add_stmt->bindParam(2, $pick->last_name);
24
    $add_stmt->bindParam(3, $pick->team);
25
    $add_stmt->bindParam(4, $pick->position);
26
    $add_stmt->bindParam(5, $pick->player_counter);
27
    $add_stmt->bindParam(6, $pick->pick_time);
28
    $add_stmt->bindParam(7, $pick->pick_duration);
29
    $add_stmt->bindParam(8, $pick->player_id);
30
31
    if (!$add_stmt->execute()) {
32
      throw new Exception("Unable to save pick #$pick->player_pick.");
0 ignored issues
show
Bug introduced by
The type PhpDraft\Domain\Repositories\Exception was not found. Did you mean Exception? If so, make sure to prefix the type with \.
Loading history...
33
    }
34
35
    return $pick;
36
  }
37
38
  public function Load($id) {
39
    $pick = new Pick();
40
41
    $pick_stmt = $this->app['db']->prepare("SELECT p.*, m.manager_name, m.manager_id FROM players p 
42
      LEFT OUTER JOIN managers m ON p.manager_id = m.manager_id
43
      WHERE player_id = ? LIMIT 1");
44
    $pick_stmt->bindParam(1, $id);
45
46
    $pick_stmt->setFetchMode(\PDO::FETCH_INTO, $pick);
47
48
    if(!$pick_stmt->execute() || !$pick_stmt->fetch()) {
49
      throw new \Exception("Unable to load pick " . $id);
50
    }
51
52
    $pick->selected = strlen($pick->pick_time) > 0 && $pick->pick_duration > 0;
53
54
    return $pick;
55
  }
56
57
  //Is used by public draft board, need to consider serpentine or standard ordering
58
  public function LoadAll(Draft $draft) {
59
    $picks = array();
60
61
    $sort = true;
62
    for ($i = 1; $i <= $draft->draft_rounds; ++$i) {
63
      if ($draft->draft_style == "serpentine") {
64
        $picks[] = $this->LoadRoundPicks($draft, $i, $sort, false);
65
        $sort = $sort ? false : true;
66
      } else {
67
        $picks[] = $this->LoadRoundPicks($draft, $i, true, false);
68
      }
69
    }
70
71
    return $picks;
72
  }
73
74
  public function LoadUpdatedPicks($draft_id, $pick_counter) {
75
    $picks = array();
76
    
77
    $stmt = $this->app['db']->prepare("SELECT p.*, m.manager_name FROM players p ".
78
            "LEFT OUTER JOIN managers m " .
79
            "ON m.manager_id = p.manager_id " .
80
            "WHERE p.draft_id = ? " .
81
            "AND p.player_counter > ? ORDER BY p.player_counter");
82
    
83
    $stmt->bindParam(1, $draft_id);
84
    $stmt->bindParam(2, $pick_counter);
85
    
86
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
87
    
88
    if(!$stmt->execute()) {
89
      throw new \Exception("Unable to load updated picks.");
90
    }
91
    
92
    while($pick = $stmt->fetch()) {
93
      $pick->selected = strlen($pick->pick_time) > 0 && $pick->pick_duration > 0;
94
      $picks[] = $pick;
95
    }
96
    
97
    return $picks;
98
  }
99
100
  public function UpdatePick(Pick $pick) {
101
    $update_stmt = $this->app['db']->prepare("UPDATE players SET manager_id = ?, first_name = ?, last_name = ?, team = ?, position = ?,
102
      pick_time = ?, pick_duration = ?, player_counter = ? WHERE player_id = ?");
103
104
    $update_stmt->bindParam(1, $pick->manager_id);
105
    $update_stmt->bindParam(2, $pick->first_name);
106
    $update_stmt->bindParam(3, $pick->last_name);
107
    $update_stmt->bindParam(4, $pick->team);
108
    $update_stmt->bindParam(5, $pick->position);
109
    $update_stmt->bindParam(6, $pick->pick_time);
110
    $update_stmt->bindParam(7, $pick->pick_duration);
111
    $update_stmt->bindParam(8, $pick->player_counter);
112
    $update_stmt->bindParam(9, $pick->player_id);
113
114
    if(!$update_stmt->execute()) {
115
      throw new \Exception("Unable to update pick #$pick->player_id");
116
    }
117
118
    return $pick;
119
  }
120
121
  //Used for when a pick has been updated on the depth chart (public-ish)
122
  public function UpdatePickDepthChart(Pick $pick) {
123
    $update_stmt = $this->app['db']->prepare("UPDATE players SET depth_chart_position_id = ?, position_eligibility = ? WHERE player_id = ?");
124
125
    $update_stmt->bindParam(1, $pick->depth_chart_position_id);
126
    $update_stmt->bindParam(2, $pick->position_eligibility);
0 ignored issues
show
Bug introduced by
The property position_eligibility does not exist on PhpDraft\Domain\Entities\Pick. Did you mean position?
Loading history...
127
    $update_stmt->bindParam(3, $pick->player_id);
128
129
    if(!$update_stmt->execute()) {
130
      throw new \Exception("Unable to update pick #$pick->player_id for depth chart.");
131
    }
132
133
    return $pick;
134
  }
135
136
  public function GetCurrentPick(Draft $draft) {
137
    $stmt = $this->app['db']->prepare("SELECT p.*, m.manager_id, m.manager_name " .
138
            "FROM players p " .
139
            "LEFT OUTER JOIN managers m " .
140
            "ON m.manager_id = p.manager_id " .
141
            "WHERE p.draft_id = ? " .
142
            "AND p.player_round = ? " .
143
            "AND p.player_pick = ? " .
144
            "LIMIT 1");
145
146
    $stmt->bindParam(1, $draft->draft_id);
147
    $stmt->bindParam(2, $draft->draft_current_round);
148
    $stmt->bindParam(3, $draft->draft_current_pick);
149
150
    //Saw some extra numbered properties in the object when a FETCH_CLASS was performed instead. Possibly from the JOIN? Use FETCH_INTO instead:
151
    $current_pick = new Pick();
152
    $stmt->setFetchMode(\PDO::FETCH_INTO, $current_pick);
153
154
    if (!$stmt->execute()) {
155
      throw new \Exception("Unable to get current pick.");
156
    }
157
158
    if ($stmt->rowCount() == 0) {
159
      throw new \Exception("Unable to get current pick.");
160
    }
161
162
    $stmt->fetch();
163
164
    $current_pick->selected = strlen($current_pick->pick_time) > 0 && $current_pick->pick_duration > 0;
165
    $current_pick->on_the_clock = true;
166
167
    return $current_pick;
168
  }
169
170
  public function GetPreviousPick(Draft $draft) {
171
    $stmt = $this->app['db']->prepare("SELECT p.*, m.manager_id, m.manager_name " .
172
            "FROM players p " .
173
            "LEFT OUTER JOIN managers m " .
174
            "ON m.manager_id = p.manager_id " .
175
            "WHERE p.draft_id = ? " .
176
            "AND p.player_pick = ? " .
177
            "AND p.pick_time IS NOT NULL " .
178
            "LIMIT 1");
179
180
    $stmt->bindParam(1, $draft->draft_id);
181
    $stmt->bindParam(2, $previous_pick_number);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $previous_pick_number does not exist. Did you maybe mean $previous_pick?
Loading history...
182
183
    $previous_pick_number = ($draft->draft_current_pick - 1);
0 ignored issues
show
Unused Code introduced by
The assignment to $previous_pick_number is dead and can be removed.
Loading history...
184
185
    $previous_pick = new Pick();
186
    $stmt->setFetchMode(\PDO::FETCH_INTO, $previous_pick);
187
188
    if (!$stmt->execute()) {
189
      throw new \Exception("Unable to get last pick: " . implode(":", $stmt->errorInfo()));
190
    }
191
192
    if ($stmt->rowCount() == 0) {
193
      return null;
194
    }
195
196
    $stmt->fetch();
197
198
    $previous_pick->selected = strlen($previous_pick->pick_time) > 0 && $previous_pick->pick_duration > 0;
199
    $previous_pick->on_the_clock = false;
200
201
    return $previous_pick;
202
  }
203
204
  public function GetNextPick(Draft $draft) {
205
    $stmt = $this->app['db']->prepare("SELECT p.*, m.manager_id, m.manager_name " .
206
            "FROM players p " .
207
            "LEFT OUTER JOIN managers m " .
208
            "ON m.manager_id = p.manager_id " .
209
            "WHERE p.draft_id = ? " .
210
            "AND p.player_pick = ? LIMIT 1");
211
212
    $stmt->bindParam(1, $draft->draft_id);
213
    $stmt->bindParam(2, $current_pick_number);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $current_pick_number seems to be never defined.
Loading history...
214
215
    $current_pick_number = $draft->draft_current_pick + 1;
0 ignored issues
show
Unused Code introduced by
The assignment to $current_pick_number is dead and can be removed.
Loading history...
216
217
    $next_pick = new Pick();
218
    $stmt->setFetchMode(\PDO::FETCH_INTO, $next_pick);
219
220
    if (!$stmt->execute()) {
221
      throw new Exception("Unable to get next pick.");
222
    }
223
224
    if ($stmt->rowCount() == 0) {
225
      return null;
226
    }
227
228
    $stmt->fetch();
229
230
    $next_pick->on_the_clock = true;
231
232
    return $next_pick;
233
  }
234
235
  public function LoadLastPicks($draft_id, $amount) {
236
    $picks = array();
237
238
    $stmt = $this->app['db']->prepare("SELECT p.*, m.manager_name, m.manager_id FROM players p ".
239
            "LEFT OUTER JOIN managers m " .
240
            "ON m.manager_id = p.manager_id " .
241
            "WHERE p.draft_id = ? " .
242
            "AND p.pick_time IS NOT NULL " .
243
            "AND p.pick_duration IS NOT NULL " .
244
            "ORDER BY p.player_pick DESC " .
245
            "LIMIT ?");
246
    
247
    $stmt->bindParam(1, $draft_id);
248
    $stmt->bindParam(2, $amount, \PDO::PARAM_INT);
249
    
250
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
251
    
252
    if(!$stmt->execute()) {
253
      throw new Exception("Unable to load last $amount picks.");
254
    }
255
    
256
    while($pick = $stmt->fetch()) {
257
      $pick->selected = strlen($pick->pick_time) > 0 && $pick->pick_duration > 0;
258
      $picks[] = $pick;
259
    }
260
    
261
    return $picks;
262
  }
263
264
  public function LoadNextPicks($draft_id, $currentPick, $amount) {
265
    $picks = array();
266
267
    $stmt = $this->app['db']->prepare("SELECT p.*, m.manager_name, m.manager_id FROM players p ".
268
            "LEFT OUTER JOIN managers m " .
269
            "ON m.manager_id = p.manager_id " .
270
            "WHERE p.draft_id = ? " .
271
            "AND p.player_pick >= ? " .
272
            "ORDER BY p.player_pick ASC " .
273
            "LIMIT ?");
274
    
275
    $stmt->bindParam(1, $draft_id);
276
    $stmt->bindParam(2, $currentPick);
277
    $stmt->bindParam(3, $amount, \PDO::PARAM_INT);
278
    
279
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
280
    
281
    if(!$stmt->execute()) {
282
      throw new Exception("Unable to load next $amount picks.");
283
    }
284
    
285
    while($pick = $stmt->fetch()) {
286
      $pick->selected = strlen($pick->pick_time) > 0 && $pick->pick_duration > 0;
287
      $pick->on_the_clock = $pick->player_pick == $currentPick;
288
289
      $picks[] = $pick;
290
    }
291
    
292
    return $picks;
293
  }
294
295
  public function LoadManagerPicks($manager_id, $draft = null, $selected = true) {
296
    $manager_id = (int) $manager_id;
297
298
    if ($manager_id == 0) {
299
      throw new \Exception("Unable to get manager #" . $manager_id . "'s picks.");
300
    }
301
302
    $picks = array();
303
304
    $stmt = $selected
305
      ? $this->app['db']->prepare("SELECT * FROM players WHERE manager_id = ? AND pick_time IS NOT NULL ORDER BY player_pick ASC")
306
      : $this->app['db']->prepare("SELECT * FROM players WHERE manager_id = ? ORDER BY player_pick ASC");
307
308
    $stmt->bindParam(1, $manager_id);
309
310
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
311
312
    if (!$stmt->execute()) {
313
      throw new \Exception("Unable to load manager #$manager_id's picks.");
314
    }
315
316
    while ($pick = $stmt->fetch()) {
317
      $pick->player_pick = (int)$pick->player_pick;
318
      $pick->selected = strlen($pick->pick_time) > 0 && $pick->pick_duration > 0;
319
      $pick->on_the_clock = $draft != null && $pick->player_pick == $draft->draft_current_pick;
320
321
      $picks[] = $pick;
322
    }
323
324
    return $picks;
325
  }
326
327
  public function LoadRoundPicks(Draft $draft, $draft_round, $sort_ascending = true, $selected = true) {
328
    $picks = array();
329
    $sortOrder = $sort_ascending ? "ASC" : "DESC";
330
331
    $stmt = $selected
332
      ? $this->app['db']->prepare("SELECT p.*, m.manager_name FROM players p " .
333
            "LEFT OUTER JOIN managers m " .
334
            "ON m.manager_id = p.manager_id " .
335
            "WHERE p.draft_id = ? " .
336
            " AND p.player_round = ? AND p.pick_time IS NOT NULL ORDER BY p.player_pick " . $sortOrder)
337
      : $this->app['db']->prepare("SELECT p.*, m.manager_name FROM players p " .
338
            "LEFT OUTER JOIN managers m " .
339
            "ON m.manager_id = p.manager_id " .
340
            "WHERE p.draft_id = ? " .
341
            " AND p.player_round = ? ORDER BY p.player_pick " . $sortOrder);
342
343
    $stmt->bindParam(1, $draft->draft_id);
344
    $stmt->bindParam(2, $draft_round);
345
346
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
347
348
    if (!$stmt->execute()) {
349
      throw new \Exception("Unable to load round #$round's picks.");
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $round seems to be never defined.
Loading history...
350
    }
351
352
    while ($pick = $stmt->fetch()) {
353
      $pick->selected = strlen($pick->pick_time) > 0 && $pick->pick_duration > 0;
354
      $pick->on_the_clock = $draft != null && $pick->player_pick == $draft->draft_current_pick;
355
356
      $picks[] = $pick;
357
    }
358
359
    return $picks;
360
  }
361
362
  /**
363
   * Searches for picks with strict criteria, using the MATCH() and score method. Sorts by score ASC first, then pick DESC last.
364
   * @param int $draft_id 
365
   */
366
  public function SearchStrict(PickSearchModel $searchModel) {
367
    $draft_id = (int) $searchModel->draft_id;
368
    $param_number = 4;
369
    $players = array();
370
371
    $sql = "SELECT p.*, m.manager_name, MATCH (p.first_name, p.last_name) AGAINST (?) as search_score " .
372
            "FROM players p LEFT OUTER JOIN managers m ON m.manager_id = p.manager_id WHERE MATCH (p.first_name, p.last_name) AGAINST (?) AND p.draft_id = ? ";
373
374
    if ($searchModel->hasTeam())
375
      $sql .= "AND p.team = ? ";
376
377
    if ($searchModel->hasPosition())
378
      $sql .= "AND p.position = ? ";
379
380
    $sql .= "AND p.pick_time IS NOT NULL ORDER BY search_score ASC, p.player_pick $searchModel->sort";
381
382
    $stmt = $this->app['db']->prepare($sql);
383
    $stmt->bindParam(1, $searchModel->keywords);
384
    $stmt->bindParam(2, $searchModel->keywords);
385
    $stmt->bindParam(3, $draft_id);
386
    if ($searchModel->hasTeam()) {
387
      $stmt->bindParam(4, $searchModel->team);
388
      $param_number++;
389
    }
390
391
    if ($searchModel->hasPosition()) {
392
      $stmt->bindParam($param_number, $searchModel->position);
393
      $param_number++;
394
    }
395
396
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
397
398
    if (!$stmt->execute()) {
399
      throw new \Exception("Unable to search for picks.");
400
    }
401
402
    while ($player = $stmt->fetch()) {
403
      $player->selected = strlen($player->pick_time) > 0 && $player->pick_duration > 0;
404
      $players[] = $player;
405
    }
406
407
    $searchModel->player_results = $players;
0 ignored issues
show
Documentation Bug introduced by
It seems like $players of type array or array is incompatible with the declared type string of property $player_results.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
408
409
    return $searchModel;
410
  }
411
412
  /**
413
   * Search picks by a loose criteria that uses a LIKE %% query. Used if strict query returns 0 results. Sorts by pick DESC.
414
   * @param int $draft_id 
415
   */
416
  public function SearchLoose(PickSearchModel $searchModel) {
417
    $draft_id = (int) $searchModel->draft_id;
418
    $players = array();
419
    $param_number = 2;
420
    $loose_search_score = -1;
421
422
    $sql = "SELECT p.*, m.manager_name FROM players p LEFT OUTER JOIN managers m ON m.manager_id = p.manager_id WHERE p.draft_id = ? ";
423
424
    if ($searchModel->hasName())
425
      $sql .= "AND (p.first_name LIKE ? OR p.last_name LIKE ?)";
426
427
    if ($searchModel->hasTeam())
428
      $sql .= "AND p.team = ? ";
429
430
    if ($searchModel->hasPosition())
431
      $sql .= "AND p.position = ? ";
432
433
    $sql .= "AND p.pick_time IS NOT NULL ORDER BY p.player_pick $searchModel->sort";
434
435
    $stmt = $this->app['db']->prepare($sql);
436
    $stmt->bindParam(1, $draft_id);
437
438
    if ($searchModel->hasName()) {
439
      $stmt->bindParam($param_number, $keywords);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $keywords seems to be never defined.
Loading history...
440
      $param_number++;
441
      $stmt->bindParam($param_number, $keywords);
442
      $param_number++;
443
444
      $keywords = "%" . $searchModel->keywords . "%";
0 ignored issues
show
Unused Code introduced by
The assignment to $keywords is dead and can be removed.
Loading history...
445
    }
446
447
    if ($searchModel->hasTeam()) {
448
      $stmt->bindParam($param_number, $searchModel->team);
449
      $param_number++;
450
    }
451
452
    if ($searchModel->hasPosition()) {
453
      $stmt->bindParam($param_number, $searchModel->position);
454
      $param_number++;
455
    }
456
457
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
458
459
    if (!$stmt->execute()) {
460
      throw new \Exception("Unable to search for picks.");
461
    }
462
463
    while ($player = $stmt->fetch()) {
464
      $player->search_score = $loose_search_score;
465
      $player->selected = strlen($player->pick_time) > 0 && $player->pick_duration > 0;
466
      $players[] = $player;
467
468
      $loose_search_score--;
469
    }
470
471
    $searchModel->player_results = $players;
0 ignored issues
show
Documentation Bug introduced by
It seems like $players of type array or array is incompatible with the declared type string of property $player_results.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
472
473
    return $searchModel;
474
  }
475
476
  /**
477
   * Search picks by assuming a first + last combo was entered. Used if strict and loose queries return 0 and theres a space in the name. Sorts by pick DESC.
478
   * @param int $draft_id 
479
   */
480
  public function SearchSplit(PickSearchModel $searchModel, $first_name, $last_name) {
481
    $draft_id = (int) $searchModel->draft_id;
482
    $players = array();
483
    $param_number = 4;
484
    $loose_search_score = -1;
485
486
    $sql = "SELECT p.*, m.manager_name FROM players p LEFT OUTER JOIN managers m ON m.manager_id = p.manager_id WHERE p.draft_id = ?
487
      AND (p.first_name LIKE ? OR p.last_name LIKE ?)
488
      AND p.pick_time IS NOT NULL ORDER BY p.player_pick $searchModel->sort";
489
490
    $stmt = $this->app['db']->prepare($sql);
491
    $stmt->bindParam(1, $draft_id);
492
    $stmt->bindParam(2, $first_name);
493
    $stmt->bindParam(3, $last_name);
494
495
    if ($searchModel->hasTeam()) {
496
      $stmt->bindParam($param_number, $searchModel->team);
497
      $param_number++;
498
    }
499
500
    if ($searchModel->hasPosition()) {
501
      $stmt->bindParam($param_number, $searchModel->position);
502
      $param_number++;
503
    }
504
505
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
506
507
    if (!$stmt->execute()) {
508
      throw new \Exception("Unable to search for picks.");
509
    }
510
511
    while ($player = $stmt->fetch()) {
512
      $player->search_score = $loose_search_score;
513
      $player->selected = strlen($player->pick_time) > 0 && $player->pick_duration > 0;
514
      $players[] = $player;
515
516
      $loose_search_score--;
517
    }
518
519
    $searchModel->player_results = $players;
0 ignored issues
show
Documentation Bug introduced by
It seems like $players of type array or array is incompatible with the declared type string of property $player_results.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
520
521
    return $searchModel;
522
  }
523
524
  //Analogous to 1.3's "getAlreadyDrafted" method from the player service - used on the add pre-check
525
  public function SearchAlreadyDrafted($draft_id, $first_name, $last_name) {
526
    $picks = array();
527
528
    $stmt = $this->app['db']->prepare("SELECT p.*, m.manager_name " .
529
    "FROM players p " .
530
    "LEFT OUTER JOIN managers m " .
531
    "ON m.manager_id = p.manager_id " .
532
    "WHERE p.draft_id = ? " .
533
    "AND p.pick_time IS NOT NULL " .
534
    "AND p.first_name = ? " .
535
    "AND p.last_name = ? " .
536
    "ORDER BY p.player_pick");
537
538
    $stmt->bindParam(1, $draft_id);
539
    $stmt->bindParam(2, $first_name);
540
    $stmt->bindParam(3, $last_name);
541
542
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Pick');
543
544
    if(!$stmt->execute()) {
545
        throw new \Exception("Unable to check to see if $first_name $last_name was already drafted.");
546
    }
547
548
    while($pick = $stmt->fetch()) {
549
      $pick->selected = strlen($pick->pick_time) > 0 && $pick->pick_duration > 0;
550
      $picks[] = $pick;
551
    }
552
553
    return $picks;
554
  }
555
556
  public function DeleteAllPicks($draft_id) {
557
    $delete_stmt = $this->app['db']->prepare("DELETE FROM players WHERE draft_id = ?");
558
    $delete_stmt->bindParam(1, $draft_id);
559
560
    if(!$delete_stmt->execute()) {
561
      throw new \Exception("Unable to delete picks for $draft_id.");
562
    }
563
564
    return;
565
  }
566
567
  /*This logic will create all pick objects according to the draft information.
568
    The two lists are used in alternation for serpentine drafts. Only first list is
569
    used for standard drafts.*/
570
  public function SetupPicks(Draft $draft, $ascending_managers, $descending_managers = null) {
571
    $pick = 1;
572
    $even = true;
573
574
    for ($current_round = 1; $current_round <= $draft->draft_rounds; $current_round++) {
575
      if ($draft->draft_style == "serpentine") {
576
        if ($even) {
577
          $managers = $ascending_managers;
578
          $even = false;
579
        } else {
580
          if($descending_managers == null) {
581
            throw new \Exception("Descending managers list is empty - unable to setup draft.");
582
          }
583
584
          $managers = $descending_managers;
585
          $even = true;
586
        }
587
      }
588
      else
589
        $managers = $ascending_managers;
590
591
      foreach ($managers as $manager) {
592
        $new_pick = new Pick();
593
        $new_pick->manager_id = $manager->manager_id;
594
        $new_pick->draft_id = $draft->draft_id;
595
        $new_pick->player_round = $current_round;
596
        $new_pick->player_pick = $pick;
597
598
        try {
599
          $this->_saveSetupPick($new_pick);
600
        } catch (Exception $e) {
601
          throw new Exception($e->getMessage());
602
        }
603
604
        $pick++;
605
      }
606
    }
607
    return;
608
  }
609
610
  //Used when SetupPicks is called, which is when a draft is flipped to "in_progress"
611
  private function _saveSetupPick(Pick $pick) {
612
    $insert_stmt = $this->app['db']->prepare("INSERT INTO players
613
      (manager_id, draft_id, player_round, player_pick)
614
      VALUES
615
      (?, ?, ?, ?)");
616
617
    $insert_stmt->bindParam(1, $pick->manager_id);
618
    $insert_stmt->bindParam(2, $pick->draft_id);
619
    $insert_stmt->bindParam(3, $pick->player_round);
620
    $insert_stmt->bindParam(4, $pick->player_pick);
621
622
    if(!$insert_stmt->execute()) {
623
      throw new \Exception("Unable to insert pick #$pick->player_pick for draft $pick->draft_id");
624
    }
625
626
    return;
627
  }
628
}