using Raylib;
using static Raylib.Raylib;
//using static Raylib.Key;
//using static Raylib.Mouse;

public partial class core_2d_camera
{
    /*******************************************************************************************
    *
    *   raylib [core] example - 2d camera
    *
    *   This example has been created using raylib 1.5 (www.raylib.com)
    *   raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
    *
    *   Copyright (c) 2016 Ramon Santamaria (@raysan5)
    *
    ********************************************************************************************/
    
    
    public const int MAX_BUILDINGS = 100;
    
    public static int Main()
    {
        // Initialization
        //--------------------------------------------------------------------------------------
        int screenWidth = 800;
        int screenHeight = 450;
    
        InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera");
        
        Rectangle player = new Rectangle( 400, 280, 40, 40 );
        Rectangle[] buildings = new Rectangle[MAX_BUILDINGS];
        Color[] buildColors = new Color[MAX_BUILDINGS];
        
        int spacing = 0;
        
        for (int i = 0; i < MAX_BUILDINGS; i++)
        {
            buildings[i].width = GetRandomValue(50, 200);
            buildings[i].height = GetRandomValue(100, 800);
            buildings[i].y = screenHeight - 130 - buildings[i].height;
            buildings[i].x = -6000 + spacing;
    
            spacing += (int)buildings[i].width;
            
            buildColors[i] = new Color( GetRandomValue(200, 240), GetRandomValue(200, 240), GetRandomValue(200, 250), 255 );
        }
        
        Camera2D camera;
        
        camera.target = new Vector2( player.x + 20, player.y + 20 );
        camera.offset = new Vector2( 0, 0 );
        camera.rotation = 0.0f;
        camera.zoom = 1.0f;
        
        SetTargetFPS(60);
        //--------------------------------------------------------------------------------------
    
        // Main game loop
        while (!WindowShouldClose())    // Detect window close button or ESC key
        {
            // Update
            //----------------------------------------------------------------------------------
            if (IsKeyDown(KEY_RIGHT))
            {
                player.x += 2;              // Player movement
                camera.offset.x -= 2;       // Camera3D displacement with player movement
            }
            else if (IsKeyDown(KEY_LEFT))
            {
                player.x -= 2;              // Player movement
                camera.offset.x += 2;       // Camera3D displacement with player movement
            }
            
            // Camera3D target follows player
            camera.target = new Vector2( player.x + 20, player.y + 20 );
            
            // Camera3D rotation controls
            if (IsKeyDown(KEY_A)) camera.rotation--;
            else if (IsKeyDown(KEY_S)) camera.rotation++;
            
            // Limit camera rotation to 80 degrees (-40 to 40)
            if (camera.rotation > 40) camera.rotation = 40;         
            else if (camera.rotation < -40) camera.rotation = -40;
            
            // Camera3D zoom controls
            camera.zoom += ((float)GetMouseWheelMove()*0.05f);
            
            if (camera.zoom > 3.0f) camera.zoom = 3.0f;
            else if (camera.zoom < 0.1f) camera.zoom = 0.1f;
            
            // Camera3D reset (zoom and rotation)
            if (IsKeyPressed((int)KEY_R)) 
            {
                camera.zoom = 1.0f;
                camera.rotation = 0.0f;
            }
            //----------------------------------------------------------------------------------
    
            // Draw
            //----------------------------------------------------------------------------------
            BeginDrawing();
            
                ClearBackground(RAYWHITE);
            
                BeginMode2D(camera);
    
                    DrawRectangle(-6000, 320, 13000, 8000, DARKGRAY);
                    
                    for (int i = 0; i < MAX_BUILDINGS; i++) DrawRectangleRec(buildings[i], buildColors[i]);
                    
                    DrawRectangleRec(player, RED);
                    
                    DrawRectangle((int)camera.target.x, -500, 1, screenHeight*4, GREEN);
                    DrawRectangle(-500, (int)camera.target.y, screenWidth*4, 1, GREEN);
                    
                EndMode2D();
                
                DrawText("SCREEN AREA", 640, 10, 20, RED);
                
                DrawRectangle(0, 0, screenWidth, 5, RED);
                DrawRectangle(0, 5, 5, screenHeight - 10, RED);
                DrawRectangle(screenWidth - 5, 5, 5, screenHeight - 10, RED);
                DrawRectangle(0, screenHeight - 5, screenWidth, 5, RED);
                
                DrawRectangle( 10, 10, 250, 113, Fade(SKYBLUE, 0.5f));
                DrawRectangleLines( 10, 10, 250, 113, BLUE);
                
                DrawText("Free 2d camera controls:", 20, 20, 10, BLACK);
                DrawText("- Right/Left to move Offset", 40, 40, 10, DARKGRAY);
                DrawText("- Mouse Wheel to Zoom in-out", 40, 60, 10, DARKGRAY);
                DrawText("- A / S to Rotate", 40, 80, 10, DARKGRAY);
                DrawText("- R to reset Zoom and Rotation", 40, 100, 10, DARKGRAY);
    
            EndDrawing();
            //----------------------------------------------------------------------------------
        }
    
        // De-Initialization
        //--------------------------------------------------------------------------------------   
        CloseWindow();        // Close window and OpenGL context
        //--------------------------------------------------------------------------------------
    
        return 0;
    }    
}