// Copyright (C) 2019 Parrot Drones SAS
//
//    Redistribution and use in source and binary forms, with or without
//    modification, are permitted provided that the following conditions
//    are met:
//    * Redistributions of source code must retain the above copyright
//      notice, this list of conditions and the following disclaimer.
//    * Redistributions in binary form must reproduce the above copyright
//      notice, this list of conditions and the following disclaimer in
//      the documentation and/or other materials provided with the
//      distribution.
//    * Neither the name of the Parrot Company nor the names
//      of its contributors may be used to endorse or promote products
//      derived from this software without specific prior written
//      permission.
//
//    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
//    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
//    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
//    FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
//    PARROT COMPANY BE LIABLE FOR ANY DIRECT, INDIRECT,
//    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
//    BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
//    OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
//    AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
//    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
//    OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
//    SUCH DAMAGE.

import UIKit
import GroundSdk

class MediaStoreResourceThumbnailList: UIViewController {

    @IBOutlet weak var collectionView: UICollectionView!

    private let groundSdk = GroundSdk()
    private var droneUid: String?
    private var mediaStore: MediaStore?
    private var media: MediaItem?

    private var resourceList = [MediaItem.Resource]()

    func set(droneUid: String, mediaStore: MediaStore, media: MediaItem) {
        self.droneUid = droneUid
        self.mediaStore = mediaStore
        self.media = media
        resourceList = media.resources
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // when user taps on this screen, dismiss it
        let gesture = UITapGestureRecognizer(target: self, action: #selector(dismissTouched))
        view.addGestureRecognizer(gesture)
    }

    @objc
    func dismissTouched() {
        presentingViewController?.dismiss(animated: true)
    }
}

extension MediaStoreResourceThumbnailList: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return resourceList.count
    }

    func collectionView(_ collectionView: UICollectionView,
                        cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ResourceThumbnailCell", for: indexPath)
        if let cell = cell as? ResourceThumbnailCell {
            let resource = resourceList[indexPath.row]
            cell.updateWith(mediaStore: mediaStore!, resource: resource)
        }
        return cell
    }
}

class ResourceThumbnailCell: UICollectionViewCell {
    @IBOutlet weak var thumbnailView: UIImageView!

    var thumbnail: Ref<UIImage>?

    func updateWith(mediaStore: MediaStore, resource: MediaItem.Resource) {
        thumbnail = mediaStore.newThumbnailDownloader(resource: resource) { [weak self] image in
            if let image = image {
                self?.thumbnailView.image = image
            }
        }
    }

    override func prepareForReuse() {
        thumbnail = nil
        thumbnailView.image = #imageLiteral(resourceName: "thumbnail")
    }
}
