//
//  LeftImageTableViewCell.swift
//  WoWonder
//
//  Created by Mac on 10/11/22.
//  Copyright © 2022 ScriptSun. All rights reserved.
//

import UIKit

class LeftImageTableViewCell: SwipeToReplyCell {
    
    @IBOutlet weak var cellView: UIView!
    @IBOutlet weak var messageView: UIView!
    @IBOutlet weak var forwardedView: UIView!
    @IBOutlet weak var replyStoryView: UIView!
    @IBOutlet weak var replyStoryBorderView: UIView!
    @IBOutlet weak var replyStoryTitleLabel: UILabel!
    @IBOutlet weak var replyStoryMessageLabel: UILabel!
    @IBOutlet weak var replyStoryImageView: UIImageView!
    @IBOutlet weak var reactionImageView: UIImageView!
    @IBOutlet weak var replyMessageView: UIView!
    @IBOutlet weak var replyBorderView: UIView!
    @IBOutlet weak var replyUserLabel: UILabel!
    @IBOutlet weak var replyMessageLabel: UILabel!
    @IBOutlet weak var messageImageView: UIView!
    @IBOutlet weak var messageImageButton: UIButton!
    @IBOutlet weak var messageTextLabel: UILabel!
    @IBOutlet weak var sendImageView: UIImageView!
    @IBOutlet weak var userStackView: UIStackView!
    @IBOutlet weak var userImageView: UIImageView!
    @IBOutlet weak var userNameLabel: UILabel!
    @IBOutlet weak var messageTimeLabel: UILabel!
    @IBOutlet weak var starImageView: UIImageView!
    @IBOutlet weak var blurView: UIVisualEffectView!
    @IBOutlet weak var downloadView: UIView!
    @IBOutlet weak var downloadButton: UIButton!
    
    var progressView: UIProgressView!
    var imageUrl: URL?
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        self.messageView.clipsToBounds = true
        self.messageView.layer.cornerRadius = 16
        self.messageView.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMinXMaxYCorner, .layerMaxXMinYCorner]
        
        setupProgressView()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }
    
    @IBAction func downloadButtonAction(_ sender: UIButton) {
        guard let url = self.imageUrl else {
            appDelegate.window?.rootViewController?.view.makeToast("The image URL is not valid.")
            return
        }
        downloadImage(from: url)
    }
    
    func setupProgressView() {
        progressView = UIProgressView(progressViewStyle: .default)
        progressView.center = self.messageImageView.center
        self.messageImageView.insertSubview(self.progressView, aboveSubview: self.blurView)
        progressView.isHidden = true
    }
    
    func downloadImage(from url: URL) {
        self.downloadView.isHidden = true
        progressView.isHidden = false
        progressView.progress = 0.0
        
        MediaDownloader.shared.downloadFile(from: url, progressHandler: { progress in
            DispatchQueue.main.async {
                self.progressView.progress = progress
            }
        }) { result in
            DispatchQueue.main.async {
                self.progressView.isHidden = true
            }
            switch result {
            case .success(let localPath):
                DispatchQueue.main.async {
                    if let image = UIImage(contentsOfFile: localPath.path) {
                        self.sendImageView.image = image
                        MediaDownloader.shared.saveImageToPhotos(image: image) { success, error in
                            DispatchQueue.main.async {
                                if success {
                                    self.blurView.isHidden = true
                                    appDelegate.window?.rootViewController?.view.makeToast("Image saved to Photos.")
                                } else if let error = error {
                                    appDelegate.window?.rootViewController?.view.makeToast(error.localizedDescription)
                                }
                            }
                        }
                    } else {
                        DispatchQueue.main.async {
                            appDelegate.window?.rootViewController?.view.makeToast("Invalid image data")
                        }
                    }
                }
            case .failure(let error):
                DispatchQueue.main.async {
                    appDelegate.window?.rootViewController?.view.makeToast(error.localizedDescription)
                }
            }
        }
    }
    
    func loadImage(from url: URL) {
        DispatchQueue.global().async {
            if let data = try? Data(contentsOf: url), let image = UIImage(data: data) {
                DispatchQueue.main.async {
                    self.sendImageView.image = image
                }
            }
        }
    }
    
}
