import Foundation
import UIKit
import SceneKit
import Display
import AppBundle
import PremiumStarComponent

final class BadgeStarsView: UIView, PhoneDemoDecorationView {
    private let sceneView: SCNView
    
    private var leftParticles: SCNNode?
    private var rightParticles: SCNNode?
    
    override init(frame: CGRect) {
        self.sceneView = SCNView(frame: CGRect(origin: .zero, size: frame.size))
        self.sceneView.backgroundColor = .clear
        if let scene = loadCompressedScene(name: "badge", version: 1) {
            self.sceneView.scene = scene
        }
        self.sceneView.isUserInteractionEnabled = false
        self.sceneView.preferredFramesPerSecond = 60
        
        super.init(frame: frame)
        
        self.alpha = 0.0
        
        self.addSubview(self.sceneView)
        
        self.leftParticles = self.sceneView.scene?.rootNode.childNode(withName: "leftParticles", recursively: false)
        self.rightParticles = self.sceneView.scene?.rootNode.childNode(withName: "rightParticles", recursively: false)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func setVisible(_ visible: Bool) {
        if visible, let leftParticles = self.leftParticles, let rightParticles = self.rightParticles, leftParticles.parent == nil {
            self.sceneView.scene?.rootNode.addChildNode(leftParticles)
            self.sceneView.scene?.rootNode.addChildNode(rightParticles)
        }
        
        let transition = ContainedViewLayoutTransition.animated(duration: 0.3, curve: .linear)
        transition.updateAlpha(layer: self.layer, alpha: visible ? 0.5 : 0.0, completion: { [weak self] finished in
            if let strongSelf = self, finished && !visible && strongSelf.leftParticles?.parent != nil {
                strongSelf.leftParticles?.removeFromParentNode()
                strongSelf.rightParticles?.removeFromParentNode()
            }
        })
    }
    
    func resetAnimation() {
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        self.sceneView.frame = CGRect(origin: .zero, size: frame.size)
    }
}

final class EmojiStarsView: UIView, PhoneDemoDecorationView {
    private let sceneView: SCNView
    
    private var leftParticles: SCNNode?
    private var rightParticles: SCNNode?
    
    override init(frame: CGRect) {
        self.sceneView = SCNView(frame: CGRect(origin: .zero, size: frame.size))
        self.sceneView.backgroundColor = .clear
        if let scene = loadCompressedScene(name: "emoji", version: 1) {
            self.sceneView.scene = scene
        }
        self.sceneView.isUserInteractionEnabled = false
        self.sceneView.preferredFramesPerSecond = 60
        
        super.init(frame: frame)
        
        self.alpha = 0.0
        
        self.addSubview(self.sceneView)
        
        self.leftParticles = self.sceneView.scene?.rootNode.childNode(withName: "leftParticles", recursively: false)
        self.rightParticles = self.sceneView.scene?.rootNode.childNode(withName: "rightParticles", recursively: false)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func setVisible(_ visible: Bool) {
        if visible, let leftParticles = self.leftParticles, let rightParticles = self.rightParticles, leftParticles.parent == nil {
            self.sceneView.scene?.rootNode.addChildNode(leftParticles)
            self.sceneView.scene?.rootNode.addChildNode(rightParticles)
        }
        
        let transition = ContainedViewLayoutTransition.animated(duration: 0.3, curve: .linear)
        transition.updateAlpha(layer: self.layer, alpha: visible ? 0.5 : 0.0, completion: { [weak self] finished in
            if let strongSelf = self, finished && !visible && strongSelf.leftParticles?.parent != nil {
                strongSelf.leftParticles?.removeFromParentNode()
                strongSelf.rightParticles?.removeFromParentNode()
            }
        })
    }
    
    func resetAnimation() {
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        self.sceneView.frame = CGRect(origin: .zero, size: frame.size)
    }
}

final class TagStarsView: UIView, PhoneDemoDecorationView {
    private let sceneView: SCNView
    
    private var leftParticles: SCNNode?
    private var rightParticles: SCNNode?
    
    override init(frame: CGRect) {
        self.sceneView = SCNView(frame: CGRect(origin: .zero, size: frame.size))
        self.sceneView.backgroundColor = .clear
        if let scene = loadCompressedScene(name: "tag", version: 1) {
            self.sceneView.scene = scene
        }
        self.sceneView.isUserInteractionEnabled = false
        self.sceneView.preferredFramesPerSecond = 60
        
        super.init(frame: frame)
        
        self.alpha = 0.0
        
        self.addSubview(self.sceneView)
        
        self.leftParticles = self.sceneView.scene?.rootNode.childNode(withName: "leftParticles", recursively: false)
        self.rightParticles = self.sceneView.scene?.rootNode.childNode(withName: "rightParticles", recursively: false)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func setVisible(_ visible: Bool) {
        if visible, let leftParticles = self.leftParticles, let rightParticles = self.rightParticles, leftParticles.parent == nil {
            self.sceneView.scene?.rootNode.addChildNode(leftParticles)
            self.sceneView.scene?.rootNode.addChildNode(rightParticles)
        }
        
        let transition = ContainedViewLayoutTransition.animated(duration: 0.3, curve: .linear)
        transition.updateAlpha(layer: self.layer, alpha: visible ? 0.5 : 0.0, completion: { [weak self] finished in
            if let strongSelf = self, finished && !visible && strongSelf.leftParticles?.parent != nil {
                strongSelf.leftParticles?.removeFromParentNode()
                strongSelf.rightParticles?.removeFromParentNode()
            }
        })
    }
    
    func resetAnimation() {
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        self.sceneView.frame = CGRect(origin: .zero, size: frame.size)
    }
}