﻿// Copyright (c) 2014 CrossGFX Team

// This is free and unencumbered software released into the public domain.

// Anyone is free to copy, modify, publish, use, compile, sell, or
// distribute this software, either in source code form or as a compiled
// binary, for any purpose, commercial or non-commercial, and by any
// means.

// In jurisdictions that recognize copyright laws, the author or authors
// of this software dedicate any and all copyright interest in the
// software to the public domain. We make this dedication for the benefit
// of the public at large and to the detriment of our heirs and
// successors. We intend this dedication to be an overt act of
// relinquishment in perpetuity of all present and future rights to this
// software under copyright law.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.

// For more information, please refer to <http://unlicense.org/>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using SFML.Window;
using SFML.Graphics;
using Tao.OpenGl;
using System.Diagnostics;

namespace crossGFX.SFMLRenderer
{
    class System : ISystem
    {
        Stopwatch stopwatch;
        public IClipboard Clipboard { get; private set; }

        public System(IClipboard clipboard) {
            stopwatch = new Stopwatch();
            this.Clipboard = clipboard;
        }

        Window displayWindow;

        public IWindow DisplayWindow {
            get { return displayWindow; }
        }

        public int TargetFPS {
            set {
                displayWindow.RenderWindow.SetFramerateLimit((uint)value);
            }
        }

        public IWindow CreateWindow(int width, int height, bool fullScreen) {
            Styles style;

            if (fullScreen) {
                style = Styles.Fullscreen;
            } else {
                style = Styles.Titlebar | Styles.Close | Styles.Resize;
            }

            Window window = new Window(new RenderWindow(new VideoMode((uint)width, (uint)height), "[CrossGFX] SFML_App", style));

            displayWindow = window;

            return window;
        }

        public void PrepareSystem() {
            stopwatch.Start();
            displayWindow.RaiseOnInitialize();
            displayWindow.RenderWindow.SetActive();
        }

        public bool ShouldProcessEvents(IWindow window) {
            Window displayWindow = window as Window;

            return displayWindow.RenderWindow.IsOpen();
        }

        public void Run() {
            PrepareSystem();
            while (ShouldProcessEvents(displayWindow)) {
                RunOnce();
            }
        }

        public void RunOnce() {
            uint currentTickCount = GetTickCount();

            // Update
            displayWindow.RenderWindow.DispatchEvents();
            DriverManager.ActiveDriver.MusicPlayer.Update(currentTickCount);
            displayWindow.HandleUpdate(currentTickCount);

            // Draw
            displayWindow.RenderWindow.Clear();
            displayWindow.RaiseOnDraw(currentTickCount);
            displayWindow.RenderWindow.Display();
        }

        public void Cleanup() {
        }

        public uint GetTickCount() {
            return (uint)stopwatch.ElapsedMilliseconds;
        }
    }
}
