MapsViewController.swift 13.6 KB
//
//  MapsViewController.swift
//  SwiftWarplyFramework
//
//  Created by Manos Chorianopoulos on 20/9/22.
//

import UIKit
import MapKit

@objc public class MapsViewController: UIViewController, MKMapViewDelegate {
    // ui
    @IBOutlet weak var mainView: UIView!
    @IBOutlet weak var backgroundImage: UIImageView!
    @IBOutlet private var mapView: MKMapView!
    
    @IBOutlet weak var closeButton: UIButton!
    @IBOutlet private var titleView: UILabel!
    @IBOutlet private var nameImageView: UIImageView!
    @IBOutlet private var nameView: UILabel!
    @IBOutlet private var hoursView: UILabel!
    @IBOutlet private var phoneView: UILabel!
    @IBOutlet private var addressView: UILabel!
    @IBOutlet private var directionsButton: CSMButton!
    @IBOutlet private var infoTopConstraint: NSLayoutConstraint!
    @IBOutlet weak var topBorderLine: UIImageView!
    
    // public
    public var couponSet: swiftApi.CouponSetItemModel?
    var merchantsArray:Array<swiftApi.MerchantModel> = []
    var selectedMerchant: swiftApi.MerchantModel?
    var annotationGroup = [MKPointAnnotation]()
    
    //
    var loading: Bool = false
    let initialLocation = CLLocation(latitude: 37.9641262, longitude: 23.7468592) // greece
    //
    public override func viewDidLoad() {
        super.viewDidLoad()
        
        self.hidesBottomBarWhenPushed = true
        
        self.infoTopConstraint.constant = 0
        
        setBackButton()
        setNavigationTitle("Καταστήματα")
        
        backgroundImage.image = UIImage(named: "coupons_scrollview_white", in: Bundle(for: MyEmptyClass.self), compatibleWith: nil)
        
        mapView.delegate = self
        mapView.centerToLocation(initialLocation, regionRadius: 1000000)
        
//        mapView.clipsToBounds = true
//        mapView.layer.cornerRadius = 30
//        mapView.layer.maskedCorners = [ .layerMinXMinYCorner] // Top left corner radius
        
        let image = UIImage(named: "top_border_line", in: Bundle(for: MyEmptyClass.self), compatibleWith: nil)!
        var aspectR: CGFloat = 0.0

        aspectR = image.size.width/image.size.height

        topBorderLine.translatesAutoresizingMaskIntoConstraints = false
        topBorderLine.image = image
        topBorderLine.contentMode = .scaleAspectFill

        NSLayoutConstraint.activate([
            topBorderLine.topAnchor.constraint(equalTo: mainView.topAnchor, constant: 0),
            topBorderLine.leadingAnchor.constraint(equalTo: mainView.leadingAnchor, constant: 0),
            topBorderLine.trailingAnchor.constraint(equalTo: mainView.trailingAnchor, constant: 0),
            topBorderLine.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width),
            topBorderLine.heightAnchor.constraint(equalTo: topBorderLine.widthAnchor, multiplier: 1/aspectR)
        ])
        
        
        closeButton.imageView?.layer.transform = CATransform3DMakeScale(1.5, 1.5, 1.5)
        
        titleView.font = UIFont(name: "PFSquareSansPro-Bold", size: 19)
        titleView.textColor = UIColor(rgb: 0x757575)
        
        nameView.font = UIFont(name: "PFSquareSansPro-Medium", size: 18)
        nameView.textColor = UIColor(rgb: 0x415564)
        
        hoursView.font = UIFont(name: "PFSquareSansPro-Regular", size: 18)
        hoursView.textColor = UIColor(rgb: 0xAEAEAE)
        
        hoursView.font = UIFont(name: "PFSquareSansPro-Medium", size: 18)
        hoursView.textColor = UIColor(rgb: 0x415564)
        
        addressView.font = UIFont(name: "PFSquareSansPro-Medium", size: 18)
        addressView.textColor = UIColor(rgb: 0x415564)
        
        //directionsButton.titleLabel?.font = UIFont(name: "PFSquareSansPro-Medium", size: 16)
        directionsButton.setTitle("Οδηγίες", for: .normal)
        directionsButton.setImage(UIImage(named: "ic_directions", in: Bundle(for: MyEmptyClass.self), compatibleWith: nil), for: .normal)

//        directionsButton.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 5);
//        directionsButton.titleEdgeInsets = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 0);
//        directionsButton.sizeToFit()
        //directionsButton.setTitleColor(.white, for: .normal)
        //directionsButton.backgroundColor = UIColor(red: 0.47, green: 0.75, blue: 0.08, alpha: 1.00)
        //directionsButton.layer.cornerRadius = 12.0
        
        load()
    }
    
    public override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        swiftApi().logTrackersEvent("screen", "ShopsScreen")
        
    }
    
    // mvp
    @objc func load() {
    
        if (loading) {
            return;
        }
        showLoading()
        
        if (couponSet != nil) {
            if let merchantUuid: String = couponSet?.merchant_uuid {
                swiftApi().getMultilingualMerchantsAsync([], false, 0.0, [], "", 0, [merchantUuid], getMerchantsCallback)
                showContent()
            }
        }
        
    }
    
    func getMerchantsCallback (_ merchantsData: Array<swiftApi.MerchantModel>?) -> Void {
        if (merchantsData != nil) {
            DispatchQueue.main.async {
                
                self.merchantsArray = merchantsData ?? []
                self.loadMapPins()

                let filteredMerchants = self.merchantsArray.filter({ return (($0._latitude != 0.0) && ($0._longitude != 0.0)) })
                if (filteredMerchants.count == 0) {
                    self.showDialog("Καταστήματα συνεργάτη", "Ο συνεργάτης διαθέτει μόνο ηλεκτρονικό κατάστημα για ηλεκτρονικές παραγγελίες.")
                }
            }
            
            return
        }
    }

    func showDialog(_ alertTitle: String, _ alertSubTitle: String) -> Void {

        let alert = UIAlertController(title: alertTitle, message: alertSubTitle, preferredStyle: .alert)
        
        let cancelButton = UIAlertAction(title: "Άκυρο", style: .default, handler: { action in
            switch action.style{
                case .default:
                self.navigationController?.popViewController(animated: true)
                self.dismiss(animated: true, completion: {})

                case .cancel:
                print("cancel")

                case .destructive:
                print("destructive")

            }
        })
        // cancelButton.setValue(UIColor(rgb: 0xFC5757), forKey: "titleTextColor")
        alert.addAction(cancelButton)

        alert.addAction(UIAlertAction(title: "Δες το eshop", style: .default, handler: { action in
            switch action.style{
                case .default:
                if (self.merchantsArray.count > 0) {
                    for item in self.merchantsArray {
                        let eshopWebsite = item._website
                        if (eshopWebsite != "") {
                            guard let websiteUrl = URL(string: eshopWebsite) else {
                                  print("Error creating URL")
                                  return
                            }
                           
                            // check if link can be opened.
                            guard UIApplication.shared.canOpenURL(websiteUrl) else {
                                return
                            }
                           
                            swiftApi().logTrackersEvent("click", "SeeShopWebsite")
                            UIApplication.shared.open(websiteUrl, options: [:], completionHandler: nil)
                            break;
                        }
                    }
                }
                
                case .cancel:
                print("cancel")

                case .destructive:
                print("destructive")

            }
        }))
        self.present(alert, animated: true, completion: nil)
    }
    
    private func showLoading() {
        
        loading = true
    }
    
    private func showError() {
    }
    
    private func showContent() {
        
        loading = false
    }
    
    // private
    @IBAction func closeButtonAction(_ sender: Any) {
        print("closeButton Pressed!!!")
        hidePinDetailsView()
        
        let selectedAnnotations = mapView.selectedAnnotations
         for annotation in selectedAnnotations {
              mapView.deselectAnnotation(annotation, animated: false)
        }
    }
    
    @IBAction func directionsButtomAction(_ sender: Any) {
        
        guard let lon = selectedMerchant?._longitude, let lat = selectedMerchant?._latitude  else {
            return
        }
        
        // guard your URL instances
//        guard let googleMapsUrl = URL(string: String(format: "https://www.google.com/maps/@%.6f,%.6f,6z", lat, lon)),
//              let appleMapsUrl = URL(string: String(format: "http://maps.apple.com/?ll=%.6f,%.6f", lat, lon)) else {
//                  print("Error creating URLs")
//                  return
//            }
        
        guard let googleMapsUrl = URL(string: "https://www.google.co.in/maps/dir/?saddr=&daddr=\(lat),\(lon)&directionsmode=driving"),
              let appleMapsUrl = URL(string: "http://maps.apple.com/?daddr=\(lat),\(lon)") else {
                  print("Error creating URLs")
                  return
            }
        
        // check if link can be opened with google maps.
        guard UIApplication.shared.canOpenURL(googleMapsUrl) else {
            UIApplication.shared.open(appleMapsUrl, options: [:], completionHandler: nil)
            return
        }
        
        UIApplication.shared.open(googleMapsUrl, options: [:], completionHandler: nil)
        
    }
    
    private func loadMapPins() {
        for item in merchantsArray {
            let pin = MerchantAnnotation(item)
            mapView.addAnnotation(pin)
            
//            self.annotationGroup.append(pin)
//            self.mapView.addAnnotations(self.annotationGroup)
//            self.mapView.showAnnotations(self.annotationGroup, animated: true)
            
//            let annotation = MKPointAnnotation()
//            annotation.coordinate.longitude = item._longitude
//            annotation.coordinate.latitude = item._latitude
//            annotation.title = item._admin_name  //This is the line to remove the optional annotation.title? from.
//            annotation.subtitle = item._admin_name
//            self.annotationGroup.append(annotation)
//            self.mapView.addAnnotations(self.annotationGroup)
//            self.mapView.showAnnotations(self.annotationGroup, animated: true)
            
//            let annotation = MKPointAnnotation()
//            let centerCoordinate = CLLocationCoordinate2D(latitude: item._latitude, longitude: item._longitude)
//            annotation.coordinate = centerCoordinate
//            annotation.title = "Pass Title here"
//            mapView.addAnnotation(annotation)
        }
//        mapView.showAnnotations(mapView.annotations, animated: true)
    }
    
    private func loadPinDetailsView(_ annotation: MerchantAnnotation) {
        self.selectedMerchant = annotation.model
        
        self.titleView.text = self.selectedMerchant?._admin_name
        self.nameImageView.load(link: self.selectedMerchant?._img_preview ?? "", placeholder: UIImage(), cache: URLCache())
        self.nameView.text = self.selectedMerchant?._name
        // TODO: Make dynamic
        self.hoursView.text = ""
        self.phoneView.text = self.selectedMerchant?._telephone
        self.addressView.text = self.selectedMerchant?._address
    }
    
    private func showPinDetailsView() {
        self.infoTopConstraint.constant = -320
        UIView.animate(withDuration: 1.0) {
            self.view.layoutIfNeeded()
        }
    }
    
    private func hidePinDetailsView() {
        self.selectedMerchant = nil
        
        self.infoTopConstraint.constant = 0
        UIView.animate(withDuration: 1.0) {
            self.view.layoutIfNeeded()
        }
    }
    
    // map view delegate
//    public func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
//
////        guard !(annotation is MKUserLocation) else {
////            return nil
////        }
//
//        var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: "warply_custom")
//        if (annotationView == nil) {
//            print("=== annotationView == nil ===")
//
//            annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "warply_custom")
//            annotationView?.canShowCallout = false
//        } else {
//            print("=== annotationView != nil ===")
//
//            annotationView?.annotation = annotation
//        }
//
//        // TODO: add custom pin image?
//        //annotationView?.image = UIImage(named: "custom")
//
//        print("=== returned annotation ===")
//        print(annotation)
//
//        return annotationView
//    }
    
    public func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
        let merchant = view.annotation as? MerchantAnnotation
        let merchantModel = merchant!.model
        swiftApi().logTrackersEvent("click", ("ShopsScreenMarker:" + (merchantModel._uuid)))
        
        loadPinDetailsView(merchant!)
        showPinDetailsView()
    }
    
    public func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
        hidePinDetailsView()
    }
}

private extension MKMapView {
    
  func centerToLocation(_ location: CLLocation, regionRadius: CLLocationDistance = 1000) {
    let coordinateRegion = MKCoordinateRegion(
      center: location.coordinate,
      latitudinalMeters: regionRadius,
      longitudinalMeters: regionRadius)
    setRegion(coordinateRegion, animated: true)
  }
}