-- **************************************************** stato_attivita

create table stato_attivita
(
    id              varchar(2)   not null primary key,
    nome            varchar(250) not null,
    data_creazione  datetime     not null,
    data_modifica   datetime     not null,
    utente_modifica varchar(50)  not null
);

-- **************************************************** tipo_categoria

create table tipo_categoria
(
    id              varchar(2)   not null primary key,
    nome            varchar(250) not null,
    data_creazione  datetime     not null,
    data_modifica   datetime     not null,
    utente_modifica varchar(50)  not null
);

-- **************************************************** tipo_paragrafo

create table tipo_paragrafo
(
    id              varchar(10)  not null primary key,
    nome            varchar(250) not null,
    data_creazione  datetime     not null,
    data_modifica   datetime     not null,
    utente_modifica varchar(50)  not null
);

-- **************************************************** attivita

create table attivita
(
    id              int          not null primary key auto_increment,
    nome            varchar(250) not null,
    autore          varchar(250) not null,
    padre           int          null,
    stato           varchar(2)   not null,
    data_creazione  datetime     not null,
    data_modifica   datetime     not null,
    utente_modifica varchar(50)  not null,

    constraint fk_attivita_attivita foreign key (padre) references attivita (id),
    constraint fk_attivita_stato_attivita foreign key (stato) references stato_attivita (id)
);

create index fk_attivita_attivita_idx on attivita (padre);

create index fk_attivita_stato_attivita_idx on attivita (stato);

-- **************************************************** branca

create table branca
(
    id              int          not null primary key auto_increment,
    nome            varchar(250) not null,
    inizio_eta      int          null,
    fine_eta        int          null,
    colore          varchar(10)  null,
    data_creazione  datetime     not null,
    data_modifica   datetime     not null,
    utente_modifica varchar(50)  not null
);

-- **************************************************** branca_attivita

create table branca_attivita
(
    attivita_id     int         not null,
    branca_id       int         not null,
    cancellato      tinyint     not null,
    data_creazione  datetime    not null,
    data_modifica   datetime    not null,
    utente_modifica varchar(50) not null,

    primary key (attivita_id, branca_id),

    constraint fk_branca_attivita_attivita foreign key (attivita_id) references attivita (id),
    constraint fk_branca_attivita_branca foreign key (branca_id) references branca (id)
);

create index fk_branca_attivita_attivita_idx on branca_attivita (attivita_id);

create index fk_branca_attivita_branca_idx on branca_attivita (branca_id);

-- **************************************************** periodo_anno

create table periodo_anno
(
    id              int          not null primary key auto_increment,
    nome            varchar(250) not null,
    inizio_mese     int          null,
    fine_mese       int          null,
    data_creazione  datetime     not null,
    data_modifica   datetime     not null,
    utente_modifica varchar(50)  not null
);

-- **************************************************** periodo_anno_attivita

create table periodo_anno_attivita
(
    attivita_id     int         not null,
    periodo_anno_id int         not null,
    cancellato      tinyint     not null,
    data_creazione  datetime    not null,
    data_modifica   datetime    not null,
    utente_modifica varchar(50) not null,

    primary key (attivita_id, periodo_anno_id),

    constraint fk_periodo_anno_attivita_attivita foreign key (attivita_id) references attivita (id),
    constraint fk_periodo_anno_attivita_periodo_anno foreign key (periodo_anno_id) references periodo_anno (id)
);

create index fk_periodo_anno_attivita_attivita_idx on periodo_anno_attivita (attivita_id);

create index fkperiodo_anno_attivita_periodo_anno_idx on periodo_anno_attivita (periodo_anno_id);

-- **************************************************** paragrafo

create table paragrafo
(
    id              int          not null primary key auto_increment,
    attivita_id     int          not null,
    corpo           varchar(500) not null,
    autore          varchar(250) not null,
    tipo            varchar(10)  not null,
    ordine          int          not null,
    data_creazione  datetime     not null,
    data_modifica   datetime     not null,
    utente_modifica varchar(50)  not null,

    constraint fk_paragrafo_tipo_paragrafo foreign key (tipo) references tipo_paragrafo (id),
    constraint fk_paragrafo_attivita foreign key (attivita_id) references attivita (id)
);

create index fk_paragrafo_tipo_paragrafo_idx on paragrafo (tipo);

-- **************************************************** categoria

create table categoria
(
    id              int          not null primary key auto_increment,
    nome            varchar(250) not null,
    padre           int          null,
    tipo            varchar(2)   not null,
    data_creazione  datetime     not null,
    data_modifica   datetime     not null,
    utente_modifica varchar(50)  not null,

    constraint fk_categoria_categoria foreign key (padre) references categoria (id),
    constraint fk_categoria_tipo_categoria foreign key (tipo) references tipo_categoria (id)
);

create index fk_categoria_categoria_idx on categoria (padre);

create index fk_categoria_tipo_categoria_idx on categoria (tipo);

-- **************************************************** categoria_attivita

create table categoria_attivita
(
    attivita_id     int         not null,
    categoria_id    int         not null,
    cancellato      tinyint     not null,
    data_creazione  datetime    not null,
    data_modifica   datetime    not null,
    utente_modifica varchar(50) not null,

    primary key (attivita_id, categoria_id),

    constraint fk_categoria_attivita_attivita foreign key (attivita_id) references attivita (id),
    constraint fk_categoria_attivita_categoria foreign key (categoria_id) references categoria (id)
);

create index fk_categoria_attivita_attivita_idx on categoria_attivita (attivita_id);

create index fk_categoria_attivita_categoria_idx on categoria_attivita (categoria_id);

-- **************************************************** materiale

create table materiale
(
    id              int          not null primary key auto_increment,
    nome            varchar(250) not null,
    proprieta       json,
    data_creazione  datetime     not null,
    data_modifica   datetime     not null,
    utente_modifica varchar(50)  not null
);

-- **************************************************** materiale_attivita

create table materiale_attivita
(
    attivita_id     int         not null,
    materiale_id    int         not null,
    proprieta       json        null,
    cancellato      tinyint     not null,
    data_creazione  datetime    not null,
    data_modifica   datetime    not null,
    utente_modifica varchar(50) not null,

    primary key (attivita_id, materiale_id),

    constraint fk_materiale_attivita_attivita foreign key (attivita_id) references attivita (id),
    constraint fk_materiale_attivita_materiale foreign key (materiale_id) references materiale (id)
);

create index fk_materiale_attivita_attivita_idx on materiale_attivita (attivita_id);

create index fk_materiale_attivita_materiale_idx on materiale_attivita (materiale_id);

-- **************************************************** categoria_materiale

create table categoria_materiale
(
    materiale_id    int         not null,
    categoria_id    int         not null,
    cancellato      tinyint     not null,
    data_creazione  datetime    not null,
    data_modifica   datetime    not null,
    utente_modifica varchar(50) not null,

    primary key (materiale_id, categoria_id),

    constraint fk_categoria_materiale_categoria foreign key (categoria_id) references categoria (id),
    constraint fk_categoria_materiale_materiale foreign key (materiale_id) references materiale (id)
);

create index fk_categoria_materiale_categoria_idx on categoria_materiale (categoria_id);

create index fk_categoria_materiale_materiale_idx on categoria_materiale (materiale_id);


