#include <iostream>

#include "SFML/Graphics.hpp"
#include "headers/Player.h"
#include "headers/Bullet.h"
#include "headers/Background.h"
#include "headers/AudioManager.h"
#include "headers/Meteor.h"
#include "headers/Plansza.h"

int main()
{
    std::clog << "Game started\n";
    sf::RenderWindow mainWindow(sf::VideoMode(600, 800), "My mainWindow");
    mainWindow.setVerticalSyncEnabled(true);
    mainWindow.setFramerateLimit(60);
    Plansza plansza(mainWindow.getSize().y, mainWindow.getSize().x);

    Background background("../assets/img/space.png", 2.0f); //tutaj predkosc tla, mozna zwiekszyc jak za wolno


    AudioManager audioManager;
    if (!audioManager.loadBackgroundMusic("../assets/music/background.ogg")) {
        return -1;
    }
    audioManager.playBackgroundMusic();

    audioManager.loadSoundEffect("shoot", "../assets/sounds/shoot.ogg");
    audioManager.loadSoundEffect("shoot_alt", "../assets/sounds/shoot_alt.ogg");

    // TODO: Przenieść tworzenie statku wewnątrz klasy Plansza
    Player ship(mainWindow.getSize().x / 2, mainWindow.getSize().y - 100, "../assets/ship/Dreadnought-Base.png"); // tworzenie statku
    ship.setMovingSpeed(8);
    ship.setFirerate(200);

    while (mainWindow.isOpen()) {
        mainWindow.clear();

        // tło
        background.update();
        background.draw(mainWindow);

        // Tu są handlowane eventy
        sf::Event event{};
        while (mainWindow.pollEvent(event)) {
            if(event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
                mainWindow.close();
        }

        // poruszanie się statkiem
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::A)) {
            if(ship.getPosition().x > 50) {
                ship.moveLeft();
            }
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) {
            if(ship.getPosition().y > 80) {
                ship.moveUp();
            }
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) {
            if(ship.getPosition().y < 720) {
                ship.moveDown();
            }
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) {
            if(ship.getPosition().x < 550) {
                ship.moveRight();
            }
        }

        // strzelanie ze statku
        if(sf::Mouse::isButtonPressed(sf::Mouse::Left)) {
            ship.shoot();
            audioManager.playSoundEffect("shoot", 70.f); // Odtworzenie dźwięku wystrzału
        }
        if(sf::Mouse::isButtonPressed(sf::Mouse::Right)) {
            ship.alternate_shoot();
            audioManager.playSoundEffect("shoot_alt", 70.f); // Odtworzenie dźwięku dla alternatywnego strzału
        }

        // generowanie nowego meteoru
        plansza.spawn_meteor();


        // utrzymanie meteorów i pocisków w ruchu
        for (auto& meteor : plansza.getMeteors()) {
            meteor.update();
            mainWindow.draw(meteor.getSprite());
        }

        for (auto& bullet : ship.getBullets()) {
            bullet.update();
            mainWindow.draw(bullet.getSprite());
        }

        // Sprawdzenie czy meteory i pociski są poza granicami ekranu
        plansza.update_meteors();
        ship.updateBullets();

        mainWindow.draw(ship.getSprite());

        // trochę dziwny sposób ale jednak działa
        for (auto& meteor : plansza.getMeteors()) {
            if(ship.getSprite().getGlobalBounds().intersects(meteor.getSprite().getGlobalBounds())) {
                std::cout << "You lost the game!\n";
                sf::RenderWindow errorWindow(sf::VideoMode(350, 200), "The end");
                sf::Font font;
                if (!font.loadFromFile("../assets/fonts/arial.ttf")) {
                    std::cerr << "Error loading font\n";
                    return -1;
                }
                sf::Text text("Your ship is destroyed!", font, 24);
                text.setFillColor(sf::Color::Red);
                text.setPosition(50, 80);

                while (errorWindow.isOpen()) {
                    sf::Event event;
                    while (errorWindow.pollEvent(event)) {
                        if (event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) {
                            errorWindow.close();
                            mainWindow.close();
                            exit(-2);
                        }
                    }
                    errorWindow.clear();
                    errorWindow.draw(text);
                    errorWindow.display();
                }
            }
        }

        for (auto meteorIt = plansza.getMeteors().begin(); meteorIt != plansza.getMeteors().end(); ) {
            bool meteorHit = false;
            for (auto bulletIt = ship.getBullets().begin(); bulletIt != ship.getBullets().end(); ) {
                if (meteorIt->getSprite().getGlobalBounds().intersects(bulletIt->getSprite().getGlobalBounds())) {
                    bulletIt = ship.getBullets().erase(bulletIt);
                    meteorIt = plansza.getMeteors().erase(meteorIt);
                    meteorHit = true;
                    break;
                } else {
                    ++bulletIt;
                }
            }
            if (!meteorHit) {
                ++meteorIt;
            }
        }

        mainWindow.display();
    }

    return 0;
}