#--------------------------------------------------------------------------------#
#-----------------------------Eliminar todas las tablas--------------------------#
#--------------------------------------------------------------------------------#
set foreign_key_checks = 0;

drop table if exists editorial;
drop table if exists estado;
drop table if exists autor;
drop table if exists categoria;
drop table if exists idioma;
drop table if exists libro;
drop table if exists ejemplar;
drop table if exists libro_autor;
drop table if exists libro_categoria;
drop table if exists libro_idioma;
drop table if exists correo;
drop table if exists direccion;
drop table if exists telefono;
drop table if exists empresa;
drop table if exists distribuidor;
drop table if exists cliente;
drop table if exists trabajador;
drop table if exists distribuidor_direccion;
drop table if exists distribuidor_telefono;
drop table if exists distribuidor_correo;
drop table if exists cliente_direccion;
drop table if exists cliente_telefono;
drop table if exists cliente_correo;
drop table if exists trabajador_direccion;
drop table if exists trabajador_telefono;
drop table if exists trabajador_correo;
drop table if exists factura;
drop table if exists boleta;
drop table if exists compra;
drop table if exists venta;
drop table if exists arriendo;
drop table if exists libro_compra;
drop table if exists libro_venta;
drop table if exists libro_arriendo;
drop table if exists usuario;

set foreign_key_checks = 1;

#--------------------------------------------------------------------------------#
#--------------Definicion de las tablas relacionadas a los libros----------------#
#--------------------------------------------------------------------------------#
create table editorial
(
  id          int unsigned primary key auto_increment,
  nombre      varchar(255) not null,
  inserted_at timestamp default CURRENT_TIMESTAMP
);

create table estado
(
  id          int unsigned primary key auto_increment,
  nombre      varchar(255) not null,
  inserted_at timestamp default CURRENT_TIMESTAMP
);

create table autor
(
  id               int unsigned primary key auto_increment,
  nombre           varchar(255) not null,
  apellido_paterno varchar(255) null,
  apellido_materno varchar(255) null,
  inserted_at      timestamp default CURRENT_TIMESTAMP
);

create table categoria
(
  id          int unsigned primary key auto_increment,
  nombre      varchar(255) not null,
  inserted_at timestamp default CURRENT_TIMESTAMP
);

create table idioma
(
  id          int unsigned primary key auto_increment,
  nombre      varchar(255) not null,
  inserted_at timestamp default CURRENT_TIMESTAMP
);

create table libro
(
  id                int unsigned primary key auto_increment,
  editorial_id      int unsigned not null,
  isbn              varchar(255) not null,
  ano_publicacion   int          default null,
  numero_paginas    int          not null,
  titulo            varchar(255) default null,
  precio_referencia int          not null,
  inserted_at       timestamp    default CURRENT_TIMESTAMP,
  foreign key (editorial_id) references editorial (id) on delete restrict on update cascade
);

create table ejemplar
(
  id          int unsigned primary key auto_increment,
  libro_id    int unsigned not null,
  estado_id   int unsigned default 1,
  serie       varchar(255) not null,
  inserted_at timestamp    default CURRENT_TIMESTAMP,
  unique key serie_libro (serie, libro_id),
  foreign key (libro_id) references libro (id) on delete cascade on update cascade,
  foreign key (estado_id) references estado (id) on delete restrict on update cascade
);

create table libro_autor
(
  libro_id int unsigned not null,
  autor_id int unsigned not null,
  foreign key (libro_id) references libro (id) on delete restrict on update cascade,
  foreign key (autor_id) references autor (id) on delete restrict on update cascade
);

create table libro_categoria
(
  libro_id     int unsigned not null,
  categoria_id int unsigned not null,
  foreign key (libro_id) references libro (id) on delete restrict on update cascade,
  foreign key (categoria_id) references categoria (id) on delete restrict on update cascade
);

create table libro_idioma
(
  libro_id  int unsigned not null,
  idioma_id int unsigned not null,
  foreign key (libro_id) references libro (id) on delete restrict on update cascade,
  foreign key (idioma_id) references idioma (id) on delete restrict on update cascade
);


#--------------------------------------------------------------------------------#
#------------Definicion de las tablas relacionadas a las personas----------------#
#--------------------------------------------------------------------------------#
create table direccion
(
  id          int unsigned primary key auto_increment,
  calle       varchar(255) not null,
  numero      varchar(255) not null,
  inserted_at timestamp default CURRENT_TIMESTAMP
);

create table telefono
(
  id          int unsigned primary key auto_increment,
  numero      varchar(255) not null,
  inserted_at timestamp default CURRENT_TIMESTAMP
);

create table correo
(
  id          int unsigned primary key auto_increment,
  correo      varchar(255) not null,
  inserted_at timestamp default CURRENT_TIMESTAMP
);

create table empresa
(
  id          int unsigned primary key auto_increment,
  nombre      varchar(255) not null,
  inserted_at timestamp default CURRENT_TIMESTAMP
);

create table distribuidor
(
  id          int unsigned primary key auto_increment,
  empresa_id  int unsigned not null,
  rut         varchar(255) not null,
  inserted_at timestamp default CURRENT_TIMESTAMP,
  foreign key (empresa_id) references empresa (id) on delete restrict on update cascade
);

create table cliente
(
  id               int unsigned primary key auto_increment,
  rut              varchar(255) not null,
  nombre           varchar(255) not null,
  apellido_paterno varchar(255) not null,
  apellido_materno varchar(255) not null,
  fecha_nacimiento date         not null,
  inserted_at      timestamp default CURRENT_TIMESTAMP
);

create table trabajador
(
  id               int unsigned primary key auto_increment,
  rut              varchar(255) not null,
  nombre           varchar(255) not null,
  apellido_paterno varchar(255) not null,
  apellido_materno varchar(255) not null,
  fecha_contrato   date         not null,
  inserted_at      timestamp default CURRENT_TIMESTAMP
);

create table distribuidor_direccion
(
  distribuidor_id int unsigned,
  direccion_id    int unsigned,
  foreign key (distribuidor_id) references distribuidor (id) on delete restrict on update cascade,
  foreign key (direccion_id) references direccion (id) on delete cascade on update cascade
);

create table distribuidor_telefono
(
  distribuidor_id int unsigned,
  telefono_id     int unsigned,
  foreign key (distribuidor_id) references distribuidor (id) on delete restrict on update cascade,
  foreign key (telefono_id) references telefono (id) on delete cascade on update cascade
);

create table distribuidor_correo
(
  distribuidor_id int unsigned,
  correo_id       int unsigned,
  foreign key (distribuidor_id) references distribuidor (id) on delete restrict on update cascade,
  foreign key (correo_id) references correo (id) on delete cascade on update cascade
);

create table cliente_direccion
(
  cliente_id   int unsigned,
  direccion_id int unsigned,
  foreign key (cliente_id) references cliente (id) on delete restrict on update cascade,
  foreign key (direccion_id) references direccion (id) on delete cascade on update cascade
);

create table cliente_telefono
(
  cliente_id  int unsigned,
  telefono_id int unsigned,
  foreign key (cliente_id) references cliente (id) on delete restrict on update cascade,
  foreign key (telefono_id) references telefono (id) on delete cascade on update cascade
);

create table cliente_correo
(
  cliente_id int unsigned,
  correo_id  int unsigned,
  foreign key (cliente_id) references cliente (id) on delete restrict on update cascade,
  foreign key (correo_id) references correo (id) on delete cascade on update cascade
);

create table trabajador_direccion
(
  trabajador_id int unsigned,
  direccion_id  int unsigned,
  foreign key (trabajador_id) references trabajador (id) on delete restrict on update cascade,
  foreign key (direccion_id) references direccion (id) on delete cascade on update cascade
);

create table trabajador_telefono
(
  trabajador_id int unsigned,
  telefono_id   int unsigned,
  foreign key (trabajador_id) references trabajador (id) on delete restrict on update cascade,
  foreign key (telefono_id) references telefono (id) on delete cascade on update cascade
);

create table trabajador_correo
(
  trabajador_id int unsigned,
  correo_id     int unsigned,
  foreign key (trabajador_id) references trabajador (id) on delete restrict on update cascade,
  foreign key (correo_id) references correo (id) on delete cascade on update cascade
);

#--------------------------------------------------------------------------------#
#-------Definicion de las tablas relacionadas a la venta/compra/arriendo---------#
#--------------------------------------------------------------------------------#

create table factura
(
  id           int unsigned primary key auto_increment,
  folio        varchar(255) not null,
  precio_neto  int          not null,
  precio_iva   int          not null,
  fecha_compra datetime     not null,
  inserted_at  timestamp default CURRENT_TIMESTAMP
);

create table boleta
(
  id          int unsigned primary key auto_increment,
  folio       varchar(255) not null,
  precio_neto int          not null,
  precio_iva  int          not null,
  fecha_venta datetime     not null,
  inserted_at timestamp default CURRENT_TIMESTAMP
);

create table compra
(
  id              int unsigned primary key auto_increment,
  factura_id      int unsigned not null,
  distribuidor_id int unsigned not null,
  inserted_at     timestamp default CURRENT_TIMESTAMP,
  foreign key (factura_id) references factura (id) on delete restrict on update cascade,
  foreign key (distribuidor_id) references distribuidor (id) on delete restrict on update cascade
);

create table venta
(
  id            int unsigned primary key auto_increment,
  cliente_id    int unsigned not null,
  trabajador_id int unsigned not null,
  boleta_id     int unsigned not null,
  inserted_at   timestamp default CURRENT_TIMESTAMP,
  foreign key (cliente_id) references cliente (id) on delete restrict on update cascade,
  foreign key (trabajador_id) references trabajador (id) on delete restrict on update cascade,
  foreign key (boleta_id) references boleta (id) on delete restrict on update cascade
);

create table arriendo
(
  id                        int unsigned primary key auto_increment,
  trabajador_id             int unsigned not null,
  cliente_id                int unsigned not null,
  costo_arriendo            int          not null,
  fecha_arriendo            date         not null,
  fecha_devolucion_estimada date         not null,
  fecha_devolucion_real     date,
  multa                     int,
  costo_total               int,
  inserted_at               timestamp default CURRENT_TIMESTAMP,
  foreign key (trabajador_id) references trabajador (id) on delete restrict on update cascade,
  foreign key (cliente_id) references cliente (id) on delete restrict on update cascade
);

create table libro_compra
(
  libro_id  int unsigned,
  compra_id int unsigned,
  foreign key (libro_id) references libro (id) on delete restrict on update cascade,
  foreign key (compra_id) references compra (id) on delete restrict on update cascade
);

create table libro_venta
(
  libro_id int unsigned,
  venta_id int unsigned,
  foreign key (libro_id) references libro (id) on delete restrict on update cascade,
  foreign key (venta_id) references venta (id) on delete restrict on update cascade
);

create table libro_arriendo
(
  libro_id    int unsigned,
  arriendo_id int unsigned,
  foreign key (libro_id) references libro (id) on delete restrict on update cascade,
  foreign key (arriendo_id) references arriendo (id) on delete restrict on update cascade
);

#--------------------------------------------------------------------------------#
#---------------------Definicion de las tablas de usuario------------------------#
#--------------------------------------------------------------------------------#

create table usuario
(
  id            int unsigned primary key auto_increment,
  nombre        varchar(255) not null,
  password      varchar(255) not null,
  trabajador_id int unsigned not null,
  foreign key (trabajador_id) references trabajador (id) on delete cascade on update cascade,
  inserted_at   timestamp default current_timestamp
);

#--------------------------------------------------------------------------------#
#------------------------Poblar con datos iniciales------------------------------#
#--------------------------------------------------------------------------------#

insert into estado (nombre)
values ('Vendido'),
       ('Arrendado'),
       ('Disponible');

insert into idioma (nombre)
values ('Español'),
       ('Ingles'),
       ('Portuges'),
       ('Aleman'),
       ('Ruso'),
       ('Japones');

insert into editorial (nombre)
values ('Editorial N1'),
       ('Editorial N2'),
       ('Editorial N3');

insert into categoria (nombre)
values ('Terror'),
       ('Aventura'),
       ('Fantasia');

insert into autor(nombre, apellido_paterno, apellido_materno)
values ('Howard Philips', 'Lovecraft', NULL),
       ('Stephen', 'King', NULL),
       ('Brandon', 'Sanderson', NULL);

insert into libro (editorial_id, isbn, ano_publicacion, numero_paginas, titulo, precio_referencia)
values (1, '0-765-31178-X', 2006, 541, 'Mistborn: The Final Empire', 10000),
       (1, '0-765-31688-9', 2007, 590, 'Mistborn: The Well of Ascension', 10000),
       (1, '978-0-7653-1689-9', 2008, 572, 'Mistborn: The Hero of Ages', 10000),
       (2, '1231231231232', 1931, 100, 'The Shadow over Innsmouth', 10000),
       (2, '1231231231232', 1933, 100, 'The Dreams in the Witch House', 10000),
       (2, '1231231231232', 1936, 100, 'At the Mountains of Madness', 10000),
       (3, '0385086954', 1974, 199, 'Carrie', 10000),
       (3, '978-0-670-26077-5', 1979, 428, 'The Dead Zone', 10000),
       (3, '0-670-81302-8', 1986, 1138, 'It', 10000);

insert into libro_autor(libro_id, autor_id)
values (1, 3),
       (2, 3),
       (3, 3),
       (4, 1),
       (5, 1),
       (6, 1),
       (7, 2),
       (8, 2),
       (9, 2);

insert into libro_categoria(libro_id, categoria_id)
values (1, 3),
       (2, 3),
       (3, 3),
       (4, 1),
       (5, 1),
       (6, 1),
       (7, 1),
       (8, 1),
       (9, 1);

insert into libro_idioma(libro_id, idioma_id)
values (1, 2),
       (2, 2),
       (3, 2),
       (4, 2),
       (5, 2),
       (6, 2),
       (7, 2),
       (8, 2),
       (9, 2);

INSERT INTO trabajador
VALUES (1, '197638990', 'Daniel', 'Cortes', 'Pincheira', '2019-06-04', '2019-06-04 18:12:55');

INSERT INTO usuario
VALUES (1, 'admin', 'IF7nbMo9zxGOH++0op8eE+obeILVzsZCguAqPVydL/0=', 1, '2019-06-05 00:08:50');
