// // Model.swift // Need-to-pump-up // // Created by Дмитрий Собин on 16.07.2020. // Copyright © 2020 Дмитрий Собин. All rights reserved. // import UIKit //Include programs. class Model: Programs { static let shared = Model() let db: DBHelper = DBHelper() var allProg: [Program] = [] var progressProg: [Progress] = [] // var intWeek: Int = -1 var timerSec: Double = 60 var pathProgressJSON: String { return NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.libraryDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0] + "/progress.json" } // MARK: - Settings // var settings: Settings? // MARK: - Notifications enum AuthResult { case success(Bool), failure(Error) } func requestAuthNotif(completion: @escaping (AuthResult) -> ()) { // // other checking // UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound], completionHandler: { (granted, error) in if error != nil { completion(.failure(error!)) } else { completion(.success(granted)) } }) } // func settingsNotifications() { // UNUserNotificationCenter.current().requestAuthorization( // options: [.alert, .sound, .badge]) { [weak self] granted, _ in // print("Permission granted: \(granted)") // guard granted else { return } // self?.getNotificationSettings() // } // } // // func getNotificationSettings() { // UNUserNotificationCenter.current().getNotificationSettings { settings in // print("Notification settings: \(settings)") // } // } func addNotification(title: String, subtitle: String, timer: Double) { let content = UNMutableNotificationContent() content.title = title content.subtitle = subtitle // content.body = "Some message" content.sound = UNNotificationSound.default // show this notification five seconds from now let trigger = UNTimeIntervalNotificationTrigger(timeInterval: timer, repeats: false) // choose a random identifier let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger) // add our notification request UNUserNotificationCenter.current().add(request) } func loadPrograms() { allProg.append(createProgramPushups()) allProg.append(createProgramPress()) allProg.append(createProgramSitdown()) allProg.append(createProgramPullup()) // if progress file exists then read data and load to progressProg. Else then create new file. // DEPRECATED: // if checkProgressExists() { // let data = readFile(path: pathProgressJSON) // progressProg = decodeFromJson(data: data) // } else { // let data = encodeToJson(prog: allProg) // _ = writeFile(strWrite: data, fileURL: pathProgressJSON) // // progressProg = allProg } // MARK: - Files // DEPRECATED: // func checkProgressExists() -> Bool { // // if FileManager.default.fileExists(atPath: pathProgressJSON) { // return true // } // return false // } // // func encodeToJson(prog: [Program]) -> String { // // let jsonEncoder = JSONEncoder() // // jsonEncoder.outputFormatting = .prettyPrinted // let jsonson = try? JSONEncoder().encode(prog) // // let kek = jsonson?.description // let str = String(bytes: jsonson!, encoding: String.Encoding.utf8) // print(str!) // return str! // } // // func decodeFromJson(data: String) -> [Program] { // // let jsonEncoder = JSONEncoder() // // jsonEncoder.outputFormatting = .prettyPrinted // let res = try? JSONDecoder().decode([Program].self, from: data.data(using: .utf8)!) // // // let kek = jsonson?.description // return res! // } // func readFile(path: String) -> String { // do { // let urlForSave = URL(fileURLWithPath: pathProgressJSON) // let data = try String(contentsOf: urlForSave) // return data // } catch let error as NSError { // print("Error: fileURL failed to read: \n\(error)" ) // return "" // } // } // // func writeFile(strWrite: String, fileURL: String) -> Bool { // // let path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.libraryDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]+"/progress.json" // let urlForSave = URL(fileURLWithPath: pathProgressJSON) // do { // try strWrite.write(to: urlForSave, atomically: true, encoding: .utf8) // // try strWrite.write(to: urlForSave) // print(pathProgressJSON) // print("Данные загружены") // return true // } catch { // print("Error while save data: \(error.localizedDescription)") // return false // } // } // MARK: - Program func getProgForCurrentTraining(idProgram: Int64, idLevel: Int64, idDay: Int64) -> Program { // let db: DBHelper = DBHelper() let prog = db.selectNextProgram(idProgram: idProgram, idLevel: idLevel, idDay: idDay) return prog } // MARK: - Progress func deleteProgressObj(numObj: Int64) { // let db: DBHelper = DBHelper() db.deleteObjProgress(numObj: numObj) } func changePostionProgressUp(numObj: Int64) { // let db: DBHelper = DBHelper() if numObj > 0 { db.updatePositionProgress(numUpperObj: numObj, numLowerObj: numObj - 1) } } func changePostionProgressDown(numObj: Int64) { // let db: DBHelper = DBHelper() if numObj < progressProg.last!.numObj { db.updatePositionProgress(numUpperObj: numObj, numLowerObj: numObj + 1) } } func addProgressStart(numObj: Int64, program: Program, lvlIndex: Int) { // if lvlIndex == 0 then its first lvl first day if lvlIndex == 0 { // let db: DBHelper = DBHelper() db.insertProgress(numObj: numObj, idProgram: program.id, idLevel: program.lvls![0].id - 1, idDay: program.lvls![0].days[0].id, percent: "0%") Model.shared.progressProg = Model.shared.getGroupProgress() return } //add Done to prev lvls var prog = program for (index, lvll) in prog.lvls!.enumerated() { if index < lvlIndex { for (index2) in lvll.days.indices { prog.lvls![index].days[index2].done = 1 } } } let perc = resultCountPercents(prog: prog) // let db: DBHelper = DBHelper() db.insertProgress(numObj: numObj, idProgram: prog.id, idLevel: prog.lvls![lvlIndex].id - 1, idDay: prog.lvls![lvlIndex].days[prog.lvls![lvlIndex].days.count - 1].id, percent: String(perc) + "%") Model.shared.progressProg = Model.shared.getGroupProgress() //add prog // progressProg.insert(prog, at: 0) //save to file // DEPRECATED // let str = encodeToJson(prog: progressProg) // writeFile(strWrite: str, fileURL: pathProgressJSON) } func addProgressResultTraining(numObj: Int64, prog: Program, idLevel: Int64, idDay: Int64) { //add Done to prev lvls var prog = prog for (index, lvll) in prog.lvls!.enumerated() { if index < idLevel { for (index2) in lvll.days.indices { if lvll.days[index2].id < idDay + 1 { prog.lvls![index].days[index2].done = 1 } else { break } } } } let perc = resultCountPercents(prog: prog) // let db: DBHelper = DBHelper() db.insertProgress(numObj: numObj, idProgram: prog.id, idLevel: idLevel, idDay: idDay, percent: String(perc) + "%") } func addExtraProgressResultTraining(numObj: Int64, prog: Program, idLevel: Int64, idDay: Int64) { let perc = 100 // let db: DBHelper = DBHelper() db.insertProgress(numObj: numObj, idProgram: prog.id, idLevel: idLevel, idDay: idDay, percent: String(perc) + "%") } func resultCountPercents(prog: Program) -> Int { //count all days //count only with done=true days var allDays: Int = 0 var doneDays: Int = 0 let prog = prog // var flagCatchNextLvl = 0 for lvll in prog.lvls! { for day in lvll.days { if day.done == 1 { doneDays += 1 } allDays += +1 } } if doneDays == 1 { return 1 } //count percents return (doneDays * 100) / allDays } func getGroupProgress() -> [Progress] { // let db: DBHelper = DBHelper() let progressList = db.selectAllActuallyProgress() return progressList } func getCurrentDayWeek() -> Int { // let db: DBHelper = DBHelper() let intWeek = Int(db.selectCurrentDayWeek()) return intWeek } }