/**
 * module
 */
@config_simulator: { defaultServerMode: "gui" }
@config_server_qtro: { useGeneratedMain: true }
module org.example.echomodule 1.0

/**
 * \brief the brief
 * the description
 * continues \l http://qt.io
 */
@config: {id: "org.foo.id.1.0", qml_class_name: "UiEcho"}
interface Echo {
    /**
     * \brief brief message
     *
     * Some more documentation
     */
    readonly string lastMessage;
    int intValue;
    var varValue;
    @config: { getter_name: "isEchoEnabled" }
    bool echoEnabled;
    @config_simulator: {minimum: 10.}
    real floatValue1;
    @config_simulator: {maximum: 10.}
    real floatValue2;
    string stringValue;
    model<Contact> contactList;
    Contact contact;
    Combo combo;
    list<int> intList;
    list<Combo> comboList;
    WeekDay weekDay;
    TestEnum testEnum;
    real UPPERCASEPROPERTY;
    /* TODO comment */
    @config_simulator: { default: ["Hello Qt"] }
    OnlyAStringInAStruct stringInAStructProperty;

    // single line comment
    string echo(string msg);
    string id() const;
    Combo getCombo();
    void voidSlot();
    void voidSlot2(int param);
    void timer(int interval);
    AirflowDirection flagMethod(AirflowDirection direction);
    TestEnum enumMethod(TestEnum testEnum);

    signal anotherChanged(AnotherStruct another);
    signal foobar(string foo);
    signal somethingHappened();
    signal newValueAvailable(var newValue);
}

@config: {id: "org.foo.idz.1.0", zoned: true}
interface EchoZoned {

    /**
     * \brief brief message
     *
     * Some more documentation
     */
    readonly string lastMessage;
    int intValue;
    var varValue;
    @config_simulator: {domain: ["one", "two", "three"]}
    string stringValue;
    string unsupportedValue;
    bool zonedValue;
    bool valueWithDefault;
    @config: { getter_name: "isEchoEnabled" }
    bool echoEnabled;
    AirflowDirection airflowDirection;
    @config_simulator: {minimum: 10., maximum: 15.}
    int rangedValue;
    int rangedValueWithDefault;
    Contact contact;
    Combo combo;
    list<int> intList;
    list<Combo> comboList;
    WeekDay weekDay;
    TestEnum testEnum;
    real UPPERCASEPROPERTY;

    string echo(string msg);
    string id();
    var varMethod();
    Combo getCombo();
    string timer(int interval);
    AirflowDirection flagMethod(AirflowDirection direction);
    TestEnum enumMethod(TestEnum testEnum);

    signal anotherChanged(AnotherStruct another);
    signal foobar(string foo);
    signal somethingHappened();
    signal newValueAvailable(var newValue);
}

/**
 * \brief Control where the airflow goes
 */
flag AirflowDirection {
    /**
     * \brief Airflow to the windshield
     */
    Windshield = 1,
    /**
     * \brief Airflow to the dashboard
     */
    Dashboard = 2,
    /**
     * \brief Airflow to the floor
     */
    Floor = 4
}

@config: { type: "DaysOfTheWeek" }
flag WeekDay {
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5
}

enum TestEnum {
    FirstEnumValue = 1,
    SecondEnumValue = 2
}

/**
 * The contact information
 */
struct Contact {
    string name;
    int age;
    bool isMarried;
    var additionalData;
}

struct Combo {
    Contact contactInfo;
    WeekDay day;
}

struct AnotherStruct {
    int justANumber;
}

/* AUTOSUITE-1340 */
struct OnlyAStringInAStruct {
    string myString;
}