'use strict';

exports.up = knex => Promise.resolve()
    .then(() => knex.schema.createTable('actors', (table) => {
        table.increments('id', 8);

        table.string('name');
        table.string('gender', 18);

        table.integer('alias_for', 8)
            .references('id')
            .inTable('actors');
    }))
    .then(() => knex.schema.createTable('directors', (table) => {
        table.increments('id', 8);

        table.string('name');
        table.integer('alias_for', 8)
            .references('id')
            .inTable('directors');
    }))
    .then(() => knex.schema.createTable('tags_groups', (table) => {
        table.string('group', 20)
            .primary();

        table.string('name', 20);
    }))
    .then(() => knex.schema.createTable('tags', (table) => {
        table.string('tag', 20)
            .primary();

        table.string('group_id', 20)
            .references('group')
            .inTable('tags_groups');

        table.string('alias_for', 20)
            .references('tag')
            .inTable('tags');
    }))
    .then(() => knex.schema.createTable('networks', (table) => {
        table.string('id', 32)
            .primary();

        table.string('name');
        table.string('url');
        table.string('description');
    }))
    .then(() => knex.schema.createTable('sites', (table) => {
        table.string('id', 32)
            .primary();

        table.string('label', 6);

        table.string('network_id', 32)
            .notNullable()
            .references('id')
            .inTable('networks');

        table.string('name');
        table.string('url');
        table.string('description');
        table.string('parameters');
    }))
    .then(() => knex.schema.createTable('releases', (table) => {
        table.increments('id', 12);

        table.string('site_id', 32)
            .notNullable()
            .references('id')
            .inTable('sites');

        table.string('shoot_id');
        table.string('entry_id');
        table.unique(['site_id', 'shoot_id']);
        table.unique(['site_id', 'entry_id']);

        table.string('url');
        table.string('title');
        table.date('date');
        table.text('description');

        table.integer('director', 8)
            .references('id')
            .inTable('directors');

        table.integer('duration')
            .unsigned();

        table.integer('likes')
            .unsigned();

        table.integer('dislikes')
            .unsigned();

        table.integer('rating')
            .unsigned();
    }))
    .then(() => knex.schema.createTable('actors_associated', (table) => {
        table.increments('id', 16);

        table.integer('release_id', 12)
            .notNullable()
            .references('id')
            .inTable('releases');

        table.integer('actor_id', 8)
            .notNullable()
            .references('id')
            .inTable('actors');
    }))
    .then(() => knex.schema.createTable('tags_associated', (table) => {
        table.string('tag_id', 20)
            .notNullable()
            .references('tag')
            .inTable('tags');

        table.string('site_id')
            .references('id')
            .inTable('sites');

        table.string('release_id')
            .references('id')
            .inTable('releases');
    }));

exports.down = knex => Promise.resolve()
    .then(() => knex.schema.dropTable('tags_associated'))
    .then(() => knex.schema.dropTable('actors_associated'))
    .then(() => knex.schema.dropTable('releases'))
    .then(() => knex.schema.dropTable('sites'))
    .then(() => knex.schema.dropTable('networks'))
    .then(() => knex.schema.dropTable('actors'))
    .then(() => knex.schema.dropTable('directors'))
    .then(() => knex.schema.dropTable('tags_groups'))
    .then(() => knex.schema.dropTable('tags'));