//
//  ViewController.swift
//  Pendu
//
//  Created by Sofiane Lasri-Trienpont on 09/05/2023.
//

import UIKit

extension UIView {
    func addBackground(imageName: String = "fond_acceuil.png", contentMode: UIView.ContentMode = .scaleToFill) {
        // setup the UIImageView
        let backgroundImageView = UIImageView(frame: UIScreen.main.bounds)
        backgroundImageView.image = UIImage(named: imageName)
        backgroundImageView.contentMode = contentMode
        backgroundImageView.translatesAutoresizingMaskIntoConstraints = false

        addSubview(backgroundImageView)
        sendSubviewToBack(backgroundImageView)

        // adding NSLayoutConstraints
        let leadingConstraint = NSLayoutConstraint(item: backgroundImageView, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1.0, constant: 0.0)
        let trailingConstraint = NSLayoutConstraint(item: backgroundImageView, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1.0, constant: 0.0)
        let topConstraint = NSLayoutConstraint(item: backgroundImageView, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 0.0)
        let bottomConstraint = NSLayoutConstraint(item: backgroundImageView, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1.0, constant: 0.0)

        NSLayoutConstraint.activate([leadingConstraint, trailingConstraint, topConstraint, bottomConstraint])
    }
}

class GameViewController: UIViewController {

    @IBOutlet weak var wordLabel: UILabel!
    @IBOutlet weak var score: UILabel!
    
    @IBOutlet weak var A_Button: UIButton!
    @IBOutlet weak var Z_Button: UIButton!
    @IBOutlet weak var E_Button: UIButton!
    @IBOutlet weak var R_Button: UIButton!
    @IBOutlet weak var T_Button: UIButton!
    @IBOutlet weak var Y_Button: UIButton!
    @IBOutlet weak var U_Button: UIButton!
    @IBOutlet weak var I_Button: UIButton!
    @IBOutlet weak var O_Button: UIButton!
    @IBOutlet weak var P_Button: UIButton!
    @IBOutlet weak var Q_Button: UIButton!
    @IBOutlet weak var S_Button: UIButton!
    @IBOutlet weak var D_Button: UIButton!
    @IBOutlet weak var F_Button: UIButton!
    @IBOutlet weak var G_Button: UIButton!
    @IBOutlet weak var H_Button: UIButton!
    @IBOutlet weak var J_Button: UIButton!
    @IBOutlet weak var K_Button: UIButton!
    @IBOutlet weak var L_Button: UIButton!
    @IBOutlet weak var M_Button: UIButton!
    @IBOutlet weak var W_Button: UIButton!
    @IBOutlet weak var X_Button: UIButton!
    @IBOutlet weak var C_Button: UIButton!
    @IBOutlet weak var V_Button: UIButton!
    @IBOutlet weak var B_Button: UIButton!
    @IBOutlet weak var N_Button: UIButton!
    
    @IBAction func A_Action(_ sender: Any) {
        InputButton(inputButton: A_Button)
    }
    @IBAction func Z_Action(_ sender: Any) {
        InputButton(inputButton: Z_Button)
    }
    @IBAction func E_Action(_ sender: Any) {
        InputButton(inputButton: E_Button)
    }
    @IBAction func R_Action(_ sender: Any) {
        InputButton(inputButton: R_Button)
    }
    @IBAction func T_Action(_ sender: Any) {
        InputButton(inputButton: T_Button)
    }
    @IBAction func Y_Action(_ sender: Any) {
        InputButton(inputButton: Y_Button)
    }
    @IBAction func U_Action(_ sender: Any) {
        InputButton(inputButton: U_Button)
    }
    @IBAction func I_Action(_ sender: Any) {
        InputButton(inputButton: I_Button)
    }
    @IBAction func O_action(_ sender: Any) {
        InputButton(inputButton: O_Button)
    }
    @IBAction func P_Action(_ sender: Any) {
        InputButton(inputButton: P_Button)
    }
    @IBAction func Q_Action(_ sender: Any) {
        InputButton(inputButton: Q_Button)
    }
    @IBAction func S_Action(_ sender: Any) {
        InputButton(inputButton: S_Button)
    }
    @IBAction func D_Action(_ sender: Any) {
        InputButton(inputButton: D_Button)
    }
    @IBAction func F_Action(_ sender: Any) {
        InputButton(inputButton: F_Button)
    }
    @IBAction func G_Action(_ sender: Any) {
        InputButton(inputButton: G_Button)
    }
    @IBAction func H_Action(_ sender: Any) {
        InputButton(inputButton: H_Button)
    }
    @IBAction func J_Action(_ sender: Any) {
        InputButton(inputButton: J_Button)
    }
    @IBAction func K_Action(_ sender: Any) {
        InputButton(inputButton: K_Button)
    }
    @IBAction func L_Action(_ sender: Any) {
        InputButton(inputButton: L_Button)
    }
    @IBAction func M_Action(_ sender: Any) {
        InputButton(inputButton: M_Button)
    }
    @IBAction func W_Action(_ sender: Any) {
        InputButton(inputButton: W_Button)
    }
    @IBAction func X_Action(_ sender: Any) {
        InputButton(inputButton: X_Button)
    }
    @IBAction func C_Action(_ sender: Any) {
        InputButton(inputButton: C_Button)
    }
    @IBAction func V_Action(_ sender: Any) {
        InputButton(inputButton: V_Button)
    }
    @IBAction func B_Action(_ sender: Any) {
        InputButton(inputButton: B_Button)
    }
    @IBAction func N_Action(_ sender: Any) {
        InputButton(inputButton: N_Button)
    }
    
    
    
    func InputButton(inputButton: UIButton) {
        guard let letter = inputButton.titleLabel?.text else {
            return
        }
        guessLetter(String(letter))
        inputButton.isEnabled = false
    }


    var currentWordState: [String] = []
    
    var gameEngine : GameEngine = GameEngine()
    
    var wordToGuess = ""
    
    var isWordFound = false
    
    var incorrectGuesses = 0
    
    override func viewDidLoad() {
        view.addBackground()
        
        wordToGuess = gameEngine.getWordToGuess()
        
        super.viewDidLoad()
        initializeWordState()
        updateWordLabel()
        updateImage()
        
        score.textColor = UIColor.white
        score.text = "Score : 0"
        
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 40))
        label.center = CGPoint(x: 170, y: 230)
        label.font = UIFont(name: "whatever it takes", size: 40)
        label.textAlignment = .center
        label.textColor = UIColor.white
        label.text = "Pendu"
        self.view.addSubview(label)
    }
    
    func initializeWordState() {
          let words = wordToGuess.components(separatedBy: " ")
        print(words)
          for word in words {
              var wordState = ""
              for _ in word {
                  wordState += "_"
              }
              currentWordState.append(wordState)
          }
      }
    
    func updateWordLabel() {
        let wordString = currentWordState.joined(separator: " ")
        wordLabel.text = wordString
    }
    
    func checkIfWordFound() {
        if currentWordState.joined() == wordToGuess {
            isWordFound = true
            wordLabel.textColor = UIColor.green
            A_Button.isHidden = true
            Z_Button.isHidden = true
            E_Button.isHidden = true
            R_Button.isHidden = true
            T_Button.isHidden = true
            Y_Button.isHidden = true
            U_Button.isHidden = true
            I_Button.isHidden = true
            O_Button.isHidden = true
            P_Button.isHidden = true
            Q_Button.isHidden = true
            S_Button.isHidden = true
            D_Button.isHidden = true
            F_Button.isHidden = true
            G_Button.isHidden = true
            H_Button.isHidden = true
            J_Button.isHidden = true
            K_Button.isHidden = true
            L_Button.isHidden = true
            M_Button.isHidden = true
            W_Button.isHidden = true
            X_Button.isHidden = true
            C_Button.isHidden = true
            V_Button.isHidden = true
            B_Button.isHidden = true
            N_Button.isHidden = true
            
            let emmitterLayer = CAEmitterLayer()
            emmitterLayer.emitterPosition = CGPoint(x: view.bounds.width / 2, y: view.bounds.height / 2)
            emmitterLayer.emitterShape = .point
            emmitterLayer.emitterMode = .outline
            emmitterLayer.emitterSize = CGSize(width: 5, height: 0)
            
            let confetti = CAEmitterCell()
            confetti.birthRate = 3
            confetti.lifetime = 50
            confetti.velocity = 100
            confetti.velocityRange = 50
            confetti.emissionLongitude = .pi
            confetti.spin = 2
            confetti.spinRange = 8
            confetti.scaleRange = 0.5
            confetti.contents = UIImage(named: "confetti.png")?.cgImage
            
            emmitterLayer.emitterCells = [confetti]
            
            view.layer.addSublayer(emmitterLayer)
            
            emmitterLayer.beginTime = CACurrentMediaTime()
            
            DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                emmitterLayer.removeFromSuperlayer()
            }
            
        }
    }
    
    func guessLetter(_ letter:String) {
            let guessedLetter = letter.uppercased()
            
            var updateWordState = currentWordState

            let guessedCorrectly = gameEngine.guessLetter(letter: Character(letter))
            score.text = "Score : " + String(gameEngine.getScore())
        
            for (wordIndex, word) in wordToGuess.components(separatedBy: " ").enumerated() {
                var updateWord = ""
                let wordCharacters = Array(currentWordState[wordIndex])
                for (charIndex, char) in word.enumerated() {
                    let currentChar = String(char)
                    
                    if currentChar.uppercased() == guessedLetter {
                        updateWord += currentChar
//                        guessedCorrectly = true
                    } else {
                        let currentWordStateChar = String(wordCharacters[charIndex])
                        updateWord += currentWordStateChar
                    }
                }
                updateWordState[wordIndex] = updateWord
            }
            currentWordState = updateWordState
            updateWordLabel()
            checkIfWordFound()
        
            if !guessedCorrectly {
                updateImage()
            }
        }
    
    
    func updateImage() {
        let maxIncorrectGuesses = 8
        
        let imageName: String
        
        incorrectGuesses += 1
        
        if incorrectGuesses <= maxIncorrectGuesses - 1 {
            imageName = "humain\(incorrectGuesses)"
        } else {
            imageName = "humain8"
            wordLabel.textColor = UIColor.red
            wordLabel.text = "Perdu"
            A_Button.isHidden = true
            Z_Button.isHidden = true
            E_Button.isHidden = true
            R_Button.isHidden = true
            T_Button.isHidden = true
            Y_Button.isHidden = true
            U_Button.isHidden = true
            I_Button.isHidden = true
            O_Button.isHidden = true
            P_Button.isHidden = true
            Q_Button.isHidden = true
            S_Button.isHidden = true
            D_Button.isHidden = true
            F_Button.isHidden = true
            G_Button.isHidden = true
            H_Button.isHidden = true
            J_Button.isHidden = true
            K_Button.isHidden = true
            L_Button.isHidden = true
            M_Button.isHidden = true
            W_Button.isHidden = true
            X_Button.isHidden = true
            C_Button.isHidden = true
            V_Button.isHidden = true
            B_Button.isHidden = true
            N_Button.isHidden = true
        }
        
        let image = UIImage(named: imageName)
        let imageView = UIImageView(image: image!)
        imageView.frame = CGRect(x: 50, y: 250, width: 250, height: 250)
        view.addSubview(imageView)
        
        if let image = UIImage(named: imageName) {
            imageView.image = image
        }
    }
    
    
}