#include "Initialisierung.h"

#include <Bildschirm.h>
#include <DateiSystem.h>
#include <Fenster.h>
#include <Fortschritt.h>
#include <Liste.h>
#include <MausEreignis.h>
#include <ToolTip.h>

#include "Globals.h"

Knopf* createKnopf(const Framework::UIInitParam& params)
{
    Knopf* ret = Framework::defaultUI(params.schrift, params.bildschirm)
                     .createKnopf(params);
    ret->setHintergrundFarbe(0xFF000000);
    ret->setRahmenFarbe(0xFF2E6DA4);
    ret->setSchriftFarbe(0xFFFFFFFF);
    ret->setRahmenBreite(1);
    ret->setAlphaFeldStrength(10);
    ret->setAlphaFeldFarbe(0xFF337AB7);
    return ret;
}

TextFeld* createTextFeld(const Framework::UIInitParam& params)
{
    TextFeld* ret = Framework::defaultUI(params.schrift, params.bildschirm)
                        .createTextFeld(params);
    ret->setRahmenFarbe(0xFF6d6d6d);
    ret->setHintergrundFarbe(0xFF000000);
    ret->setAlphaFeldFarbe(0xFF3d3d3d);
    ret->setAlphaFeldStrength(10);
    return ret;
}

KontrollKnopf* createKontrollKnopf(const Framework::UIInitParam& params)
{
    KontrollKnopf* ret = Framework::defaultUI(params.schrift, params.bildschirm)
                             .createKontrollKnopf(params);
    ret->removeStyle(KontrollKnopf::Style::Rahmen);
    ret->setRahmenFarbe(0xFF2E6DA4);
    ret->setHintergrundFarbe(0xFF000000);
    ret->setKAFFarbe(0xFF3d3d3d);
    ret->setKAFStrength(10);
    return ret;
}

ObjTabelle* createObjTabelle(const Framework::UIInitParam& params)
{
    ObjTabelle* ret = Framework::defaultUI(params.schrift, params.bildschirm)
                          .createObjTabelle(params);
    ret->setRahmenFarbe(0xFF6d6d6d);
    ret->setHintergrundFarbe(0xFF000000);
    ret->setRasterFarbe(0xFF6d6d6d);
    ret->setVertikalScrollPos(0);
    ret->setHorizontalScrollPos(0);
    return ret;
}

Knopf* initKnopf(int x, int y, int br, int hö, __int64 style, char* titel)
{
    Knopf* ret = uiFactory.createKnopf(uiFactory.initParam);
    ret->addStyle(style);
    ret->setPosition(x, y);
    ret->setSize(br, hö);
    ret->setText(titel);
    return ret;
}

KontrollKnopf* initKontrollKnopf(
    int x, int y, int br, int hö, __int64 style, char* txt)
{
    KontrollKnopf* ret = uiFactory.createKontrollKnopf(uiFactory.initParam);
    ret->addStyle(style);
    ret->setText(txt);
    ret->setSText(txt);
    ret->setPosition(x, y);
    ret->setSize(br, hö);
    return ret;
}

Fenster* initFenster(int x, int y, int br, int hö, __int64 style, char* titel)
{
    Fenster* ret = uiFactory.createFenster(uiFactory.initParam);
    ret->addStyle(style);
    ret->setPosition(x, y);
    ret->setSize(br, hö);
    if (ret->hatStyle(Fenster::Style::Titel))
    {
        ret->setTitel(titel);
    }
    return ret;
}

TextFeld* initTextFeld(int x, int y, int br, int hö, __int64 style, const char* txt)
{
    TextFeld* ret = uiFactory.createTextFeld(uiFactory.initParam);
    ret->setStyle(style);
    ret->setText(txt);
    ret->setPosition(x, y);
    ret->setSize(br, hö);
    return ret;
}

BildZ* initBildZ(int x, int y, int br, int hö, __int64 style, Bild* b)
{
    BildZ* ret = uiFactory.createBildZ(uiFactory.initParam);
    ret->setStyle(style);
    ret->setPosition(x, y);
    ret->setSize(br, hö);
    if (b) ret->setBildZ(b);
    return ret;
}

AuswahlBox* initAuswahlBox(int x,
    int y,
    int br,
    int hö,
    __int64 style,
    std::initializer_list<char*> values)
{
    AuswahlBox* ret = uiFactory.createAuswahlBox(uiFactory.initParam);
    ret->addStyle(style);
    ret->setPosition(x, y);
    ret->setSize(br, hö);
    for (auto i = values.begin(); i != values.end(); i++)
        ret->addEintrag(*i);
    return ret;
}

ObjTabelle* initObjTabelle(int x,
    int y,
    int br,
    int hö,
    __int64 style,
    std::initializer_list<OBJTabelleSpalteIni> spalten,
    int überschriftHöhe)
{
    ObjTabelle* ret = uiFactory.createObjTabelle(uiFactory.initParam);
    ret->addStyle(style);
    ret->setPosition(x, y);
    ret->setSize(br, hö);
    for (auto i = spalten.begin(); i != spalten.end(); i++)
    {
        ret->addSpalte(i->name);
        ret->setSpaltenBreite(i->name, i->breite);
        if ((style | ObjTabelle::Style::SpaltenBreiteMin) == style)
            ret->setMinSpaltenBreite(i->name, i->minBreite);
        if ((style | ObjTabelle::Style::SpaltenBreiteMax) == style)
            ret->setMaxSpaltenBreite(i->name, i->maxBreite);
        if (überschriftHöhe)
        {
            if (ret->getZeilenNummer("Überschrift") < 0)
            {
                ret->addZeile(0, "Überschrift");
                ret->setZeilenHeight(0, 20);
            }
            ret->setZeichnungZ(i->name,
                "Überschrift",
                initTextFeld(0,
                    0,
                    i->breite,
                    20,
                    TextFeld::Style::Text | TextFeld::Style::Center,
                    i->name));
        }
    }
    return ret;
}

LDiag* initLinienDiagramm(
    int x, int y, int br, int hö, __int64 style, DiagDaten* data)
{
    LDiag* ret = uiFactory.createLDiag(uiFactory.initParam);
    ret->addStyle(style);
    ret->setPosition(x, y);
    ret->setSize(br, hö);
    if (data) ret->setDiagDatenZ(data);
    return ret;
}

AuswahlListe* initAuswahlListe(int x,
    int y,
    int br,
    int hö,
    __int64 style,
    std::initializer_list<char*> values)
{
    AuswahlListe* ret = uiFactory.createAuswahlListe(uiFactory.initParam);
    ret->setPosition(x, y);
    ret->setSize(br, hö);
    ret->addStyle(style);
    for (auto i = values.begin(); i != values.end(); i++)
        ret->addEintrag(*i);
    ret->update();
    return ret;
}

ZeichnungHintergrund* initZeichnungHintergrund(
    int x, int y, int br, int hö, __int64 style, int farbe)
{
    ZeichnungHintergrund* ret = new ZeichnungHintergrund();
    ret->setStyle(style);
    ret->setHintergrundFarbe(farbe);
    if (ret->hatStyle(ZeichnungHintergrund::Style::Rahmen))
    {
        ret->setRahmenBreite(1);
        ret->setRahmenFarbe(0xFF00FF00);
    }
    ret->setPosition(x, y);
    ret->setSize(br, hö);
    return ret;
}

void initToolTip(Zeichnung* obj, const char* txt)
{
    obj->setToolTipText(
        txt, uiFactory.initParam.bildschirm, uiFactory.initParam.schrift);
    obj->zToolTip()->addStyle(TextFeld::Style::Mehrzeilig);
}

FBalken* initFBalken(int x, int y, int br, int hö, __int64 style)
{
    FBalken* ret = uiFactory.createFBalken(uiFactory.initParam);
    ret->addStyle(style);
    ret->setPosition(x, y);
    ret->setSize(br, hö);
    LTDBDatei* datei = new LTDBDatei();
    datei->setDatei(new Text(
        "data/images/system.ltdb"));
    datei->leseDaten(0);
    Bild* fbhb = datei->laden(0, new Text("fortschrittleh"));
    ret->setHintergrundBildZ(fbhb);
    Bild* fbfhb = datei->laden(0, new Text("fortschrittvol"));
    datei->release();
    ret->setFBgBildZ(fbfhb);
    return ret;
}