#include ".\dialoguemanager.h"

DialogueManager::DialogueManager(void){
    init(0, 0, 0);
}
DialogueManager::DialogueManager(SpriteRenderer* newSpriteRenderer, TextManager* newTextManager, ScreenManager*  newScreenManager){
    init(newSpriteRenderer, newTextManager, newScreenManager);
}

void DialogueManager::init(SpriteRenderer* newSpriteRenderer, TextManager* newTextManager, ScreenManager*  newScreenManager){
    spriteRenderer = newSpriteRenderer;
    textManager = newTextManager;
    screenManager = newScreenManager;
    leftBackground = 0;
    middleBackground = 0;
    rightBackground = 0;
    dialogue = 0;
    talker = 0;
    width = 0;
    textTop = 0;
    textLeft = 0;
    backgroundTop = 0;
    backgroundLeft = 0;
    imageTop = 0;
    imageLeft = 0;

}

DialogueManager::~DialogueManager(void){
    if(dialogue){
        textManager->removeString(dialogue);
        dialogue = 0;
    }
    if(leftBackground){
        delete leftBackground;
        leftBackground = 0;
    }
    if(middleBackground){
        delete middleBackground;
        middleBackground = 0;
    }
    if(rightBackground){
        delete rightBackground;
        rightBackground = 0;
    }
    vector<char*>::iterator iter;
    for(unsigned int index = 0; index < fileDialogue.size(); index++){
        if(fileDialogue.at(index)){
            char* text = fileDialogue.at(index);
//            free(text);
        }
    }

}

void DialogueManager::setSpriteRenderer(SpriteRenderer* newSpriteRenderer){
    spriteRenderer = newSpriteRenderer;
}
SpriteRenderer* DialogueManager::getSpriteRenderer(){
    return spriteRenderer;
}
void DialogueManager::setTextManager(TextManager* newTextManager){
    textManager = newTextManager;
}
TextManager* DialogueManager::getTextManager(){
    return textManager;
}
void DialogueManager::setScreenManager(ScreenManager* newScreenManager){
    screenManager = newScreenManager;
}
ScreenManager* DialogueManager::getScreenManager(){
    return screenManager;
}

void DialogueManager::setBackground(int backgroundLeftTextureId, 
                                    int backgroundMiddleTextureId, 
                                    int backgroundRightTextureId){
    if (leftBackground){
        leftBackground->setTextureId(backgroundLeftTextureId);
    }else{
        leftBackground = new SpriteStamp(backgroundLeftTextureId, 
                               DIALOGUE_BACKGROUND_IMAGE_WIDTH,
                               DIALOGUE_BACKGROUND_IMAGE_HEIGHT,
							   NULL);
        leftBackground->setPosition(new D3DXVECTOR3(0.0,0.0,1.0));
    }

    if (middleBackground){
        middleBackground->setTextureId(backgroundMiddleTextureId);
    }else{
        middleBackground = new SpriteStamp(backgroundMiddleTextureId,
                                 DIALOGUE_BACKGROUND_IMAGE_WIDTH,
                                 DIALOGUE_BACKGROUND_IMAGE_HEIGHT,
								 NULL);
        middleBackground->setPosition(new D3DXVECTOR3(0.0,0.0,1.0));
    }

    if (rightBackground){
        rightBackground->setTextureId(backgroundRightTextureId);
    }else{
        rightBackground = new SpriteStamp(backgroundRightTextureId,
                                DIALOGUE_BACKGROUND_IMAGE_WIDTH, 
                                DIALOGUE_BACKGROUND_IMAGE_HEIGHT,
								NULL);
        rightBackground->setPosition(new D3DXVECTOR3(0.0,0.0,1.0));
    }
}

SpriteStamp* DialogueManager::getBackgroundLeft(){
    return leftBackground;
}
SpriteStamp* DialogueManager::getBackgroundMiddle(){
    return middleBackground;
}
SpriteStamp* DialogueManager::getBackgroundRight(){
    return rightBackground;
}

void DialogueManager::addDialogue(char* newDialogue, SpriteStamp* newTalker, int stringWidth){
    int textureId = 15;
    int start = 0;
    removeDialogue();

    // setup display variables
    talker = newTalker;
    dialogue = textManager->addString(0,0,newDialogue,textureId,-1,1.0,1.0,Text::SCREEN);
    textManager->makeStringFitInWidth(dialogue, stringWidth);
    
    // find width of whole thing
    width = ((textManager->getStringWidth(newDialogue, textureId) / DIALOGUE_BACKGROUND_IMAGE_WIDTH) + 3)*DIALOGUE_BACKGROUND_IMAGE_WIDTH;

    // set tops
    backgroundTop = screenManager->getWindowHeight() - ((DIALOGUE_BACKGROUND_IMAGE_HEIGHT + DIALOGUE_BACKGROUND_IMAGE_HEIGHT_V) >> 1);
    imageTop = backgroundTop + (DIALOGUE_BACKGROUND_IMAGE_HEIGHT >> 1) - (talker->getTotalHeight() >> 1);
    textTop = backgroundTop + (DIALOGUE_BACKGROUND_IMAGE_HEIGHT >> 1) - (textManager->getStringHeight(newDialogue, textureId) >> 1);
    
    // set left start position
    start = (screenManager->getWindowWidth() >> 1) - (((1+(width / DIALOGUE_BACKGROUND_IMAGE_WIDTH))*DIALOGUE_BACKGROUND_IMAGE_WIDTH) >> 1 );

    // set lefts
    backgroundLeft = start;
    imageLeft = backgroundLeft + (DIALOGUE_BACKGROUND_IMAGE_WIDTH >> 1);
    textLeft = talker->getTotalWidth() + imageLeft;

    // set dialogue in correct position
    dialogue->setX(textLeft);
    dialogue->setY(textTop);
}

void DialogueManager::addDialogue(char* newDialogue, SpriteStamp* newTalker){
    addDialogue(newDialogue, newTalker, screenManager->getWindowWidth()-2*DIALOGUE_BACKGROUND_IMAGE_WIDTH);
}

void DialogueManager::addDialogue(int dialogueId, SpriteStamp* talker){
    char* newDialogue = new char[256];
    strcpy(newDialogue, fileDialogue.at(dialogueId));
    addDialogue(newDialogue, talker, screenManager->getWindowWidth()-2*DIALOGUE_BACKGROUND_IMAGE_WIDTH);
}

void DialogueManager::removeDialogue(){
    if(dialogue){
        textManager->removeString( dialogue );
        dialogue = 0;
    }
    talker = 0;
}

void DialogueManager::render(){
    // dont have to render text textManager should take care of it
    int panels = 0;
    int left;
    D3DXVECTOR3* position;

    if(dialogue){
        left = backgroundLeft;
        panels = width / DIALOGUE_BACKGROUND_IMAGE_WIDTH;

        // left panel
        position = leftBackground->getPosition();
	    position->x = (float)left;
        position->y = (float)backgroundTop;
        spriteRenderer->renderSpriteToScreen( ( SpriteStamp* ) leftBackground);
        // middle panels
        for(int i = 0; i < panels-1; i++){
            left += DIALOGUE_BACKGROUND_IMAGE_WIDTH;
            position = middleBackground->getPosition();
	        position->x = (float)left;
            position->y = (float)backgroundTop;
            spriteRenderer->renderSpriteToScreen( ( SpriteStamp* ) middleBackground);
        }
        // right panel
        left += DIALOGUE_BACKGROUND_IMAGE_WIDTH;
        position = rightBackground->getPosition();
        position->x = (float)left;
        position->y = (float)backgroundTop;
        spriteRenderer->renderSpriteToScreen( ( SpriteStamp* ) rightBackground);
        // character
        position = talker->getPosition();
        position->x = (float)imageLeft;
        position->y = (float)imageTop;
        spriteRenderer->renderSpriteToScreen( ( SpriteStamp* ) talker);
    }
}

void DialogueManager::initFileDialogue(char* fileName){
	fstream dialogueFile( fileName );
    char    data[256];
    char*   smallData;
    char    fileChar;
    int     position = 0;

	while ( dialogueFile.peek() != -1 ) {
        position = 0;
        do {
            dialogueFile.read(&fileChar, 1);
            data[position++] = fileChar;
        } while( fileChar != '\n' );
        smallData = (char*)malloc(sizeof(char)*(position));
        for(int index = 0; index < position; index++){
            smallData[index] = data[index];
        }
        smallData[position] = '\0';
        fileDialogue.push_back(smallData);
    }
    dialogueFile.close();
}

char* DialogueManager::getFileDialogue(int index){
    return fileDialogue.at(index);
}
