/**********************************************************************************************
*
*   raylib - transmission mission
*
*
*   Copyright (c) 2014-2018 Ramon Santamaria (@raysan5)
*
*   This software is provided "as-is", without any express or implied warranty. In no event
*   will the authors be held liable for any damages arising from the use of this software.
*
*   Permission is granted to anyone to use this software for any purpose, including commercial
*   applications, and to alter it and redistribute it freely, subject to the following restrictions:
*
*     1. The origin of this software must not be misrepresented; you must not claim that you
*     wrote the original software. If you use this software in a product, an acknowledgment
*     in the product documentation would be appreciated but is not required.
*
*     2. Altered source versions must be plainly marked as such, and must not be misrepresented
*     as being the original software.
*
*     3. This notice may not be removed or altered from any source distribution.
*
**********************************************************************************************/

#include "raylib.h"
#include "screens.h"

#include <string.h>
#include <stdlib.h>

#define MISSION_MAX_LENGTH 256
#define KEYWORD_MAX_LENGTH 32
#define MAX_LINE_CHAR 75

//----------------------------------------------------------------------------------
// Global Variables Definition (local to this module)
//----------------------------------------------------------------------------------

// Mission screen global variables
static int framesCounter;
static int finishScreen;

static Texture2D texBackground;

static Texture2D texBackline; //mission_backline
static Rectangle sourceRecBackLine;
static Rectangle destRecBackLine;
static float fadeBackLine;

static Vector2 numberPosition;
static Color numberColor;

//static char textMission[MISSION_MAX_LENGTH];
static Vector2 missionPosition;
static int missionSize;
static Color missionColor;
static int missionLenght;
static bool missionMaxLength;
static int missionSpeed;

//static char textKeyword[KEYWORD_MAX_LENGTH];
static Vector2 keywordPosition;
static Color keywordColor;

static int showMissionWaitFrames;
static int showNumberWaitFrames;
static int showKeywordWaitFrames;

static bool startWritting;
static bool writeMission;
static bool writeNumber;
static bool writeKeyword;
static bool writeEnd;

static bool writtingMission;

static int blinkFrames;
static bool blinkKeyWord = true;

static bool showButton = false;

static Mission *missions = NULL;

static Sound fxTransmit;
static Music musMission;

//----------------------------------------------------------------------------------
// Mission Screen Functions Definition
//----------------------------------------------------------------------------------
static void WriteMissionText();
static void EndWritting();
static void BlinkKeyword();

// Mission Screen Initialization logic
void InitMissionScreen(void)
{
    framesCounter = 0;
    finishScreen = 0;
    
    fadeButton = 0.80f;  
    
    texBackground = LoadTexture("resources/textures/mission_background.png");
    
    texBackline = LoadTexture("resources/textures/mission_backline.png");    
    sourceRecBackLine = (Rectangle){0,0,GetScreenWidth(), texBackline.height};
    destRecBackLine = (Rectangle){0,0,sourceRecBackLine.width, sourceRecBackLine.height};
    fadeBackLine = 0;
    
    fxTransmit = LoadSound("resources/audio/fx_message.ogg");
    musMission = LoadMusicStream("resources/audio/music_mission.ogg");
    
    PlayMusicStream(musMission);
    
    // Initialize missions
    missions = LoadMissions("resources/missions.txt");
    
    missionMaxLength = strlen(missions[currentMission].brief);
    
    // Insert line breaks every MAX_LINE_CHAR
    int currentLine = 1;
    int i = currentLine * MAX_LINE_CHAR;

    while (i < missionMaxLength)
    {
        if (missions[currentMission].brief[i] == ' ')
        {
            missions[currentMission].brief[i] = '\n';
            currentLine++;
            i = currentLine*MAX_LINE_CHAR;
        }
        else i++;
    }        
    
    missionSize = 30;    
    missionLenght = 0;
    missionSpeed = 1;
    
    numberColor = RAYWHITE;
    missionColor = LIGHTGRAY;
    keywordColor = (Color){198, 49, 60, 255}; //RED
    
    numberPosition = (Vector2){150, 185};
    missionPosition = (Vector2){numberPosition.x, numberPosition.y + 60};
    keywordPosition = (Vector2){missionPosition.x, missionPosition.y + MeasureTextEx(fontMission, missions[currentMission].brief, missionSize, 0).y + 60};
    
    startWritting = false;
    writeNumber = false;
    writeMission = false;
    writeKeyword = false;
    writeEnd = false;
    
    writtingMission = false;
    
    showNumberWaitFrames = 30;
    showMissionWaitFrames = 60; 
    showKeywordWaitFrames = 60;    
    
    blinkKeyWord = true;
    blinkFrames = 15;
    
    PlaySound(fxTransmit);
}

// Mission Screen Update logic
void UpdateMissionScreen(void)
{
    UpdateMusicStream(musMission);
    
    if (!writeEnd) WriteMissionText(); 
    else BlinkKeyword();
    
    if (showButton)
    {
        if (IsKeyPressed(KEY_ENTER) || IsButtonPressed()) 
        {
            if (!writeEnd) EndWritting();
            else
            {
                finishScreen = true;
                showButton = false;
            }
        } 
    }
}

// Mission Screen Draw logic
void DrawMissionScreen(void)
{
    // TODO: Draw MISSION screen here!
    DrawTexture(texBackground, 0,0, WHITE);
    DrawTexturePro(texBackline, sourceRecBackLine, destRecBackLine, (Vector2){0,0},0, Fade(WHITE, fadeBackLine));
    
    if (writeNumber) DrawTextEx(fontMission, FormatText("FiltraciĆ³n #%02i ", currentMission + 1), numberPosition, missionSize + 10, 0, numberColor);    
    DrawTextEx(fontMission, SubText(missions[currentMission].brief, 0, missionLenght), missionPosition, missionSize, 0, missionColor);
    if (writeKeyword && blinkKeyWord) DrawTextEx(fontMission, FormatText("Keyword: %s", missions[currentMission].key), keywordPosition, missionSize + 10, 0, keywordColor);    
    
    if (showButton) 
    {        
        if (!writeEnd) DrawButton("saltar");
        else DrawButton("codificar");
    }
}

// Mission Screen Unload logic
void UnloadMissionScreen(void)
{
    // TODO: Unload MISSION screen variables here!
    UnloadTexture(texBackground); 
    UnloadTexture(texBackline);
    UnloadSound(fxTransmit);
    UnloadMusicStream(musMission);
    free(missions);
}

// Mission Screen should finish?
int FinishMissionScreen(void)
{
    return finishScreen;
}

static void WriteMissionText()
{
    if(!startWritting)
    {
        framesCounter++;
        if(framesCounter % 60 == 0) 
        {
            framesCounter = 0;
            startWritting = true;
        }
    }    
    else if(!writeNumber)
    {
        framesCounter++;
        fadeBackLine += 0.020f;
        if(framesCounter % showNumberWaitFrames == 0)
        {
            framesCounter = 0;
            writeNumber = true;
            showButton = true;
        }
    }
    else if(!writeMission)
    {
        framesCounter ++;
        if(framesCounter % showMissionWaitFrames == 0)
        {
            framesCounter = 0;
            writeMission = true;
            writtingMission = true;
        }
    }
    else if(writeMission && writtingMission)
    {
        framesCounter++;
        if(framesCounter % missionSpeed == 0)
        {
            framesCounter = 0;
            missionLenght++;            
            
            if(missionLenght == missionMaxLength)
            {
                writtingMission = false;
            }
        }
    }
    else if(!writeKeyword)
    {
        framesCounter++;
        if(framesCounter % showKeywordWaitFrames == 0)
        {
            framesCounter = 0;
            writeKeyword = true;
            writeEnd = true;
        }
    }    
}
static void EndWritting()
{
    writeEnd = true;
    writeKeyword = true;
    writeNumber = true;
    missionLenght = missionMaxLength;
}
static void BlinkKeyword()
{
    framesCounter++;
    if(framesCounter % blinkFrames == 0)
    {
        framesCounter = 0;
        blinkKeyWord = !blinkKeyWord;
    }
}