OSDN Git Service

ApplicationDirecroriesの中のアプリケーションに依存する部分を分離した
[kcd/KCD.git] / KCD / FleetManager.swift
1 //
2 //  FleetManager.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/22.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 final class FleetManager: NSObject {
12     
13     override init() {
14         
15         super.init()
16         
17         setupFleets()
18     }
19     
20     @objc private(set) var fleets: [Fleet] = []
21     private var fleetController: NSArrayController!
22     
23     override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
24         
25         if keyPath == "arrangedObjects.ships" {
26             
27             setNewFleetNumberToShip()
28             
29             return
30         }
31         
32         super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
33     }
34     
35     private func setupFleetController() {
36         
37         fleetController = NSArrayController(content: fleets)
38         fleetController.addObserver(self, forKeyPath: "arrangedObjects.ships", context: nil)
39     }
40     
41     private func setupFleets() {
42         
43         fleets = (1...4).compactMap { Fleet(number: $0) }
44         
45         guard fleets.count == 4 else {
46             
47             Logger.shared.log("Can not create Fleet")
48             
49             return
50         }
51         
52         if fleets[0].ships.isEmpty {
53             
54             NotificationCenter.default
55                 .addObserverOnce(forName: .PortAPIReceived, object: nil, queue: nil) { _ in
56                     
57                     DispatchQueue.main.async(execute: self.setupFleetController)
58                     DispatchQueue.main.async(execute: self.setNewFleetNumberToShip)
59             }
60             
61         } else {
62             
63             setupFleetController()
64         }
65     }
66     
67     private func setNewFleetNumberToShip() {
68         
69         let store = ServerDataStore.oneTimeEditor()
70         store.sync {
71             
72             // clear all
73             store.shipsInFleet().forEach { $0.fleet = 0 as NSNumber }
74             
75             // set
76             self.fleets.enumerated().forEach { index, fleet in
77                 
78                 fleet.ships.forEach { ship in
79                     
80                     store.ship(by: ship.id)?.fleet = (index + 1) as NSNumber
81                 }
82             }
83         }
84     }
85 }