<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class TaskSr59486 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute(<<<SQL
            ALTER TABLE produto.gestao_comissao ADD COLUMN id_safra INT;
            ALTER TABLE produto.gestao_comissao ADD CONSTRAINT fk_gestao_comissao_safras FOREIGN KEY (id_safra) REFERENCES produto.safras (id);
            UPDATE produto.gestao_comissao SET id_safra = 28;
            ALTER TABLE produto.gestao_comissao ALTER COLUMN id_safra SET NOT NULL;

            CREATE TABLE produto.gestao_comissao_culturas(
                id SERIAL NOT NULL,
                id_gestao_comissao INT NOT NULL,
                id_cultura INT NOT NULL,
                CONSTRAINT pk_gestao_comissao_culturas PRIMARY KEY (id),
                CONSTRAINT fk_gestao_comissao_culturas_gestao_comissao FOREIGN KEY (id_gestao_comissao) REFERENCES produto.gestao_comissao (id),
                CONSTRAINT fk_gestao_comissao_culturas_culturas FOREIGN KEY (id_cultura) REFERENCES produto.culturas (id)
            ) INHERITS (public.campos_default);

            CREATE TABLE produto.gestao_comissao_usuarios(
                id SERIAL NOT NULL,
                id_gestao_comissao INT NOT NULL,
                id_usuario INT NOT NULL,
                CONSTRAINT pk_gestao_comissao_usuarios PRIMARY KEY (id),
                CONSTRAINT fk_gestao_comissao_usuarios_gestao_comissao FOREIGN KEY (id_gestao_comissao) REFERENCES produto.gestao_comissao (id),
                CONSTRAINT fk_gestao_comissao_usuarios_usuarios FOREIGN KEY (id_usuario) REFERENCES sistema.usuarios (id)
            ) INHERITS (public.campos_default);

            CREATE TABLE produto.gestao_comissao_produtos(
                id SERIAL NOT NULL,
                id_gestao_comissao INT NOT NULL,
                id_produto INT NOT NULL,
                CONSTRAINT pk_gestao_comissao_produtos PRIMARY KEY (id),
                CONSTRAINT fk_gestao_comissao_produtos_gestao_comissao FOREIGN KEY (id_gestao_comissao) REFERENCES produto.gestao_comissao (id),
                CONSTRAINT fk_gestao_comissao_produtos_produtos FOREIGN KEY (id_produto) REFERENCES produto.produtos (id)
            ) INHERITS (public.campos_default);

            CREATE TABLE produto.gestao_comissao_estados(
                id SERIAL NOT NULL,
                id_gestao_comissao INT NOT NULL,
                id_estado INT NOT NULL,
                CONSTRAINT pk_gestao_comissao_estados PRIMARY KEY (id),
                CONSTRAINT fk_gestao_comissao_estados_gestao_comissao FOREIGN KEY (id_gestao_comissao) REFERENCES produto.gestao_comissao (id),
                CONSTRAINT fk_gestao_comissao_estados_estados FOREIGN KEY (id_estado) REFERENCES sistema.estados (id)
            ) INHERITS (public.campos_default);

            CREATE INDEX idx_gcc_id_gestao_comissao ON produto.gestao_comissao_culturas(id_gestao_comissao);
            CREATE INDEX idx_gcu_id_gestao_comissao ON produto.gestao_comissao_usuarios(id_gestao_comissao);
            CREATE INDEX idx_gce_id_gestao_comissao ON produto.gestao_comissao_estados(id_gestao_comissao);
            CREATE INDEX idx_gcp_id_gestao_comissao ON produto.gestao_comissao_produtos(id_gestao_comissao);

            INSERT INTO produto.gestao_comissao_culturas (id_gestao_comissao, id_cultura)
                SELECT distinct id_gestao_comissao, id_cultura
                  FROM produto.gestao_comissao_cultura_usuario;

            INSERT INTO produto.gestao_comissao_usuarios (id_gestao_comissao, id_usuario)
                SELECT distinct id_gestao_comissao, id_usuario
                  FROM produto.gestao_comissao_cultura_usuario;

            DROP TABLE produto.gestao_comissao_cultura_usuario;
SQL
        );
    }

    public function down(): void
    {
        $this->execute(<<<SQL

            CREATE TABLE produto.gestao_comissao_cultura_usuario(
                id SERIAL NOT NULL,
                id_gestao_comissao INT NOT NULL,
                id_cultura INT,
                id_usuario INT,
                CONSTRAINT pk_gestao_comissao_cultura_usuario PRIMARY KEY (id),
                CONSTRAINT fk_gestao_comissao_cultura_usuario_gestao FOREIGN KEY (id_gestao_comissao) REFERENCES produto.gestao_comissao (id),
                CONSTRAINT fk_gestao_comissao_cultura_usuario_cultura FOREIGN KEY (id_cultura) REFERENCES produto.culturas (id),
                CONSTRAINT fk_gestao_comissao_cultura_usuario_usuario FOREIGN KEY (id_usuario) REFERENCES sistema.usuarios (id)
            ) INHERITS (public.campos_default);

            ALTER TABLE produto.gestao_comissao DROP COLUMN id_safra;
            DROP TABLE produto.gestao_comissao_culturas;
            DROP TABLE produto.gestao_comissao_usuarios;
            DROP TABLE produto.gestao_comissao_produtos;
            DROP TABLE produto.gestao_comissao_estados;
SQL
        );
    }
}
