//
//  GetNgaList.swift
//  Sailassist
//
//  Created by 三浦薫巳 on 2024/06/15.
//

import Foundation
import SwiftUI
import CoreLocation

class GetNgaList {
    @ObservedObject var ngaData = SharingData.nga
    var sessionNgaList = SessionNgaList()

    func start() {
        sessionNgaList.RequestGetNgaList(responseGetNgaList)
    }

    private func responseGetNgaList(result: Result<Data, APIError>) {
        switch result {
        case .success(let resultData):
            let serverSession = ServerSession()
            let resjson = serverSession.fromJSON(resultData: resultData, resltType: [ReqNgaList].self)
//            if let res = resjson {
//                var ngaTmp: Dictionary<UUID, RegisteredNga> = [:]
//                for ngaList in res {
//                    if let id = NSUUID(uuidString: ngaList.id) {
//                        if var nga = RegisteredNga(areaName: "") {
//                            nga.areaId = id as UUID
//                            if let name = ngaList.name {
//                                nga.name = name
//                            }
//                            nga.isLock = ngaList.lock
//                            nga.isRunning = ngaList.enabled
//                            if !ngaList.enabled {
//                                nga.passingCnt = 0
//                            }
//                            nga.color = Color.green.description
//                            for pos in ngaList.geometry{
//                                let point = CLLocationCoordinate2D(latitude: pos.lat!, longitude: pos.lon!)
//                                nga.points.append(point)
//                            }
//                            ngaTmp.updateValue(nga, forKey: nga.areaId)
//                        }
//                    }
//                }
//                ngaData.ngaArea = [:]
//                ngaData.ngaArea = ngaTmp
//            }

//            if let res = resjson {
//                var ngaAreas = ngaData.ngaArea
//                for ngaList in res {
//                    if let id = NSUUID(uuidString: ngaList.id) {
//                        if var nga = ngaAreas[id as UUID] {
//                            if let name = ngaList.name {
//                                nga.name = name
//                            }
//                            nga.isLock = ngaList.lock
//                            nga.points.removeAll()
//                            for pos in ngaList.geometry{
//                                let point = CLLocationCoordinate2D(latitude: pos.lat!, longitude: pos.lon!)
//                                nga.points.append(point)
//                            }
//                            ngaAreas.updateValue(nga, forKey: nga.areaId)
//                        } else {
//                            if var nga = RegisteredNga(areaName: "test dammy") {    //TODO: 名称はダミー
//                                nga.areaId = id as UUID
//                                if let name = ngaList.name {
//                                    nga.name = name
//                                }
//                                nga.isLock = ngaList.lock
//                                nga.isRunning = ngaList.enabled
//                                if !ngaList.enabled {
//                                    nga.passingCnt = 0
//                                }
//                                nga.color = Color.green.description
//                                for pos in ngaList.geometry{
//                                    let point = CLLocationCoordinate2D(latitude: pos.lat!, longitude: pos.lon!)
//                                    nga.points.append(point)
//                                }
//                                ngaAreas.updateValue(nga, forKey: nga.areaId)
//                            }
//                        }
//                    }
//                    for ares in ngaAreas {
//                        ngaData.setNgaArea(key: ares.value.areaId, value: ares.value)
//                    }
//                }
//            }


            if let res = resjson {
                var ngaAreas = ngaData.ngaArea

                //更新確認用フラグ
                for area in ngaAreas {
                    var areaData = area.value
                    areaData.isUpdate = false
                    ngaAreas.updateValue(areaData, forKey: area.value.areaId)
                }

                for ngaList in res {
                    if let id = NSUUID(uuidString: ngaList.id) {
                        if var nga = ngaAreas[id as UUID] {
                            //更新
                            if let name = ngaList.name {
                                nga.name = name
                            }
                            nga.isLock = ngaList.lock
                            if ngaList.enabled {
                                if !nga.isRunning {
                                    nga.passingCnt = 0
                                }
                                nga.isRunning = true
                            } else {
                                nga.passingCnt = 0
                                nga.isRunning = false
                            }
                            nga.points.removeAll()
                            for pos in ngaList.geometry{
                                let point = CLLocationCoordinate2D(latitude: pos.lat!, longitude: pos.lon!)
                                nga.points.append(point)
                            }
                            nga.isUpdate = true
                            ngaAreas.updateValue(nga, forKey: nga.areaId)
                        } else {
                            //追加
                            if var nga = RegisteredNga(areaName: "") {
                                nga.areaId = id as UUID
                                if let name = ngaList.name {
                                    nga.name = name
                                }
                                nga.isLock = ngaList.lock
                                nga.color = Color.green.description
                                nga.isRunning = ngaList.enabled
                                nga.passingCnt = 0
                                for pos in ngaList.geometry{
                                    let point = CLLocationCoordinate2D(latitude: pos.lat!, longitude: pos.lon!)
                                    nga.points.append(point)
                                }
                                nga.isUpdate = true
                                ngaAreas.updateValue(nga, forKey: nga.areaId)
                            }
                        }
                    }
                }

                //更新と削除
                for area in ngaAreas {
                    if area.value.isUpdate {
                        ngaData.setNgaArea(key: area.value.areaId, value: area.value)
                    } else {
                        ngaData.deleteNgaArea(key: area.value.areaId)
                    }
                }
            }
        case .failure(let errorCode):
            print(debug: errorCode)
            break
        }
    }
}
