#include "projectserialization.h"

#include "stdserialization.h"

QDataStream &operator<<(QDataStream &ds, const GlobalGameSettings &globalGameSettings)
{
    ds << globalGameSettings.startInFullscreenMode
       << globalGameSettings.scaling
       << globalGameSettings.interpolateBetweenColors
       << globalGameSettings.colorOutsideRoomRegion
       << globalGameSettings.resizable
       << globalGameSettings.topMost
       << globalGameSettings.noBorder
       << globalGameSettings.noButtons
       << globalGameSettings.displayCursor
       << globalGameSettings.freezeWhenFocusLost
       << globalGameSettings.disableScreensaver
       << globalGameSettings.screenSetting
       << globalGameSettings.vsync
       << globalGameSettings.letEscEndGame
       << globalGameSettings.treatCloseButtonAsEsc
       << globalGameSettings.letF1ShowGameInformation
       << globalGameSettings.letF4SwitchBetweenScreenModes
       << globalGameSettings.letF5SaveF6LoadGame
       << globalGameSettings.letF9TakeScreenshot
       << globalGameSettings.priority
       << globalGameSettings.major
       << globalGameSettings.minor
       << globalGameSettings.release
       << globalGameSettings.build
       << globalGameSettings.company
       << globalGameSettings.product
       << globalGameSettings.copyright
       << globalGameSettings.description;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, GlobalGameSettings &globalGameSettings)
{
    ds >> globalGameSettings.startInFullscreenMode
       >> globalGameSettings.scaling
       >> globalGameSettings.interpolateBetweenColors
       >> globalGameSettings.colorOutsideRoomRegion
       >> globalGameSettings.resizable
       >> globalGameSettings.topMost
       >> globalGameSettings.noBorder
       >> globalGameSettings.noButtons
       >> globalGameSettings.displayCursor
       >> globalGameSettings.freezeWhenFocusLost
       >> globalGameSettings.disableScreensaver
       >> globalGameSettings.screenSetting
       >> globalGameSettings.vsync
       >> globalGameSettings.letEscEndGame
       >> globalGameSettings.treatCloseButtonAsEsc
       >> globalGameSettings.letF1ShowGameInformation
       >> globalGameSettings.letF4SwitchBetweenScreenModes
       >> globalGameSettings.letF5SaveF6LoadGame
       >> globalGameSettings.letF9TakeScreenshot
       >> globalGameSettings.priority
       >> globalGameSettings.major
       >> globalGameSettings.minor
       >> globalGameSettings.release
       >> globalGameSettings.build
       >> globalGameSettings.company
       >> globalGameSettings.product
       >> globalGameSettings.copyright
       >> globalGameSettings.description;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const GlobalGameSettings::FixedScale &fixedScale)
{
    ds << fixedScale.percent;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, GlobalGameSettings::FixedScale &fixedScale)
{
    ds >> fixedScale.percent;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const GlobalGameSettings::KeepAspectRatio &keepAspectRatio)
{
    Q_UNUSED(keepAspectRatio);
    //ds << keepAspectRatio.;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, GlobalGameSettings::KeepAspectRatio &keepAspectRatio)
{
    Q_UNUSED(keepAspectRatio);
    //ds >> keepAspectRatio.;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const GlobalGameSettings::FullScale &fullScale)
{
    Q_UNUSED(fullScale);
    //ds << fullScale.;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, GlobalGameSettings::FullScale &fullScale)
{
    Q_UNUSED(fullScale);
    //ds >> fullScale.;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const GlobalGameSettings::ScreenSetting &screenSetting)
{
    ds << screenSetting.colorDepth
       << screenSetting.resolution
       << screenSetting.frequency;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, GlobalGameSettings::ScreenSetting &screenSetting)
{
    ds >> screenSetting.colorDepth
       >> screenSetting.resolution
       >> screenSetting.frequency;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const Sprite &sprite)
{
    ds << sprite.name
       << sprite.pixmaps
       << sprite.origin.x
       << sprite.origin.y
       << sprite.preciseCollisionChecking
       << sprite.separateCollisionMasks;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, Sprite &sprite)
{
    ds >> sprite.name
       >> sprite.pixmaps
       >> sprite.origin.x
       >> sprite.origin.y
       >> sprite.preciseCollisionChecking
       >> sprite.separateCollisionMasks;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const Sound &sound)
{
    ds << sound.name
       << sound.type
       << sound.path
       << sound.effects.chorus
       << sound.effects.flanger
       << sound.effects.gargle
       << sound.effects.echo
       << sound.effects.reverb
       << sound.volume
       << sound.pan
       << sound.preload;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, Sound &sound)
{
    ds >> sound.name
       >> sound.type
       >> sound.path
       >> sound.effects.chorus
       >> sound.effects.flanger
       >> sound.effects.gargle
       >> sound.effects.echo
       >> sound.effects.reverb
       >> sound.volume
       >> sound.pan
       >> sound.preload;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const Background &background)
{
    ds << background.name
       << background.pixmap
       << background.tileset;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, Background &background)
{
    ds >> background.name
       >> background.pixmap
       >> background.tileset;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const Path::Point &point)
{
    ds << point.point
       << point.sp;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, Path::Point &point)
{
    ds >> point.point
       >> point.sp;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const Path &path)
{
    ds << path.name
       << path.points
       << path.type
       << path.closed
       << path.precision
       << path.snapX
       << path.snapY
       << path.gridEnabled;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, Path &path)
{
    ds >> path.name
       >> path.points
       >> path.type
       >> path.closed
       >> path.precision
       >> path.snapX
       >> path.snapY
       >> path.gridEnabled;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const Script &script)
{
    ds << script.name
       << script.script;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, Script &script)
{
    ds >> script.name
       >> script.script;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const Font &font)
{
    ds << font.name
       << font.font;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, Font &font)
{
    ds >> font.name
       >> font.font;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const AppliesToSelf &action)
{
    Q_UNUSED(action);
    //ds << action.;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, AppliesToSelf &action)
{
    Q_UNUSED(action);
    //ds >> action.;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const AppliesToOther &action)
{
    Q_UNUSED(action);
    //ds << action.;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, AppliesToOther &action)
{
    Q_UNUSED(action);
    //ds >> action.;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const AppliesToObject &action)
{
    Q_UNUSED(action);
    ds << action.objectName;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, AppliesToObject &action)
{
    Q_UNUSED(action);
    ds >> action.objectName;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const MoveFixedAction &action)
{
    Q_UNUSED(action);
    ds << action.appliesTo;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, MoveFixedAction &action)
{
    Q_UNUSED(action);
    ds >> action.appliesTo;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const MoveFreeAction &action)
{
    Q_UNUSED(action);
    ds << action.appliesTo;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, MoveFreeAction &action)
{
    Q_UNUSED(action);
    ds >> action.appliesTo;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const MoveTowardsAction &action)
{
    Q_UNUSED(action);
    ds << action.appliesTo;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, MoveTowardsAction &action)
{
    Q_UNUSED(action);
    ds >> action.appliesTo;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const SpeedHorizontalAction &action)
{
    Q_UNUSED(action);
    ds << action.appliesTo;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, SpeedHorizontalAction &action)
{
    Q_UNUSED(action);
    ds >> action.appliesTo;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const SpeedVerticalAction &action)
{
    Q_UNUSED(action);
    ds << action.appliesTo;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, SpeedVerticalAction &action)
{
    Q_UNUSED(action);
    ds >> action.appliesTo;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const SetGravityAction &action)
{
    Q_UNUSED(action);
    ds << action.appliesTo;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, SetGravityAction &action)
{
    Q_UNUSED(action);
    ds >> action.appliesTo;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const ExecuteCodeAction &action)
{
    ds << action.appliesTo
       << action.script;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, ExecuteCodeAction &action)
{
    ds >> action.appliesTo
       >> action.script;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const TimeLine &timeLine)
{
    ds << timeLine.name
       << timeLine.moments;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, TimeLine &timeLine)
{
    ds >> timeLine.name
       >> timeLine.moments;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const Object &object)
{
    ds << object.name
       << object.spriteName
       << object.visible
       << object.solid
       << object.depth
       << object.persistent
       << object.parentName
       << object.maskSpriteName
       << object.events
       << object.collisionEvents;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, Object &object)
{
    ds >> object.name
       >> object.spriteName
       >> object.visible
       >> object.solid
       >> object.depth
       >> object.persistent
       >> object.parentName
       >> object.maskSpriteName
       >> object.events
       >> object.collisionEvents;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const Room::Object &object)
{
    ds << object.objectName
       << object.pos;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, Room::Object &object)
{
    ds >> object.objectName
       >> object.pos;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const Room &room)
{
    ds << room.name
       << room.caption
       << room.width
       << room.height
       << room.speed
       << room.persistent
       << room.creationCode
       << room.snapX
       << room.snapY
       << room.gridEnabled
       << room.isometricGrid
       << room.objects;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, Room &room)
{
    ds >> room.name
       >> room.caption
       >> room.width
       >> room.height
       >> room.speed
       >> room.persistent
       >> room.creationCode
       >> room.snapX
       >> room.snapY
       >> room.gridEnabled
       >> room.isometricGrid
       >> room.objects;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const IncludedFile &includedFile)
{
    Q_UNUSED(includedFile);
    //ds << includedFile.;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, IncludedFile &includedFile)
{
    Q_UNUSED(includedFile);
    //ds >> includedFile.;
    return ds;
}

QDataStream &operator<<(QDataStream &ds, const ProjectContainer &project)
{
    ds << project.globalGameSettings
       << project.sprites
       << project.sounds
       << project.backgrounds
       << project.paths
       << project.scripts
       << project.fonts
       << project.timeLines
       << project.objects
       << project.rooms
       << project.includedFiles;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, ProjectContainer &project)
{
    ds >> project.globalGameSettings
       >> project.sprites
       >> project.sounds
       >> project.backgrounds
       >> project.paths
       >> project.scripts
       >> project.fonts
       >> project.timeLines
       >> project.objects
       >> project.rooms
       >> project.includedFiles;
    return ds;
}
