-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathLottoApplication.java
More file actions
90 lines (75 loc) · 3.39 KB
/
LottoApplication.java
File metadata and controls
90 lines (75 loc) · 3.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package lotto;
import lotto.domain.Statistics;
import lotto.domain.factory.Issuer;
import lotto.domain.lotto.LottoTickets;
import lotto.domain.lotto.WinningNumber;
import lotto.domain.result.GameResults;
import lotto.ui.Printer;
import lotto.ui.Receiver;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class LottoApplication {
private static final String LOTTO_NUMBER_INPUT_DELIMITER = ", ";
private static final int LOTTO_TICKET_PRICE = 1000;
private static final String LOTTO_TICKET_PRICE_RANGE_EXCEPTION_MESSAGE =
"수동 구매 티켓의 갯수가 구입 금액을 초과했습니다.";
private final Printer printer;
private final Receiver receiver;
public LottoApplication(Printer printer, Receiver receiver) {
this.printer = printer;
this.receiver = receiver;
}
public static void main(String[] args) {
LottoApplication app = new LottoApplication(new Printer(), new Receiver(System.in));
app.run();
}
public void run() {
int purchaseAmount = receivePurchaseAmount();
int manualTicketCount = receiveManualTicketCount(purchaseAmount);
LottoTickets lottoTickets = Issuer.issueManualLottoTickets(manualTicketCount, receiveManualTicketNumber(manualTicketCount));
lottoTickets.addTickets(Issuer.issueLottoTickets(purchaseAmount, manualTicketCount));
printer.printIssuedTickets(lottoTickets, manualTicketCount);
WinningNumber winningNumber = new WinningNumber(receiveWinningNumber(), receiveBonusNumber());
GameResults gameResults = lottoTickets.matchNumbers(winningNumber);
Statistics statistics = new Statistics(gameResults, purchaseAmount);
printer.printStatistics(statistics);
}
private int receivePurchaseAmount() {
printer.requestPurchaseAmount();
String purchaseAmount = receiver.receiveLine();
return Integer.parseInt(purchaseAmount);
}
private int receiveManualTicketCount(int purchaseAmount) {
printer.requestManualTicketCount();
int manualTicketCount = Integer.parseInt(receiver.receiveLine());
if(manualTicketCount > purchaseAmount/LOTTO_TICKET_PRICE){
throw new IllegalArgumentException(LOTTO_TICKET_PRICE_RANGE_EXCEPTION_MESSAGE);
}
return manualTicketCount;
}
private List<List<Integer>> receiveManualTicketNumber(int manualTicketCount) {
printer.requestManualTicketNumber();
List<List<Integer>> manualTickets = new ArrayList<>();
for(int count = 0; count <manualTicketCount; count++) {
String manualNumber = receiver.receiveLine();
manualTickets.add(Arrays.stream(manualNumber.split(LOTTO_NUMBER_INPUT_DELIMITER))
.map(Integer::valueOf)
.collect(Collectors.toList()));
}
return manualTickets;
}
private List<Integer> receiveWinningNumber() {
printer.requestWinningNumber();
String winningNumber = receiver.receiveLine();
return Arrays.stream(winningNumber.split(LOTTO_NUMBER_INPUT_DELIMITER))
.map(Integer::valueOf)
.collect(Collectors.toList());
}
private int receiveBonusNumber() {
printer.requestBonusNumber();
String bonusNumber = receiver.receiveLine();
return Integer.parseInt(bonusNumber);
}
}