<?php

namespace app\modules\risk\models;

use Yii;
use yii\web\HttpException;
use app\models\User;
use app\components\Utils;
use app\modules\performance\models\Coleta;
use app\modules\performance\models\ContextoTemModeloRisco;
use Exception;


/**
 * This is the model class for table "risco_cenario".
 *
 * @property int $id
 * @property string $nome
 * @property string $descricao
 * @property int $coleta_vinculo
 * @property int $pontuacao
 * @property int $default
 * @property int $status
 * @property int $created_by
 * @property string $created_at
 * @property int $updated_by
 * @property string $updated_at
 * @property int $risco_modelo_id
 * @property int $repete_nova_coleta
 *
 * @property Risco[] $riscos
 * @property Coleta $coletaVinculo
 * @property User $createdBy
 * @property User $updatedBy
 */
class RiscoCenario extends \app\models\Base
{

    const PADRAO_SIM = 1;
    const PADRAO_NAO = 0;
    const PARECER_TECNICO_TIPO_ORSEGUPS = 1;
    const REPETE_SIM = 1;
    const REPETE_NAO = 0;

    public $contexto;
    public $cliente;
    public $parecerTecnico;

    const COR_BAIXO = 'var(--green-500)';
    const COR_MODERADO = 'var(--yellow-500)';
    const COR_ALTO = 'var(--red-500)';
    const COR_CRITICO = 'var(red-600)';

    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'risco_cenario';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['nome', 'coleta_vinculo', 'created_by', 'default', 'repete_nova_coleta', 'risco_modelo_id'], 'required'],
            [['descricao', 'parecerTecnico'], 'string'],
            [['coleta_vinculo', 'status', 'created_by', 'updated_by', 'pontuacao', 'default', 'cliente', 'contexto', 'risco_modelo_id'], 'integer'],
            [['created_at', 'updated_at'], 'safe'],
            [['nome'], 'string', 'max' => 255],
            [['coleta_vinculo'], 'exist', 'skipOnError' => true, 'targetClass' => Coleta::className(), 'targetAttribute' => ['coleta_vinculo' => 'id']],
            [['created_by'], 'exist', 'skipOnError' => true, 'targetClass' => User::className(), 'targetAttribute' => ['created_by' => 'id']],
            [['updated_by'], 'exist', 'skipOnError' => true, 'targetClass' => User::className(), 'targetAttribute' => ['updated_by' => 'id']],
            [['risco_modelo_id'], 'exist', 'skipOnError' => true, 'targetClass' => RiscoModelo::className(), 'targetAttribute' => ['risco_modelo_id' => 'id']],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'nome' => 'Nome',
            'descricao' => 'Descrição',
            'coleta_vinculo' => 'Coleta de Vínculo',
            'pontuacao' => 'Risco Global',
            'default' => 'Usado no Valor Global',
            'status' => 'Status',
            'created_by' => 'Cadastrado Por',
            'created_at' => 'Cadastrado Em',
            'updated_by' => 'Atualizado Por',
            'updated_at' => 'Atualizado Em',
            'contexto' => 'Contexto',
            'parecerTecnico' => 'Parecer Técnico',
            'risco_modelo_id' => 'Modelo de Risco',
            'repete_nova_coleta' => 'Repete a cada nova coleta',
        ];
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getRiscos()
    {
        return $this->hasMany(Risco::className(), ['risco_cenario_id' => 'id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getColetaVinculo()
    {
        return $this->hasOne(Coleta::className(), ['id' => 'coleta_vinculo']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getCreatedBy()
    {
        return $this->hasOne(User::className(), ['id' => 'created_by']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getUpdatedBy()
    {
        return $this->hasOne(User::className(), ['id' => 'updated_by']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getRiscoModelo()
    {
        return $this->hasOne(RiscoModelo::className(), ['id' => 'risco_modelo_id']);
    }

    public function getValorGlobalRiscoLabel()
    {

        $bg = 'green';

        $pontuacao = $this->pontuacao;

        $niveisValorGlobalRisco = [];

        $niveisValorGlobalRisco[] = ["from" => 0, "to" => 25, "color" => "#b7dee8"];
        $niveisValorGlobalRisco[] = ["from" => 26, "to" => 50, "color" => "#92cddc"];
        $niveisValorGlobalRisco[] = ["from" => 51, "to" => 75, "color" => "#35869b"];
        $niveisValorGlobalRisco[] = ["from" => 76, "to" => 200, "color" => "#215967"];

        foreach ($niveisValorGlobalRisco as $key => $value) {
            if ($pontuacao >= $value["from"] && $pontuacao <= $value["to"]) {
                $bg = $value["color"];
            }
        }

        return [$this->pontuacao, $bg];
    }

    public function getvalorGlobalVinculo()
    {

        $bg = 'green';

        $pontuacao = $this->coletaVinculo->valorGlobal;

        $niveisValorGlobaColeta = [];

        $niveisValorGlobalColeta[] = ["from" => 0, "to" => 20, "color" => "#DF5353"];
        $niveisValorGlobalColeta[] = ["from" => 21, "to" => 40, "color" => "#fe6a00"];
        $niveisValorGlobalColeta[] = ["from" => 41, "to" => 60, "color" => "#e8dd11"];
        $niveisValorGlobalColeta[] = ["from" => 61, "to" => 80, "color" => "#82e042"];
        $niveisValorGlobalColeta[] = ["from" => 81, "to" => 100, "color" => "#089f50"];

        $configuracaoNiveisValorGlobalColeta = Configuracao::find()->where(['chave' => 'plotBandGaugePrincipal', 'status' => Configuracao::ATIVO])->one();

        if ($configuracaoNiveisValorGlobalColeta) {
            $niveisValorGlobalColeta = json_decode($configuracaoNiveisValorGlobalColeta->valor, true);
        }

        foreach ($niveisValorGlobalColeta as $key => $value) {
            if ($pontuacao >= $value["from"] && $pontuacao <= $value["to"]) {
                $bg = $value["color"];
            }
        }

        return [$pontuacao, $bg];
    }

    public function getTaxaSubstituicaoGlobalLabel()
    {

        $bg = 'green';

        $total = 0;

        foreach ($this->riscos as $risco) {

            if ($risco->status == Risco::ATIVO) {
                $total += $risco->taxa_substituicao;
            }
        }

        if ($total != 100) {
            $bg = 'red';
        }

        return [$total, $bg];
    }

    public static function consequenciaValores($model)
    {

        $retorno = [];

        $riscos = Risco::find()->select('id')->where(['risco_cenario_id' => $model->id, 'status' => Risco::ATIVO])->orderBy('id ASC')->column();

        $consequencias = RiscoConsequencia::find()->where(['status' => RiscoConsequencia::SELECIONADO])->andWhere(['in', 'risco_id', $riscos])->orderBy('risco_id ASC')->all();

        foreach ($consequencias as $consequencia) {

            if ($consequencia->ec) {
                $retorno[] = (int) $consequencia->ec;
            } else {
                $retorno[] = 0;
            }
        }

        return json_encode($retorno, JSON_NUMERIC_CHECK);
    }

    public static function probabilidadeValores($model)
    {

        $retorno = [];

        $riscos = Risco::find()->where(['risco_cenario_id' => $model->id, 'status' => Risco::ATIVO])->orderBy('id ASC')->all();

        foreach ($riscos as $risco) {
            $retorno[] = $risco->probabilidade;
            /*
              $inicio = 0;

              $taxas = RiscoProbabilidadeTaxaSubstituicao::find()->where(['risco_id' => $risco->id, 'status' => RiscoProbabilidadeTaxaSubstituicao::ATIVO])->one();

              if (!$taxas) {
              return 0;
              } else {

              $statusQuoHistoricoProprio = RiscoProbabilidadeHistoricoProprio::find()->where(['risco_id' => $risco->id, 'status' => RiscoProbabilidadeHistoricoProprio::SELECIONADO])->one();

              $statusQuoContextoSimilar = RiscoProbabilidadeContextoSimilar::find()->where(['risco_id' => $risco->id, 'status' => RiscoProbabilidadeContextoSimilar::SELECIONADO])->one();

              //$statusquoCondicaoVulnerabilidade = 100 - $risco->riscoCenario->coletaVinculo->valorGlobal;
              $statusquoCondicaoVulnerabilidade = $risco->statusQuoCondicaoVulnerabilidade;

              $hp = 0;
              if ($statusQuoHistoricoProprio) {
              $hp = ($taxas->historico_proprio * ($statusQuoHistoricoProprio->ec)) / 100;
              }

              $cs = 0;
              if ($statusQuoContextoSimilar) {
              $cs = ($taxas->contexto_similar * ($statusQuoContextoSimilar->ec)) / 100;
              }

              $cv = 0;
              if ($statusquoCondicaoVulnerabilidade) {
              $cv = ($taxas->condicao_vulnerabilidade * $statusquoCondicaoVulnerabilidade) / 100;
              }
              }

              $resultado = $inicio + $hp + $cs + $cv;

              $retorno[] = round($resultado);
             */
        }

        return json_encode($retorno);
    }

    public function getContextoNome()
    {

        return $this->coletaVinculo->contexto->name . ' - ' . $this->nome;
    }

    public function getClienteContexto()
    {

        return $this->coletaVinculo->contexto->cliente->nome . ' - ' . $this->coletaVinculo->contexto->name;
    }

    public static function importa($cenario, $contextoId)
    {

        $valid = true;

        $pendencia = null;

        $riscos = Risco::find()->where(['risco_cenario_id' => $cenario->id, 'status' => Risco::ATIVO])->all();

        if (!$riscos) {
            $valid = false;
            return "EICR4 - Erro ao importar o cenário, motivo: riscos do cenário de referência não encontrados";
        }

        if ($valid) {
            $listaRisco = [];
            foreach ($riscos as $riscoA) {
                $listaRisco[] = $riscoA->id;
            }
        }

        if ($valid) {
            $contexto = Contexto::find()->where(['id' => $contextoId, 'active' => Contexto::ATIVO])->one();
        }

        if (!$contexto) {
            $valid = false;
            return "EICR5 - Erro ao importar o cenário, motivo: contexto " . $contextoId . " não encontrado";
        }

        if ($valid) {

            //            $verticalPadrao = Vertical::find()
            //                    ->select('id')
            //                    ->where([
            //                        'tipo' => Vertical::TIPO_PADRAO,
            //                        'status' => Vertical::ATIVO
            //                    ])
            //                    ->column();
            //
            //            $clienteTemVertical = ClienteTemVertical::find()
            //                    ->select('vertical_id')
            //                    ->where([
            //                        'cliente_id' => $contexto->cliente_id,
            //                        'status' => ClienteTemVertical::ATIVO
            //                    ])
            //                    ->andwhere(['in', 'vertical_id', $verticalPadrao])
            //                    ->column();
            //            $projetoPadrao = Projeto::find()
            //                    ->select('id')
            //                    ->where([
            //                        'status' => Projeto::ATIVO
            //                    ])
            //                    ->andWhere(['in', 'vertical_id', $clienteTemVertical])
            //                    ->column();

            $verticalPadrao = $cenario->coletaVinculo->vertical;

            if (!$verticalPadrao) {
                throw new \yii\web\HttpException(500, "Erro! Vertical padrão não encontrada");
            }

            //$verticalPadrao = $cenario->coletaVinculo->projeto->vertical;

            $projetos = [];

            $projetosL = Projeto::find()->select('id')->where(['vertical_id' => $verticalPadrao->id])->column();

            $coletaVinculo = Coleta::find()
                ->where([
                    'contexto_id' => $contexto->id,
                    'status' => Coleta::ATIVO
                ])
                ->andWhere(['in', 'vertical_id', $verticalPadrao->id])
                //->andWhere(['in', 'projeto_id', $projetosL])
                ->one();
        }

        if (!$coletaVinculo) {
            $valid = false;
            return "EICR6 - Erro ao importar o cenário, motivo: falta coleta do contexto " . $contexto->name . ", verifique se os contextos de destino tem uma coleta do mesmo projeto do cenário de referência";
        }

        //pai do pvf vem da coleta de vinculo
        $codSeguranca = null;

        $seguranca = ColetaEstrutura::find()->where([
            'coleta_id' => $coletaVinculo->id,
            'tipo_estrutura' => 'V',
            'status' => ColetaEstrutura::ATIVO,
        ])->one();

        if ($seguranca) {
            $codSeguranca = $seguranca->id;
        }

        if ($valid) {

            $analises = RiscoAnalise::find()->where(['status' => RiscoAnalise::ATIVO])->andWhere(['in', 'risco_id', $listaRisco])->all();

            $listaAnalise = [];
            foreach ($analises as $analise) {

                //identifica o pvf corretamente, baseado no cod pai e no texto e pega o valor
                $pvfColetavinculo = ColetaEstrutura::find()->where([
                    'coleta_id' => $coletaVinculo->id,
                    'nome' => $analise->pvf,
                    'status' => ColetaEstrutura::ATIVO,
                    'cod_pai' => $codSeguranca,
                ])->one();

                if (!$pvfColetavinculo) {
                    $valid = false;
                    return "EICR6A - Erro ao importar o cenário, motivo: falta PVF (" . $analise->pvf . ") da coleta vínculo (" . $coletaVinculo->id . ") " . $contexto->name;
                }

                if ($valid) {
                    $valorPvf = $listaAnalise[$analise->risco_id][] = [
                        'pvf' => $analise->pvf,
                        'taxa_substituicao' => $analise->taxa_substituicao,
                        'valor' => $pvfColetavinculo->pontuacao,
                    ];
                }
            }
        }

        if ($valid) {

            $consequencias = RiscoConsequencia::find()->andWhere(['in', 'status', [RiscoConsequencia::ATIVO, RiscoConsequencia::SELECIONADO]])->andWhere(['in', 'risco_id', $listaRisco])->all();

            $listaConsequencia = [];
            foreach ($consequencias as $consequencia) {
                $listaConsequencia[$consequencia->risco_id][] = [
                    'descritor' => $consequencia->descritor,
                    'ec' => $consequencia->ec,
                    'status' => $consequencia->status,
                ];
            }
        }

        if ($valid) {

            $taxassubstituicao = RiscoProbabilidadeTaxaSubstituicao::find()->where(['status' => RiscoConsequencia::ATIVO])->andWhere(['in', 'risco_id', $listaRisco])->all();

            $listaTaxaSubstituicao = [];
            foreach ($taxassubstituicao as $taxa) {
                $listaTaxaSubstituicao[$taxa->risco_id][] = [
                    'historico_proprio' => $taxa->historico_proprio,
                    'contexto_similar' => $taxa->contexto_similar,
                    'condicao_vulnerabilidade' => $taxa->condicao_vulnerabilidade,
                ];
            }
        }

        if ($valid) {

            $historicosProprios = RiscoProbabilidadeHistoricoProprio::find()->andWhere(['in', 'status', [RiscoProbabilidadeHistoricoProprio::ATIVO, RiscoProbabilidadeHistoricoProprio::SELECIONADO]])->andWhere(['in', 'risco_id', $listaRisco])->all();

            $listaHistoricosProprios = [];
            foreach ($historicosProprios as $historicoProprio) {
                $listaHistoricosProprios[$historicoProprio->risco_id][] = [
                    'descritor' => $historicoProprio->descritor,
                    'ec' => $historicoProprio->ec,
                    'status' => $historicoProprio->status,
                ];
            }
        }

        if ($valid) {

            $contextosSimilares = RiscoProbabilidadeContextoSimilar::find()->andWhere(['in', 'status', [RiscoProbabilidadeContextoSimilar::ATIVO, RiscoProbabilidadeContextoSimilar::SELECIONADO]])->andWhere(['in', 'risco_id', $listaRisco])->all();

            $listaContextosSimilares = [];
            foreach ($contextosSimilares as $contextoSimilar) {
                $listaContextosSimilares[$contextoSimilar->risco_id][] = [
                    'descritor' => $contextoSimilar->descritor,
                    'ec' => $contextoSimilar->ec,
                    'status' => $contextoSimilar->status,
                ];
            }
        }

        if ($valid) {
            $cenarioNovo = new RiscoCenario();
            $cenarioNovo->nome = $cenario->nome;
            $cenarioNovo->descricao = $cenario->descricao;
            $cenarioNovo->coleta_vinculo = $coletaVinculo->id;
            $cenarioNovo->pontuacao = $cenario->pontuacao;
            $cenarioNovo->default = $cenario->default;
            $cenarioNovo->created_by = Yii::$app->user->identity->id ?? null;
            $cenarioNovo->created_at = date('Y-m-d H:i:s');


            if (!$cenarioNovo->save()) {
                $valid = false;
                return "EICR7 - Erro ao importar o cenário, motivo: " . json_encode($cenarioNovo->getErrors());
            }
        }

        if ($valid) {
            foreach ($riscos as $risco) {
                if ($valid) {
                    $riscoNovo = new Risco();
                    $riscoNovo->nome = $risco->nome;
                    $riscoNovo->descricao = $risco->descricao;
                    $riscoNovo->taxa_substituicao = $risco->taxa_substituicao;
                    $riscoNovo->risco_cenario_id = $cenarioNovo->id;
                    $riscoNovo->analise = $risco->analise;
                    $riscoNovo->pendencia = $risco->pendencia;
                    $riscoNovo->status = $risco->status;
                    $riscoNovo->created_by = Yii::$app->user->identity->id ?? null;
                    $riscoNovo->created_at = date('Y-m-d H:i:s');
                    $riscoNovo->risco_natureza_id = $risco->risco_natureza_id;

                    if (!$riscoNovo->save()) {
                        $valid = false;
                        return "EICR8 - Erro ao importar o cenário (risco), motivo: " . json_encode($riscoNovo->getErrors());
                    }


                    if ($valid) {

                        if (isset($listaAnalise[$risco->id])) {
                            foreach ($listaAnalise[$risco->id] as $analiseItem) {
                                if ($valid) {
                                    $analiseRisco = new RiscoAnalise();
                                    $analiseRisco->risco_id = $riscoNovo->id;
                                    $analiseRisco->pvf = $analiseItem['pvf'];
                                    $analiseRisco->taxa_substituicao = $analiseItem['taxa_substituicao'];
                                    $analiseRisco->valor = $analiseItem['valor'];
                                    $analiseRisco->created_by = Yii::$app->user->identity->id ?? null;
                                    $analiseRisco->created_at = date('Y-m-d H:i:s');

                                    if (!$analiseRisco->save()) {
                                        $valid = false;
                                        return "EICR9 - Erro ao importar o cenário (análise), motivo: " . json_encode($analiseRisco->getErrors());
                                    }
                                }
                            }
                        }
                    }

                    if ($valid) {

                        if (isset($listaConsequencia[$risco->id])) {
                            foreach ($listaConsequencia[$risco->id] as $consequenciaItem) {
                                if ($valid) {
                                    $consequenciaRisco = new RiscoConsequencia();
                                    $consequenciaRisco->risco_id = $riscoNovo->id;
                                    $consequenciaRisco->descritor = $consequenciaItem['descritor'];
                                    $consequenciaRisco->ec = (string) $consequenciaItem['ec'];
                                    $consequenciaRisco->status = $consequenciaItem['status'];
                                    $consequenciaRisco->created_by = Yii::$app->user->identity->id ?? null;
                                    $consequenciaRisco->created_at = date('Y-m-d H:i:s');

                                    if (!$consequenciaRisco->save()) {
                                        $valid = false;
                                        return "EICR10 - Erro ao importar o cenário (consequência), motivo: " . json_encode($consequenciaRisco->getErrors());
                                    }
                                }
                            }
                        }
                    }

                    if ($valid) {

                        if (isset($listaTaxaSubstituicao[$risco->id])) {
                            foreach ($listaTaxaSubstituicao[$risco->id] as $taxaItem) {
                                if ($valid) {
                                    $taxaRisco = new RiscoProbabilidadeTaxaSubstituicao();
                                    $taxaRisco->risco_id = $riscoNovo->id;
                                    $taxaRisco->historico_proprio = $taxaItem['historico_proprio'];
                                    $taxaRisco->contexto_similar = $taxaItem['contexto_similar'];
                                    $taxaRisco->condicao_vulnerabilidade = $taxaItem['condicao_vulnerabilidade'];
                                    $taxaRisco->created_by = Yii::$app->user->identity->id ?? null;
                                    $taxaRisco->created_at = date('Y-m-d H:i:s');

                                    if (!$taxaRisco->save()) {
                                        $valid = false;
                                        return "EICR11 - Erro ao importar o cenário (taxas de substituição), motivo: " . json_encode($taxaRisco->getErrors());
                                    }
                                }
                            }
                        }
                    }

                    if ($valid) {

                        if (isset($listaHistoricosProprios[$risco->id])) {
                            foreach ($listaHistoricosProprios[$risco->id] as $historicoProprioItem) {
                                if ($valid) {
                                    $historicoProprioRisco = new RiscoProbabilidadeHistoricoProprio();
                                    $historicoProprioRisco->risco_id = $riscoNovo->id;
                                    $historicoProprioRisco->descritor = $historicoProprioItem['descritor'];
                                    $historicoProprioRisco->ec = (string) $historicoProprioItem['ec'];
                                    $historicoProprioRisco->status = $historicoProprioItem['status'];
                                    $historicoProprioRisco->created_by = Yii::$app->user->identity->id ?? null;
                                    $historicoProprioRisco->created_at = date('Y-m-d H:i:s');

                                    if (!$historicoProprioRisco->save()) {
                                        $valid = false;
                                        return "EICR11 - Erro ao importar o cenário (histórico próprio), motivo: " . json_encode($historicoProprioRisco->getErrors());
                                    }
                                }
                            }
                        }
                    }

                    if ($valid) {

                        if (isset($listaContextosSimilares[$risco->id])) {
                            foreach ($listaContextosSimilares[$risco->id] as $contextoSimilarItem) {
                                if ($valid) {
                                    $contextoSimilarRisco = new RiscoProbabilidadeContextoSimilar();
                                    $contextoSimilarRisco->risco_id = $riscoNovo->id;
                                    $contextoSimilarRisco->descritor = $contextoSimilarItem['descritor'];
                                    $contextoSimilarRisco->ec = (string) $contextoSimilarItem['ec'];
                                    $contextoSimilarRisco->status = $contextoSimilarItem['status'];
                                    $contextoSimilarRisco->created_by = Yii::$app->user->identity->id ?? null;
                                    $contextoSimilarRisco->created_at = date('Y-m-d H:i:s');

                                    if (!$contextoSimilarRisco->save()) {
                                        $valid = false;
                                        return "EICR12 - Erro ao importar o cenário (contexto similar), motivo: " . json_encode($contextoSimilarRisco->getErrors());
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        if ($valid) {

            $cenarioNovo->pontuacao = self::geraPontuacao($cenarioNovo);

            if (!$cenarioNovo->save()) {
                $valid = false;
                return "EICR13 - Erro ao importar o cenário (pontuacao), motivo: " . json_encode($cenarioNovo->getErrors());
            }
        }

        if ($valid) {

            if ($cenario->parecerTecnico) {

                if ($cenario->parecerTecnico == RiscoCenario::PARECER_TECNICO_TIPO_ORSEGUPS) {

                    Coleta::geraParecerTecnicoOrsegups($cenarioNovo->coletaVinculo);
                }
            }
        }

        return 1;
    }

    public static function geraPontuacao($cenario)
    {


        $resultado = 0;

        $riscos = Risco::find()
            ->where([
                'risco_cenario_id' => $cenario->id,
                'status' => Risco::ATIVO,
            ])
            ->all();

        if ($riscos) {
            foreach ($riscos as $risco) {
                if ($risco->taxa_substituicao) {
                    $resultado += $risco->pontuacao * ($risco->taxa_substituicao / 100);
                }
            }
        }

        $cenario->pontuacao = round($resultado);

        if (!$cenario->save()) {
            throw new HttpException(500, "Erro ao gerar pontuação do cenário de risco, motivo: " . json_encode($cenario->getErrors()));
        }

        return round($resultado);
    }

    public function getCores()
    {


        //        $coresPadrao = [];
        //        $coresPadrao[0] = 'red';
        //        $coresPadrao[1] = 'yellow';
        //        $coresPadrao[2] = 'blue';
        //        $coresPadrao[3] = 'orange';

        $coresPadrao = [];
        $coresPadrao[0] = self::COR_BAIXO;
        $coresPadrao[1] = self::COR_MODERADO;
        $coresPadrao[2] = self::COR_ALTO;
        $coresPadrao[3] = self::COR_CRITICO;


        $coresPadrao = [];
        $coresPadrao[0] = 'var(--green-200)';    // Verde
        $coresPadrao[1] = 'var(--yellow-200)';  // Amarelo
        $coresPadrao[2] = 'var(--red-200)';   // Vermelho
        $coresPadrao[3] = 'var(--red-200)';   // Vermelho de novo


        $cores = [];
        //$cores['04'] = $coresPadrao[1]; //04
        $cores['09'] = $coresPadrao[1];
        $cores['08'] = $coresPadrao[1];
        $cores['07'] = $coresPadrao[1];
        $cores['06'] = $coresPadrao[1];
        $cores['05'] = $coresPadrao[0];
        $cores['04'] = $coresPadrao[0];
        $cores['03'] = $coresPadrao[0];
        $cores['02'] = $coresPadrao[0];
        $cores['01'] = $coresPadrao[0];
        $cores['00'] = $coresPadrao[0];

        $cores['19'] = $coresPadrao[2];
        $cores['18'] = $coresPadrao[2];
        $cores['17'] = $coresPadrao[2];
        $cores['16'] = $coresPadrao[1];
        $cores['15'] = $coresPadrao[1];
        $cores['14'] = $coresPadrao[1];
        $cores['13'] = $coresPadrao[1];
        $cores['12'] = $coresPadrao[0];
        $cores['11'] = $coresPadrao[0];
        $cores['10'] = $coresPadrao[0];

        $cores['29'] = $coresPadrao[2];
        $cores['28'] = $coresPadrao[2];
        $cores['27'] = $coresPadrao[2];
        $cores['26'] = $coresPadrao[2];
        $cores['25'] = $coresPadrao[2];
        $cores['24'] = $coresPadrao[1];
        $cores['23'] = $coresPadrao[1];
        $cores['22'] = $coresPadrao[1];
        $cores['21'] = $coresPadrao[1];
        $cores['20'] = $coresPadrao[1];

        $cores['39'] = $coresPadrao[2];
        $cores['38'] = $coresPadrao[2];
        $cores['37'] = $coresPadrao[2];
        $cores['36'] = $coresPadrao[2];
        $cores['35'] = $coresPadrao[2];
        $cores['34'] = $coresPadrao[2];
        $cores['33'] = $coresPadrao[1];
        $cores['32'] = $coresPadrao[1];
        $cores['31'] = $coresPadrao[1];
        $cores['30'] = $coresPadrao[1];

        $cores['43'] = $coresPadrao[3];
        $cores['42'] = $coresPadrao[3];
        $cores['41'] = $coresPadrao[2];
        $cores['40'] = $coresPadrao[1]; //40


        return ['coresPadrao' => $coresPadrao, 'cores' => $cores,];
    }

    public function getMatrizConsequenciaProbabilidade()
    {

        $consequenciasValores = RiscoCenario::consequenciaValores($this);

        $probabilidadesValores = RiscoCenario::probabilidadeValores($this);

        //Utils::debug([$consequenciasValores, $probabilidadesValores]);

        $consequenciaT = explode(",", str_replace("]", "", str_replace("[", "", $consequenciasValores)));
        $probabilidadeT = explode(",", str_replace("]", "", str_replace("[", "", $probabilidadesValores)));
        $consequenciaProbabilidade = [];

        $a0 = 0;
        $a1 = 0;
        $a2 = 0;
        $a3 = 0;
        $b0 = 0;
        $b1 = 0;
        $b2 = 0;
        $b3 = 0;
        $c0 = 0;
        $c1 = 0;
        $c2 = 0;
        $c3 = 0;
        $d0 = 0;
        $d1 = 0;
        $d2 = 0;
        $d3 = 0;

        foreach ($consequenciaT as $k => $v) {

            if ($v <= 1) {
                $p = $probabilidadeT[$k];
                if ($p <= 25) {
                    $a0++;
                } elseif ($p <= 50) {
                    $a1++;
                } elseif ($p <= 75) {
                    $a2++;
                } else {
                    $a3++;
                }
            } elseif ($v <= 64) {
                $p = $probabilidadeT[$k];
                if ($p <= 25) {
                    $b0++;
                } elseif ($p <= 50) {
                    $b1++;
                } elseif ($p <= 75) {
                    $b2++;
                } else {
                    $b3++;
                }
            } elseif ($v <= 82) {
                $p = $probabilidadeT[$k];
                if ($p <= 25) {
                    $c0++;
                } elseif ($p <= 50) {
                    $c1++;
                } elseif ($p <= 75) {
                    $c2++;
                } else {
                    $c3++;
                }
            } else {
                $p = $probabilidadeT[$k];
                if ($p <= 25) {
                    $d0++;
                } elseif ($p <= 50) {
                    $d1++;
                } elseif ($p <= 75) {
                    $d2++;
                } else {
                    $d3++;
                }
            }
        }

        $consequenciaProbabilidade['00'] = str_pad($a0, 2, '0', STR_PAD_LEFT);
        $consequenciaProbabilidade['01'] = str_pad($a1, 2, '0', STR_PAD_LEFT);
        $consequenciaProbabilidade['02'] = str_pad($a2, 2, '0', STR_PAD_LEFT);
        $consequenciaProbabilidade['03'] = str_pad($a3, 2, '0', STR_PAD_LEFT);
        $consequenciaProbabilidade['10'] = str_pad($b0, 2, '0', STR_PAD_LEFT);
        $consequenciaProbabilidade['11'] = str_pad($b1, 2, '0', STR_PAD_LEFT);
        $consequenciaProbabilidade['12'] = str_pad($b2, 2, '0', STR_PAD_LEFT);
        $consequenciaProbabilidade['13'] = str_pad($b3, 2, '0', STR_PAD_LEFT);
        $consequenciaProbabilidade['20'] = str_pad($c0, 2, '0', STR_PAD_LEFT);
        $consequenciaProbabilidade['21'] = str_pad($c1, 2, '0', STR_PAD_LEFT);
        $consequenciaProbabilidade['22'] = str_pad($c2, 2, '0', STR_PAD_LEFT);
        $consequenciaProbabilidade['23'] = str_pad($c3, 2, '0', STR_PAD_LEFT);
        $consequenciaProbabilidade['30'] = str_pad($d0, 2, '0', STR_PAD_LEFT);
        $consequenciaProbabilidade['31'] = str_pad($d1, 2, '0', STR_PAD_LEFT);
        $consequenciaProbabilidade['32'] = str_pad($d2, 2, '0', STR_PAD_LEFT);
        $consequenciaProbabilidade['33'] = str_pad($d3, 2, '0', STR_PAD_LEFT);

        return $consequenciaProbabilidade;
    }


    public static function geraCenarioRiscoByModelo($coletaId, $mostraMsg = false)
    {

        $coleta = Coleta::findOne($coletaId);

        if (!$coleta) {
            throw new HttpException(500, "Coleta não encontrada");
        }

        $coletaJaEhCenario = RiscoCenario::find()
            ->where([
                'coleta_vinculo' => $coleta->id,
                'status' => RiscoCenario::ATIVO,
            ])
            ->one();

        if ($coletaJaEhCenario) {
          
            $connection = \Yii::$app->db;

            $transaction = $connection->beginTransaction();
            try {
                foreach ($coletaJaEhCenario->getRiscos()->andWhere(['status' => Risco::ATIVO])->all() as $risco) {

                    $geraPontuacao = $risco->getGeraPontuacaoAnalise();
                    if (!$geraPontuacao) {
                        throw new HttpException(500, "ECR10 - Erro ao atualizar a pontuação da Análise do risco, motivo: " . $geraPontuacao->getMessage());
                    }

                    $geraProbabilidade = $risco->getGeraProbabilidade();
                    if (!$geraProbabilidade) {
                        throw new HttpException(500, "ECR11 - Erro ao atualizar a probabilidade do risco, motivo: " . $geraProbabilidade->getMessage());
                    }

                    $atualizaHistoricoProprioOcorrencia = $risco->getAtualizaHistoricoProprioOcorrencia();
                    if (!$atualizaHistoricoProprioOcorrencia) {
                        throw new HttpException(500, "ECR10A - Erro ao atualizar o Fatores Internos baseado nas ocorrências, motivo: " . $atualizaHistoricoProprioOcorrencia->getMessage());
                    }

                    $geraPontuacaoRisco = $risco->getGeraPontuacao();
                    if (!$geraPontuacaoRisco) {
                        throw new HttpException(500, "ECR12 - Erro ao gerar a pontuação do risco, motivo: " . $geraPontuacaoRisco->getMessage());
                    }
                }

                $coletaJaEhCenario->pontuacao = RiscoCenario::geraPontuacao($coletaJaEhCenario);
                if (!$coletaJaEhCenario->save()) {
                    throw new HttpException(500, "ECR13 - Erro ao gerar a pontuacao do cenário, motivo: " . json_encode($coletaJaEhCenario->getErrors()));
                }


                $transaction->commit();
            } catch (Exception $ex) {
                $transaction->rollback();

                throw new HttpException(500, $ex->getMessage());
            }

            return true;
        }

        $modeloRisco = null;

        $contextoTemModeloRisco = ContextoTemModeloRisco::find()
            ->where([
                'contexto_id' => $coleta->contexto_id,
            ])
            ->one();

        if (!$contextoTemModeloRisco) {

            $contextoTemModeloRisco = new ContextoTemModeloRisco();
            $contextoTemModeloRisco->contexto_id = $coleta->contexto_id;
            $contextoTemModeloRisco->risco_modelo_id = RiscoModelo::MODELO_BASE;

            if(!$contextoTemModeloRisco->save()){
                throw new HttpException(500, "Erro ao salvar o modelo de risco no Contexto");    
            }
            
        }

        $modeloRisco = RiscoModelo::findOne($contextoTemModeloRisco->risco_modelo_id);

        /*
        $cenarioReferencia = RiscoCenario::find()
            ->where([
                'coleta_vinculo' => $coleta,
            ])
            ->one();

            Utils::debug($cenarioReferencia);
        if ($cenarioReferencia) {
            $modeloRisco = RiscoModelo::findOne($cenarioReferencia->risco_modelo_id);
        } else {

            $contextoTemModeloRisco = ContextoTemModeloRisco::find()
                ->where([
                    'contexto_id' => $coleta->contexto_id,
                ])
                ->one();

            if (!$contextoTemModeloRisco) {
                throw new HttpException(500, "Contexto sem Modelo de Risco");
            }

            $modeloRisco = RiscoModelo::findOne($contextoTemModeloRisco->risco_modelo_id);

            if (!$modeloRisco) {
                throw new HttpException(500, "Modelo de Risco não encontrado");
            }

            $cenarioReferencia = RiscoCenario::find()
                ->joinWith('coletaVinculo')
                ->where([
                    'risco_cenario.risco_modelo_id' => $contextoTemModeloRisco->risco_modelo_id,
                    'coleta.contexto_id' => $coleta->contexto_id,
                    'coleta.status' => Coleta::ATIVO,
                    'risco_cenario.status' => RiscoCenario::ATIVO,
                ])
                ->orderBy('id DESC')
                ->one();
        }

/*
        $riscosReferencia = [];
        if ($modeloRisco) {

            $riscoCenarioReferencias = $cenarioReferencia->getRiscos()->andWhere(['=', 'status', Risco::ATIVO])->all();

            foreach ($riscoCenarioReferencias as $riscoCenarioReferencia) {

                $probabilidadeHistoricoProprioBase = '';
                foreach ($riscoCenarioReferencia->getRiscoProbabilidadeHistoricoProprios()->andWhere(['=', 'status', RiscoProbabilidadeHistoricoProprio::SELECIONADO])->all() as $riscoCenarioBaseHistoricoProprio) {
                    $probabilidadeHistoricoProprioBase = $riscoCenarioBaseHistoricoProprio->descritor;
                }

                $probabilidadeContextoSimilarBase = [];
                foreach ($riscoCenarioReferencia->getRiscoProbabilidadeContextoSimilars()->andWhere(['=', 'status', RiscoProbabilidadeContextoSimilar::SELECIONADO])->all() as $riscoCenarioBaseContextoSimilar) {
                    $probabilidadeContextoSimilarBase = $riscoCenarioBaseContextoSimilar->descritor;
                }


                if ($riscoCenarioReferencia->risco_modelo_risco_id) {
                    $riscosReferencia[$riscoCenarioReferencia->risco_modelo_risco_id] = [
                        'probilidade_historico_proprio' => $probabilidadeHistoricoProprioBase,
                        'probabilidade_contexto_similar' => $probabilidadeContextoSimilarBase,

                    ];
                }
            }
        }
            */

        $connection = \Yii::$app->db;

        $transaction = $connection->beginTransaction();
        try {

            $novoCenario = new RiscoCenario();
            $novoCenario->nome = date('d/m/Y H:i');
            $novoCenario->descricao = $modeloRisco->descricao;
            $novoCenario->coleta_vinculo = $coleta->id;
            $novoCenario->default = self::PADRAO_NAO;
            $novoCenario->status = self::ATIVO;
            $novoCenario->created_by = $coleta->created_by;
            $novoCenario->created_at = date('Y-m-d H:i:s');
            $novoCenario->risco_modelo_id = $modeloRisco->id;
            $novoCenario->repete_nova_coleta = self::REPETE_NAO;

            if ($novoCenario->save()) {

                $riscoModeloFaixas = RiscoModeloFaixa::find()
                    ->where([
                        'risco_modelo_id' => $novoCenario->risco_modelo_id,
                        'status' => RiscoModeloFaixa::ATIVO
                    ])
                    ->all();

               



                if (!$riscoModeloFaixas) {
                    $faixas = RiscoModeloFaixa::FAIXA_BASE;
                } else {
                    $faixas = [];

                    foreach ($riscoModeloFaixas as $riscoModeloFaixa) {

                        $faixas[] = [
                            'id' => $riscoModeloFaixa->id,
                            'faixa' => $riscoModeloFaixa->faixa,
                            'de' => $riscoModeloFaixa->de,
                            'ate' => $riscoModeloFaixa->ate,
                            'cor' => $riscoModeloFaixa->cor,
                        ];
                    }
                }

                foreach ($faixas as $faixa) {

                    $riscoCenarioFaixa = new RiscoCenarioFaixa();
                    $riscoCenarioFaixa->risco_cenario_id = $novoCenario->id;
                    $riscoCenarioFaixa->faixa = $faixa['faixa'];
                    $riscoCenarioFaixa->de = $faixa['de'];
                    $riscoCenarioFaixa->ate = $faixa['ate'];
                    $riscoCenarioFaixa->cor = $faixa['cor'];
                    $riscoCenarioFaixa->status = RiscoCenarioFaixa::ATIVO;

                    if (!$riscoCenarioFaixa->save()) {
                        $valid = false;
                        \Yii::$app->session->setFlash('error', "ECCR2X - Erro ao cadastrar a faixa do cenário, motivo: " . json_encode($riscoCenarioFaixa->getErrors()));
                    }

                    $riscoModeloMatrizes = RiscoModeloMatriz::find()
                    ->where([
                        'risco_modelo_id' => $novoCenario->risco_modelo_id,
                        'risco_modelo_faixa_id' => $faixa['id'],
                    ])
                    ->all();

                    foreach ($riscoModeloMatrizes as $riscoModeloMatriz) {

                        $riscoCenarioMatriz = new RiscoCenarioMatriz();
                        $riscoCenarioMatriz->risco_cenario_id = $novoCenario->id;
                        $riscoCenarioMatriz->risco_cenario_faixa_id = $riscoCenarioFaixa->id;
                        $riscoCenarioMatriz->de = $riscoModeloMatriz->de;
                        $riscoCenarioMatriz->ate = $riscoModeloMatriz->ate;
                        $riscoCenarioMatriz->cor = $riscoModeloMatriz->cor;

                        if (!$riscoCenarioMatriz->save()) {
                            $valid = false;
                            \Yii::$app->session->setFlash('error', "ECCR2X1 - Erro ao cadastrar a matriz do cenário, motivo: " . json_encode($riscoCenarioMatriz->getErrors()));
                        }
                    }
                }


                $riscosBase = $modeloRisco->getRiscoModeloRiscos()->andWhere(['=', 'status', Risco::ATIVO])->all();

                foreach ($riscosBase as $riscoBase) {

                    $risco = new Risco();
                    $risco->nome = $riscoBase['nome'];
                    $risco->descricao = $riscoBase['descricao'];
                    $risco->taxa_substituicao = $riscoBase['taxa_substituicao'];
                    $risco->risco_cenario_id = $novoCenario->id;
                    $risco->status = Risco::ATIVO;
                    $risco->created_by = $coleta->created_by;
                    $risco->created_at = date('Y-m-d H:i:s');
                    $risco->analise = $riscoBase['analise'];
                    $risco->risco_natureza_id = $riscoBase['risco_natureza_id'];
                    $risco->risco_modelo_risco_id = $riscoBase['risco_modelo_id'];

                    if (!$risco->save()) {
                        throw new HttpException(500, "E2 - Erro ao cadastrar o Risco, motivo: " . json_encode($risco->getErrors()));
                    }

                    // Utils::debug($riscoBase->riscoModeloConsequencias);
                    foreach ($riscoBase->riscoModeloConsequencias as $riscoBaseConsequencia) {

                        if ($riscoBaseConsequencia->status == RiscoConsequencia::SELECIONADO) {
                            $risco->consequencia_valor = $riscoBaseConsequencia->ec;
                            $risco->consequencia_descricao = $riscoBaseConsequencia->descritor;
                            if (!$risco->save()) {
                                throw new HttpException(500, "E14 - Erro ao salvar o valor e a descrição da, motivo: " . json_encode($risco->getErrors()));
                            }
                        }

                        $riscoConsequencia = new RiscoConsequencia();
                        $riscoConsequencia->risco_id = $risco->id;
                        $riscoConsequencia->descritor = $riscoBaseConsequencia['descritor'];
                        $riscoConsequencia->eo = $riscoBaseConsequencia['eo'];
                        $riscoConsequencia->ec = (string) $riscoBaseConsequencia['ec'];
                        $riscoConsequencia->nr = $riscoBaseConsequencia['nr'];
                        $riscoConsequencia->status = $riscoBaseConsequencia['status'];
                        $riscoConsequencia->created_by = $riscoBaseConsequencia['created_by'];
                        $riscoConsequencia->created_at = $riscoBaseConsequencia['created_at'];

                        if (!$riscoConsequencia->save()) {
                            throw new HttpException(500, "ECCR3 - Erro ao cadastrar a Consequência, motivo: " . json_encode($riscoConsequencia->getErrors()));
                        }
                    }

                    foreach ($riscoBase->riscoModeloProbabilidadeTaxaSubstituicaos as $riscoBaseprobabilidadeTaxaSubstituicao) {

                        $riscoTaxaProbabilidade = new RiscoProbabilidadeTaxaSubstituicao();
                        $riscoTaxaProbabilidade->risco_id = $risco->id;
                        $riscoTaxaProbabilidade->historico_proprio = $riscoBaseprobabilidadeTaxaSubstituicao->historico_proprio;
                        $riscoTaxaProbabilidade->contexto_similar = $riscoBaseprobabilidadeTaxaSubstituicao->contexto_similar;
                        $riscoTaxaProbabilidade->condicao_vulnerabilidade = $riscoBaseprobabilidadeTaxaSubstituicao->condicao_vulnerabilidade;
                        $riscoTaxaProbabilidade->status = $riscoBaseprobabilidadeTaxaSubstituicao->status;
                        $riscoTaxaProbabilidade->created_by = $riscoBaseprobabilidadeTaxaSubstituicao->created_by;
                        $riscoTaxaProbabilidade->created_at = $riscoBaseprobabilidadeTaxaSubstituicao->created_at;

                        if (!$riscoTaxaProbabilidade->save()) {
                            throw new HttpException(500, "ECR4 - Erro ao salvar a taxa de substituição do risco, motivo: " . json_encode($riscoTaxaProbabilidade->getErrors()));
                        }
                    }

                    foreach ($riscoBase->getRiscoModeloProbabilidadeHistoricoProprios()->andWhere(['!=', 'status', RiscoProbabilidadeHistoricoProprio::INATIVO])->all() as $riscoBaseProbabilidadeHistoricoProprio) {

                        $statusProbabilidadeHistoricoProprio = RiscoProbabilidadeHistoricoProprio::ATIVO;

                        if (isset($riscosReferencia[$risco->risco_modelo_risco_id])) {
                            if (isset($riscosReferencia[$risco->risco_modelo_risco_id]['probilidade_historico_proprio'])) {
                                if ($riscosReferencia[$risco->risco_modelo_risco_id]['probilidade_historico_proprio'] == $riscoBaseProbabilidadeHistoricoProprio->descritor) {
                                    $statusProbabilidadeHistoricoProprio = RiscoProbabilidadeHistoricoProprio::SELECIONADO;
                                }
                            }
                        }


                        $riscoHistoricoProprio = new RiscoProbabilidadeHistoricoProprio();
                        $riscoHistoricoProprio->risco_id = $risco->id;
                        $riscoHistoricoProprio->descritor = $riscoBaseProbabilidadeHistoricoProprio->descritor;
                        $riscoHistoricoProprio->eo = $riscoBaseProbabilidadeHistoricoProprio->eo;
                        $riscoHistoricoProprio->ec = (string) $riscoBaseProbabilidadeHistoricoProprio->ec;
                        $riscoHistoricoProprio->nr = $riscoBaseProbabilidadeHistoricoProprio->nr;
                        $riscoHistoricoProprio->status = $riscoBaseProbabilidadeHistoricoProprio->status;
                        $riscoHistoricoProprio->created_by = $riscoBaseProbabilidadeHistoricoProprio->created_by;
                        $riscoHistoricoProprio->created_at = $riscoBaseProbabilidadeHistoricoProprio->created_at;

                        if (!$riscoHistoricoProprio->save()) {
                            throw new HttpException(500, "ECR5 - Erro ao salvar a taxa de probabilidade do Fatores Internos do risco, motivo: " . json_encode($riscoHistoricoProprio->getErrors()));
                        }
                    }

                    foreach ($riscoBase->getRiscoModeloProbabilidadeContextoSimilars()->andWhere(['!=', 'status', RiscoProbabilidadeHistoricoProprio::INATIVO])->all() as $riscoBaseProbabilidadeContextoSimilar) {

                        $statusProbabilidadeContextoSimilar = RiscoProbabilidadeContextoSimilar::ATIVO;


                        if (isset($riscosReferencia[$risco->risco_modelo_risco_id])) {
                            if (isset($riscosReferencia[$risco->risco_modelo_risco_id]['probabilidade_contexto_similar'])) {
                                if ($riscosReferencia[$risco->risco_modelo_risco_id]['probabilidade_contexto_similar'] == $riscoBaseProbabilidadeContextoSimilar->descritor) {
                                    $statusProbabilidadeContextoSimilar = RiscoProbabilidadeContextoSimilar::SELECIONADO;
                                }
                            }
                        }


                        $riscoContextoSimilar = new RiscoProbabilidadeContextoSimilar();
                        $riscoContextoSimilar->risco_id = $risco->id;
                        $riscoContextoSimilar->descritor = $riscoBaseProbabilidadeContextoSimilar->descritor;
                        $riscoContextoSimilar->eo = $riscoBaseProbabilidadeContextoSimilar->eo;
                        $riscoContextoSimilar->ec = (string) $riscoBaseProbabilidadeContextoSimilar->ec;
                        $riscoContextoSimilar->nr = $riscoBaseProbabilidadeContextoSimilar->nr;
                        $riscoContextoSimilar->status = $riscoBaseProbabilidadeContextoSimilar->status;
                        $riscoContextoSimilar->created_by = $riscoBaseProbabilidadeContextoSimilar->created_by;
                        $riscoContextoSimilar->created_at = $riscoBaseProbabilidadeContextoSimilar->created_at;

                        if (!$riscoContextoSimilar->save()) {
                            throw new HttpException(500, "ECR6 - Erro ao salvar a taxa de probabilidade do Fatores Externos do risco, motivo: " . json_encode($riscoContextoSimilar->getErrors()));
                        }
                    }

                    $riscoModeloRiscoVerticals = RiscoModeloRiscoVertical::find()
                        ->where([
                            'risco_modelo_risco_id' => $riscoBase->id,
                            'status' => RiscoModeloRiscoVertical::ATIVO,
                        ])
                        ->all();

                    foreach ($riscoModeloRiscoVerticals as $riscoBaseVertical) {

                        $riscoVertical = new RiscoVertical();
                        $riscoVertical->risco_id = $risco->id;
                        $riscoVertical->chave = $riscoBaseVertical->chave;
                        $riscoVertical->parent = $riscoBaseVertical->parent;
                        $riscoVertical->parent_id = $riscoBaseVertical->parent_id;
                        $riscoVertical->texto = $riscoBaseVertical->texto;
                        $riscoVertical->tipo = $riscoBaseVertical->tipo;
                        $riscoVertical->taxa_substituicao = $riscoBaseVertical->taxa_substituicao;
                        $riscoVertical->created_by = $riscoBaseVertical->created_by;
                        $riscoVertical->created_at = $riscoBaseVertical->created_at;
                        $riscoVertical->status = $riscoBaseVertical->status;

                        if (!$riscoVertical->save()) {
                            throw new HttpException(500, "ECR7 - Erro ao salvar o item da vertical do risco, motivo: " . json_encode($riscoVertical->getErrors()));
                        }
                    }

                    $atualizaHistoricoProprioOcorrencia = $risco->getAtualizaHistoricoProprioOcorrencia();

                    if (!$atualizaHistoricoProprioOcorrencia) {
                        throw new HttpException(500, "ECR10B - Erro ao atualizar o Fatores Internos baseado nas ocorrências, motivo: " . $atualizaHistoricoProprioOcorrencia->getMessage());
                    }

                    $geraPontuacao = $risco->getGeraPontuacaoAnalise();
                    if (!$geraPontuacao) {
                        throw new HttpException(500, "ECR10 - Erro ao gerar a pontuação da Análise do risco, motivo: " . $geraPontuacao->getMessage());
                    }

                    $risco->pendencia = $risco->getPendencia();
                    if (!$risco->save()) {
                        throw new HttpException(500, "ECR8 - Erro ao salvar a pendência do risco, motivo: " . json_encode($risco->getErrors()));
                    }

                    $geraProbabilidade = $risco->getGeraProbabilidade();
                    if (!$geraProbabilidade) {
                        throw new HttpException(500, "ECR11 - Erro ao gerar a probabilidade do risco, motivo: " . $geraProbabilidade->getMessage());
                    }

                    $geraPontuacaoRisco = $risco->getGeraPontuacao();
                    if (!$geraPontuacaoRisco) {
                        throw new HttpException(500, "ECR12 - Erro ao gerar a pontuação do risco, motivo: " . $geraPontuacaoRisco->getMessage());
                    }
                } //fim riscos


                $novoCenario->pontuacao = RiscoCenario::geraPontuacao($novoCenario);
                if (!$novoCenario->save()) {
                    throw new HttpException(500, "ECR13 - Erro ao gerar a pontuacao do cenário, motivo: " . $novoCenario->getMessage());
                }
            } else {
                throw new HttpException(500, 'E1 - Erro ao salvar o cenário, motivo: ' . json_encode($novoCenario->getErrors()));
            }

            $transaction->commit();
        } catch (Exception $ex) {

            $transaction->rollback();
            throw new HttpException(500, $ex->getMessage());
        }
        ////////////
    }


    public static function geraCenarioRiscoColeta($coletaId, $mostraMsg = false)
    {

        $coleta = Coleta::findOne($coletaId);

        if ($coleta) {

            $coletaJaEhCenario = RiscoCenario::find()
                ->where([
                    'coleta_vinculo' => $coleta->id,
                    'status' => RiscoCenario::ATIVO,
                ])
                ->one();

            if ($coletaJaEhCenario) {

                $msg = '';
                $valid = true;
                $connection = \Yii::$app->db;

                $transaction = $connection->beginTransaction();
                try {
                    foreach ($coletaJaEhCenario->getRiscos()->andWhere(['status' => Risco::ATIVO])->all() as $risco) {
                        if ($valid) {
                            $geraPontuacao = $risco->getGeraPontuacaoAnalise();
                            if (!$geraPontuacao) {
                                $valid = false;
                                $msg .= "ECR10 - Erro ao atualizar a pontuação da Análise do risco, motivo: " . $geraPontuacao->getMessage();
                            }

                            if ($valid) {
                                $geraProbabilidade = $risco->getGeraProbabilidade();
                                if (!$geraProbabilidade) {
                                    $valid = false;
                                    $msg .= "ECR11 - Erro ao atualizar a probabilidade do risco, motivo: " . $geraProbabilidade->getMessage();
                                }
                            }

                            if ($valid) {
                                $atualizaHistoricoProprioOcorrencia = $risco->getAtualizaHistoricoProprioOcorrencia();
                                if (!$atualizaHistoricoProprioOcorrencia) {
                                    $valid = false;
                                    $msg .= "ECR10A - Erro ao atualizar o Fatores Internos baseado nas ocorrências, motivo: " . $atualizaHistoricoProprioOcorrencia->getMessage();
                                }
                            }

                            if ($valid) {
                                $geraPontuacaoRisco = $risco->getGeraPontuacao();
                                if (!$geraPontuacaoRisco) {
                                    $valid = false;
                                    $msg .= "ECR12 - Erro ao gerar a pontuação do risco, motivo: " . $geraPontuacaoRisco->getMessage();
                                }
                            }
                        }
                    } //fim riscos

                    if ($valid) {
                        $coletaJaEhCenario->pontuacao = RiscoCenario::geraPontuacao($coletaJaEhCenario);
                        if (!$coletaJaEhCenario->save()) {
                            $valid = false;
                            $msg .= "ECR13 - Erro ao gerar a pontuacao do cenário, motivo: " . json_encode($coletaJaEhCenario->getErrors());
                        }
                    }
                    if ($valid) {
                        $transaction->commit();
                    } else {
                        $transaction->rollback();
                    }
                } catch (Exception $ex) {
                    $transaction->rollback();
                }
            } else {

                $projetoId = $coleta->projeto_id;
                $verticalId = $coleta->vertical_id;
                $contextoId = $coleta->contexto_id;

                $coletasIguais = Coleta::find()
                    ->select('id')
                    ->where([
                        'projeto_id' => $projetoId,
                        'vertical_id' => $verticalId,
                        'contexto_id' => $contextoId,
                        'status' => Coleta::ATIVO,
                    ])
                    ->andWhere(['!=', 'id', $coletaId])
                    ->column();

                if (!empty($coletasIguais)) {

                    $cenariosBase = RiscoCenario::find()
                        ->where([
                            'status' => RiscoCenario::ATIVO,
                        ])
                        ->andWhere(['in', 'coleta_vinculo', $coletasIguais])
                        ->orderBy('id DESC')
                        ->limit(1)
                        ->all();

                    /*$cenariosBase = RiscoCenario::find()
                        ->where([
                            'repete_nova_coleta' => RiscoCenario::REPETE_SIM,
                            'status' => RiscoCenario::ATIVO,
                        ])
                        ->andWhere(['in', 'coleta_vinculo', $coletasIguais])
                        ->all();
                        */

                    foreach ($cenariosBase as $cenarioBase) {

                        $riscosBase = [];

                        $riscosCenarioBase = $cenarioBase->getRiscos()->andWhere(['=', 'status', Risco::ATIVO])->all();

                        foreach ($riscosCenarioBase as $riscoCenarioBase) {

                            $consequenciasBase = [];

                            foreach ($riscoCenarioBase->getRiscoConsequencias()->andWhere(['!=', 'status', RiscoConsequencia::INATIVO])->all() as $riscoCenarioBaseConsequencia) {

                                $consequenciasBase[] = [
                                    'descritor' => $riscoCenarioBaseConsequencia->descritor,
                                    'eo' => $riscoCenarioBaseConsequencia->eo,
                                    'ec' => $riscoCenarioBaseConsequencia->ec,
                                    'nr' => $riscoCenarioBaseConsequencia->nr,
                                    'status' => $riscoCenarioBaseConsequencia->status,
                                    'created_by' => $coleta->created_by,
                                    'created_at' => date('Y-m-d H:i:s'),
                                ];
                            }

                            $probabilidadeTaxaSubstituicaoBase = [];
                            foreach ($riscoCenarioBase->getRiscoProbabilidadeTaxaSubstituicaos()->andWhere(['!=', 'status', RiscoProbabilidadeTaxaSubstituicao::INATIVO])->all() as $riscoCenarioBaseTaxaSubstituicao) {
                                $probabilidadeTaxaSubstituicaoBase[$riscoCenarioBase->id] = [
                                    'historico_proprio' => $riscoCenarioBaseTaxaSubstituicao->historico_proprio,
                                    'contexto_similar' => $riscoCenarioBaseTaxaSubstituicao->contexto_similar,
                                    'condicao_vulnerabilidade' => $riscoCenarioBaseTaxaSubstituicao->condicao_vulnerabilidade,
                                    'status' => $riscoCenarioBaseTaxaSubstituicao->status,
                                    'created_by' => $coleta->created_by,
                                    'created_at' => date('Y-m-d H:i:s'),
                                ];
                            }

                            $probabilidadeHistoricoProprioBase = [];
                            foreach ($riscoCenarioBase->getRiscoProbabilidadeHistoricoProprios()->andWhere(['!=', 'status', RiscoProbabilidadeHistoricoProprio::INATIVO])->all() as $riscoCenarioBaseHistoricoProprio) {
                                $probabilidadeHistoricoProprioBase[] = [
                                    'descritor' => $riscoCenarioBaseHistoricoProprio->descritor,
                                    'eo' => $riscoCenarioBaseHistoricoProprio->eo,
                                    'ec' => $riscoCenarioBaseHistoricoProprio->ec,
                                    'nr' => $riscoCenarioBaseHistoricoProprio->nr,
                                    'status' => $riscoCenarioBaseHistoricoProprio->status,
                                    'created_by' => $coleta->created_by,
                                    'created_at' => date('Y-m-d H:i:s'),
                                ];
                            }

                            $probabilidadeContextoSimilarBase = [];
                            foreach ($riscoCenarioBase->getRiscoProbabilidadeContextoSimilars()->andWhere(['!=', 'status', RiscoProbabilidadeContextoSimilar::INATIVO])->all() as $riscoCenarioBaseContextoSimilar) {
                                $probabilidadeContextoSimilarBase[] = [
                                    'descritor' => $riscoCenarioBaseContextoSimilar->descritor,
                                    'eo' => $riscoCenarioBaseContextoSimilar->eo,
                                    'ec' => $riscoCenarioBaseContextoSimilar->ec,
                                    'nr' => $riscoCenarioBaseContextoSimilar->nr,
                                    'status' => $riscoCenarioBaseContextoSimilar->status,
                                    'created_by' => $coleta->created_by,
                                    'created_at' => date('Y-m-d H:i:s'),
                                ];
                            }

                            $vertical = [];
                            $chave = Yii::$app->security->generateRandomString(40);

                            foreach ($riscoCenarioBase->getRiscoVerticals()->andWhere(['!=', 'status', RiscoProbabilidadeContextoSimilar::INATIVO])->orderBy(['id' => SORT_ASC])->all() as $riscoCenarioBaseVertical) {
                                // nao propaga nos repetidos do risco base para a nova coleta
                                if (isset($vertical[$riscoCenarioBaseVertical->parent])) {
                                    continue;
                                }
                                $vertical[$riscoCenarioBaseVertical->parent] = [
                                    'chave' => $chave,
                                    'parent' => $riscoCenarioBaseVertical->parent,
                                    'parent_id' => $riscoCenarioBaseVertical->parent_id,
                                    'texto' => $riscoCenarioBaseVertical->texto,
                                    'tipo' => $riscoCenarioBaseVertical->tipo,
                                    'taxa_substituicao' => $riscoCenarioBaseVertical->taxa_substituicao,
                                    'created_by' => $coleta->created_by,
                                    'created_at' => date('Y-m-d H:i:s'),
                                    'status' => $riscoCenarioBaseVertical->status,
                                ];
                            }

                            $riscosBase[$riscoCenarioBase->id] = [
                                'nome' => $riscoCenarioBase->nome,
                                'descricao' => $riscoCenarioBase->descricao,
                                'taxa_substituicao' => $riscoCenarioBase->taxa_substituicao,
                                'status' => $riscoCenarioBase->status,
                                'created_by' => $coleta->created_by,
                                'created_at' => date('Y-m-d H:i:s'),
                                'analise' => $riscoCenarioBase->analise,
                                'risco_natureza_id' => $riscoCenarioBase->risco_natureza_id,
                                'consequencias' => $consequenciasBase,
                                'probabilidade_taxa_substituicao' => $probabilidadeTaxaSubstituicaoBase,
                                'probilidade_historico_proprio' => $probabilidadeHistoricoProprioBase,
                                'probabilidade_contexto_similar' => $probabilidadeContextoSimilarBase,
                                'vertical' => $vertical,
                                'risco_modelo_risco_id' => $riscoCenarioBase->risco_modelo_risco_id,
                            ];
                        }

                        //      
                        $msg = '';
                        $valid = true;
                        $connection = \Yii::$app->db;

                        $transaction = $connection->beginTransaction();
                        try {

                            $novoCenario = new RiscoCenario();
                            $novoCenario->nome = date('d/m/Y H:i');
                            $novoCenario->descricao = $cenarioBase->descricao;
                            $novoCenario->coleta_vinculo = $coleta->id;
                            $novoCenario->default = self::PADRAO_NAO;
                            $novoCenario->status = self::ATIVO;
                            $novoCenario->created_by = $coleta->created_by;
                            $novoCenario->created_at = date('Y-m-d H:i:s');
                            $novoCenario->risco_modelo_id = $cenarioBase->risco_modelo_id;
                            $novoCenario->repete_nova_coleta = self::REPETE_NAO;

                            if ($novoCenario->save()) {

                                $riscoModeloFaixas = RiscoModeloFaixa::find()
                                    ->where([
                                        'risco_modelo_id' => $novoCenario->risco_modelo_id,
                                        'status' => RiscoModeloFaixa::ATIVO
                                    ])
                                    ->all();


                                if (!$riscoModeloFaixas) {
                                    $faixas = RiscoModeloFaixa::FAIXA_BASE;
                                } else {
                                    $faixas = [];

                                    foreach ($riscoModeloFaixas as $riscoModeloFaixa) {

                                        $faixas[] = [
                                            'faixa' => $riscoModeloFaixa->faixa,
                                            'de' => $riscoModeloFaixa->de,
                                            'ate' => $riscoModeloFaixa->ate,
                                            'cor' => $riscoModeloFaixa->cor,
                                        ];
                                    }
                                }

                                foreach ($faixas as $faixa) {

                                    $riscoCenarioFaixa = new RiscoCenarioFaixa();
                                    $riscoCenarioFaixa->risco_cenario_id = $novoCenario->id;
                                    $riscoCenarioFaixa->faixa = $faixa['faixa'];
                                    $riscoCenarioFaixa->de = $faixa['de'];
                                    $riscoCenarioFaixa->ate = $faixa['ate'];
                                    $riscoCenarioFaixa->cor = $faixa['cor'];
                                    $riscoCenarioFaixa->status = RiscoCenarioFaixa::ATIVO;

                                    if (!$riscoCenarioFaixa->save()) {
                                        $valid = false;
                                        \Yii::$app->session->setFlash('error', "ECCR2X - Erro ao cadastrar a faixa do cenário, motivo: " . json_encode($riscoCenarioFaixa->getErrors()));
                                    }
                                }

                                foreach ($riscosBase as $riscoBase) {
                                    if ($valid) {

                                        $risco = new Risco();
                                        $risco->nome = $riscoBase['nome'];
                                        $risco->descricao = $riscoBase['descricao'];
                                        $risco->taxa_substituicao = $riscoBase['taxa_substituicao'];
                                        $risco->risco_cenario_id = $novoCenario->id;
                                        $risco->status = Risco::ATIVO;
                                        $risco->created_by = $coleta->created_by;
                                        $risco->created_at = date('Y-m-d H:i:s');
                                        $risco->analise = $riscoBase['analise'];
                                        $risco->risco_natureza_id = $riscoBase['risco_natureza_id'];
                                        $risco->risco_modelo_risco_id = $riscoBase['risco_modelo_risco_id'];

                                        if (!$risco->save()) {

                                            $valid = false;
                                            $msg .= "E2 - Erro ao cadastrar o Risco, motivo: " . json_encode($risco->getErrors());
                                        }

                                        if ($valid) {

                                            foreach ($riscoBase['consequencias'] as $riscoBaseConsequencia) {

                                                if ($valid) {

                                                    if ($riscoBaseConsequencia['status'] == RiscoConsequencia::SELECIONADO) {
                                                        $risco->consequencia_valor = $riscoBaseConsequencia['ec'];
                                                        $risco->consequencia_descricao = $riscoBaseConsequencia['descritor'];
                                                        if (!$risco->save()) {
                                                            $valid = false;
                                                            $msg .= "E14 - Erro ao salvar o valor e a descrição da, motivo: " . json_encode($risco->getErrors());
                                                        }
                                                    }



                                                    $riscoConsequencia = new RiscoConsequencia();
                                                    $riscoConsequencia->risco_id = $risco->id;
                                                    $riscoConsequencia->descritor = $riscoBaseConsequencia['descritor'];
                                                    $riscoConsequencia->eo = $riscoBaseConsequencia['eo'];
                                                    $riscoConsequencia->ec = (string) $riscoBaseConsequencia['ec'];
                                                    $riscoConsequencia->nr = $riscoBaseConsequencia['nr'];
                                                    $riscoConsequencia->status = $riscoBaseConsequencia['status'];
                                                    $riscoConsequencia->created_by = $riscoBaseConsequencia['created_by'];
                                                    $riscoConsequencia->created_at = $riscoBaseConsequencia['created_at'];

                                                    if (!$riscoConsequencia->save()) {

                                                        $valid = false;
                                                        $msg .= "ECCR3 - Erro ao cadastrar a Consequência, motivo: " . json_encode($riscoConsequencia->getErrors());
                                                    }
                                                }
                                            }
                                        }

                                        if ($valid) {

                                            foreach ($riscoBase['probabilidade_taxa_substituicao'] as $riscoBaseprobabilidadeTaxaSubstituicao) {
                                                if ($valid) {
                                                    $riscoTaxaProbabilidade = new RiscoProbabilidadeTaxaSubstituicao();
                                                    $riscoTaxaProbabilidade->risco_id = $risco->id;
                                                    $riscoTaxaProbabilidade->historico_proprio = $riscoBaseprobabilidadeTaxaSubstituicao['historico_proprio'];
                                                    $riscoTaxaProbabilidade->contexto_similar = $riscoBaseprobabilidadeTaxaSubstituicao['contexto_similar'];
                                                    $riscoTaxaProbabilidade->condicao_vulnerabilidade = $riscoBaseprobabilidadeTaxaSubstituicao['condicao_vulnerabilidade'];
                                                    $riscoTaxaProbabilidade->status = $riscoBaseprobabilidadeTaxaSubstituicao['status'];
                                                    $riscoTaxaProbabilidade->created_by = $riscoBaseprobabilidadeTaxaSubstituicao['created_by'];
                                                    $riscoTaxaProbabilidade->created_at = $riscoBaseprobabilidadeTaxaSubstituicao['created_at'];

                                                    if (!$riscoTaxaProbabilidade->save()) {

                                                        $valid = false;
                                                        $msg .= "ECR4 - Erro ao salvar a taxa de substituição do risco, motivo: " . json_encode($riscoTaxaProbabilidade->getErrors());
                                                    }
                                                }
                                            }
                                        }

                                        if ($valid) {

                                            foreach ($riscoBase['probilidade_historico_proprio'] as $riscoBaseProbabilidadeHistoricoProprio) {
                                                if ($valid) {
                                                    $riscoHistoricoProprio = new RiscoProbabilidadeHistoricoProprio();
                                                    $riscoHistoricoProprio->risco_id = $risco->id;
                                                    $riscoHistoricoProprio->descritor = $riscoBaseProbabilidadeHistoricoProprio['descritor'];
                                                    $riscoHistoricoProprio->eo = $riscoBaseProbabilidadeHistoricoProprio['eo'];
                                                    $riscoHistoricoProprio->ec = (string) $riscoBaseProbabilidadeHistoricoProprio['ec'];
                                                    $riscoHistoricoProprio->nr = $riscoBaseProbabilidadeHistoricoProprio['nr'];
                                                    $riscoHistoricoProprio->status = $riscoBaseProbabilidadeHistoricoProprio['status'];
                                                    $riscoHistoricoProprio->created_by = $riscoBaseProbabilidadeHistoricoProprio['created_by'];
                                                    $riscoHistoricoProprio->created_at = $riscoBaseProbabilidadeHistoricoProprio['created_at'];

                                                    if (!$riscoHistoricoProprio->save()) {
                                                        $valid = false;
                                                        $msg .= "ECR5 - Erro ao salvar a taxa de probabilidade do Fatores Internos do risco, motivo: " . json_encode($riscoHistoricoProprio->getErrors());
                                                    }
                                                }
                                            }
                                        }

                                        if ($valid) {

                                            foreach ($riscoBase['probabilidade_contexto_similar'] as $riscoBaseProbabilidadeContextoSimilar) {
                                                if ($valid) {
                                                    $riscoContextoSimilar = new RiscoProbabilidadeContextoSimilar();
                                                    $riscoContextoSimilar->risco_id = $risco->id;
                                                    $riscoContextoSimilar->descritor = $riscoBaseProbabilidadeContextoSimilar['descritor'];
                                                    $riscoContextoSimilar->eo = $riscoBaseProbabilidadeContextoSimilar['eo'];
                                                    $riscoContextoSimilar->ec = (string) $riscoBaseProbabilidadeContextoSimilar['ec'];
                                                    $riscoContextoSimilar->nr = $riscoBaseProbabilidadeContextoSimilar['nr'];
                                                    $riscoContextoSimilar->status = $riscoBaseProbabilidadeContextoSimilar['status'];
                                                    $riscoContextoSimilar->created_by = $riscoBaseProbabilidadeContextoSimilar['created_by'];
                                                    $riscoContextoSimilar->created_at = $riscoBaseProbabilidadeContextoSimilar['created_at'];

                                                    if (!$riscoContextoSimilar->save()) {
                                                        $valid = false;
                                                        $msg .= "ECR6 - Erro ao salvar a taxa de probabilidade do Fatores Externos do risco, motivo: " . json_encode($riscoContextoSimilar->getErrors());
                                                    }
                                                }
                                            }
                                        }

                                        if ($valid) {
                                            foreach ($riscoBase['vertical'] as $riscoBaseVertical) {
                                                if ($valid) {
                                                    $riscoVertical = new RiscoVertical();
                                                    $riscoVertical->risco_id = $risco->id;
                                                    $riscoVertical->chave = $riscoBaseVertical['chave'];
                                                    $riscoVertical->parent = $riscoBaseVertical['parent'];
                                                    $riscoVertical->parent_id = $riscoBaseVertical['parent_id'];
                                                    $riscoVertical->texto = $riscoBaseVertical['texto'];
                                                    $riscoVertical->tipo = $riscoBaseVertical['tipo'];
                                                    $riscoVertical->taxa_substituicao = $riscoBaseVertical['taxa_substituicao'];
                                                    $riscoVertical->created_by = $riscoBaseVertical['created_by'];
                                                    $riscoVertical->created_at = $riscoBaseVertical['created_at'];
                                                    $riscoVertical->status = $riscoBaseVertical['status'];

                                                    if (!$riscoVertical->save()) {
                                                        $valid = false;
                                                        $msg .= "ECR7 - Erro ao salvar o item da vertical do risco, motivo: " . json_encode($riscoVertical->getErrors());
                                                    }
                                                }
                                            }
                                        }

                                        if ($valid) {

                                            $atualizaHistoricoProprioOcorrencia = $risco->getAtualizaHistoricoProprioOcorrencia();

                                            if (!$atualizaHistoricoProprioOcorrencia) {
                                                $valid = false;
                                                $msg .= "ECR10B - Erro ao atualizar o Fatores Internos baseado nas ocorrências, motivo: " . $atualizaHistoricoProprioOcorrencia->getMessage();
                                            }
                                        }

                                        if ($valid) {
                                            $geraPontuacao = $risco->getGeraPontuacaoAnalise();
                                            if (!$geraPontuacao) {
                                                $valid = false;
                                                $msg .= "ECR10 - Erro ao gerar a pontuação da Análise do risco, motivo: " . $geraPontuacao->getMessage();
                                            }
                                        }

                                        if ($valid) {
                                            $risco->pendencia = $risco->getPendencia();
                                            if (!$risco->save()) {
                                                $valid = false;
                                                $msg .= "ECR8 - Erro ao salvar a pendência do risco, motivo: " . json_encode($risco->getErrors());
                                            }
                                        }

                                        if ($valid) {
                                            $geraProbabilidade = $risco->getGeraProbabilidade();
                                            if (!$geraProbabilidade) {
                                                $valid = false;
                                                $msg .= "ECR11 - Erro ao gerar a probabilidade do risco, motivo: " . $geraProbabilidade->getMessage();
                                            }
                                        }

                                        if ($valid) {
                                            $geraPontuacaoRisco = $risco->getGeraPontuacao();
                                            if (!$geraPontuacaoRisco) {
                                                $valid = false;
                                                $msg .= "ECR12 - Erro ao gerar a pontuação do risco, motivo: " . $geraPontuacaoRisco->getMessage();
                                            }
                                        }
                                    }
                                } //fim riscos

                                if ($valid) {
                                    $novoCenario->pontuacao = RiscoCenario::geraPontuacao($novoCenario);
                                    if (!$novoCenario->save()) {
                                        $valid = false;
                                        $msg .= "ECR13 - Erro ao gerar a pontuacao do cenário, motivo: " . $novoCenario->getMessage();
                                    }
                                }
                            } else {
                                $valid = false;
                                $msg = 'E1 - Erro ao salvar o cenário, motivo: ' . json_encode($novoCenario->getErrors());
                            }

                            if ($valid) {
                                $transaction->commit();
                            } else {

                                $transaction->rollback();
                                throw new HttpException(500, $msg);
                            }
                        } catch (Exception $ex) {

                            $transaction->rollback();
                            throw new HttpException(500, $ex->getMessage());
                        }

                        if ($mostraMsg) {
                            throw new HttpException(500, $msg);
                        }
                    }
                } else {

                    $msg = '';
                    $valid = true;
                    $connection = \Yii::$app->db;

                    $transaction = $connection->beginTransaction();
                    try {

                        $cenarioBase = RiscoModelo::find()
                            ->where([
                                'cliente_id' => $coleta->contexto->cliente_id,
                                'status' => RiscoModelo::ATIVO,
                            ])
                            ->one();
                        if (!$cenarioBase) {
                            $cenarioBase = RiscoModelo::find()
                                ->where([
                                    'id' => RiscoModelo::VIALGPD_BASE,
                                ])
                                ->one();
                        }

                        if ($cenarioBase) {
                            $model = new RiscoCenario();
                            $model->nome = date('d/m/Y H:i');
                            $model->descricao = $cenarioBase->descricao;
                            $model->coleta_vinculo = $coleta->id;
                            $model->default = self::PADRAO_NAO;
                            $model->status = self::ATIVO;
                            $model->created_by = $coleta->created_by;
                            $model->created_at = date('Y-m-d H:i:s');
                            $model->risco_modelo_id = $cenarioBase->id;
                            $model->repete_nova_coleta = self::REPETE_SIM;

                            if ($model->save()) {


                                $riscoModeloFaixas = RiscoModeloFaixa::find()
                                    ->where([
                                        'risco_modelo_id' => $model->risco_modelo_id,
                                        'status' => RiscoModeloFaixa::ATIVO
                                    ])
                                    ->all();


                                if (!$riscoModeloFaixas) {
                                    $faixas = RiscoModeloFaixa::FAIXA_BASE;
                                } else {
                                    $faixas = [];

                                    foreach ($riscoModeloFaixas as $riscoModeloFaixa) {

                                        $faixas[] = [
                                            'faixa' => $riscoModeloFaixa->faixa,
                                            'de' => $riscoModeloFaixa->de,
                                            'ate' => $riscoModeloFaixa->ate,
                                            'cor' => $riscoModeloFaixa->cor,
                                        ];
                                    }
                                }

                                foreach ($faixas as $faixa) {

                                    $riscoCenarioFaixa = new RiscoCenarioFaixa();
                                    $riscoCenarioFaixa->risco_cenario_id = $model->id;
                                    $riscoCenarioFaixa->faixa = $faixa['faixa'];
                                    $riscoCenarioFaixa->de = $faixa['de'];
                                    $riscoCenarioFaixa->ate = $faixa['ate'];
                                    $riscoCenarioFaixa->cor = $faixa['cor'];
                                    $riscoCenarioFaixa->status = RiscoCenarioFaixa::ATIVO;

                                    if (!$riscoCenarioFaixa->save()) {
                                        $valid = false;
                                        \Yii::$app->session->setFlash('error', "ECCR2X - Erro ao cadastrar a faixa do cenário, motivo: " . json_encode($riscoCenarioFaixa->getErrors()));
                                    }
                                }

                                if ($model->risco_modelo_id) {
                                    $riscosModelo = $model
                                        ->riscoModelo
                                        ->getRiscoModeloRiscos()
                                        ->andWhere(['status' => RiscoModeloRisco::ATIVO])
                                        ->all();

                                    foreach ($riscosModelo as $riscoModelo) {
                                        if ($valid) {

                                            $risco = new Risco();
                                            $risco->nome = $riscoModelo->nome;
                                            $risco->descricao = $riscoModelo->descricao;
                                            $risco->taxa_substituicao = $riscoModelo->taxa_substituicao;
                                            $risco->risco_cenario_id = $model->id;
                                            $risco->status = Risco::ATIVO;
                                            $risco->created_by = \Yii::$app->user->identity->id ?? User::USER_EXTERNAL;
                                            $risco->created_at = date('Y-m-d H:i:s');
                                            $risco->analise = $riscoModelo->analise;
                                            $risco->risco_natureza_id = $riscoModelo->risco_natureza_id;
                                            $risco->risco_modelo_risco_id = $riscoModelo->id;

                                            if (!$risco->save()) {
                                                $valid = false;
                                                \Yii::$app->session->setFlash('error', "ECCR2 - Erro ao cadastrar o Risco, motivo: " . json_encode($risco->getErrors()));
                                            }

                                            $riscoModeloConsequencias = RiscoModeloConsequencia::find()
                                                ->where([
                                                    'risco_modelo_risco_id' => $riscoModelo->id,
                                                ])
                                                ->andWhere(['!=', 'status', RiscoModeloConsequencia::INATIVO,])
                                                ->all();

                                            foreach ($riscoModeloConsequencias as $riscoModeloConsequencia) {

                                                $riscoConsequencia = new RiscoConsequencia();
                                                $riscoConsequencia->risco_id = $risco->id;
                                                $riscoConsequencia->descritor = $riscoModeloConsequencia->descritor;
                                                $riscoConsequencia->eo = $riscoModeloConsequencia->eo;
                                                $riscoConsequencia->ec = (string) $riscoModeloConsequencia->ec;
                                                $riscoConsequencia->nr = $riscoModeloConsequencia->nr;
                                                $riscoConsequencia->status = $riscoModeloConsequencia->status;
                                                $riscoConsequencia->created_by = \Yii::$app->user->identity->id ?? User::USER_EXTERNAL;
                                                $riscoConsequencia->created_at = date('Y-m-d H:i:s');

                                                if (!$riscoConsequencia->save()) {
                                                    $valid = false;
                                                    \Yii::$app->session->setFlash('error', "ECCR3 - Erro ao cadastrar a Consequência, motivo: " . json_encode($riscoConsequencia->getErrors()));
                                                }

                                                if ($riscoModeloConsequencia->status == RiscoConsequencia::SELECIONADO) {
                                                    $risco->consequencia_valor = (string) $riscoModeloConsequencia->ec;
                                                    $risco->consequencia_descricao = $riscoModeloConsequencia->descritor;

                                                    if (!$risco->save()) {
                                                        $valid = false;
                                                        \Yii::$app->session->setFlash('error', "ECCR2 - Erro ao cadastrar o Risco, motivo: " . json_encode($risco->getErrors()));
                                                    }
                                                }
                                            }


                                            if ($valid) {

                                                $riscoTaxaProbabilidadeModelo = RiscoModeloProbabilidadeTaxaSubstituicao::find()
                                                    ->where([
                                                        'risco_modelo_risco_id' => $riscoModelo->id,
                                                        'status' => RiscoModeloProbabilidadeTaxaSubstituicao::ATIVO,
                                                    ])
                                                    ->one();
                                                if ($riscoTaxaProbabilidadeModelo) {

                                                    $riscoTaxaProbabilidade = new RiscoProbabilidadeTaxaSubstituicao();
                                                    $riscoTaxaProbabilidade->risco_id = $risco->id;
                                                    $riscoTaxaProbabilidade->historico_proprio = $riscoTaxaProbabilidadeModelo->historico_proprio;
                                                    $riscoTaxaProbabilidade->contexto_similar = $riscoTaxaProbabilidadeModelo->contexto_similar;
                                                    $riscoTaxaProbabilidade->condicao_vulnerabilidade = $riscoTaxaProbabilidadeModelo->condicao_vulnerabilidade;
                                                    $riscoTaxaProbabilidade->status = RiscoModeloProbabilidadeTaxaSubstituicao::ATIVO;
                                                    $riscoTaxaProbabilidade->created_by = \Yii::$app->user->identity->id ?? User::USER_EXTERNAL;
                                                    $riscoTaxaProbabilidade->created_at = date('Y-m-d H:i:s');

                                                    if (!$riscoTaxaProbabilidade->save()) {
                                                        $valid = false;
                                                        \Yii::$app->session->setFlash('error', "ECR4 - Erro ao salvar a taxa de substituição do risco, motivo: " . json_encode($riscoTaxaProbabilidade->getErrors()));
                                                    }
                                                }
                                            }

                                            if ($valid) {

                                                $riscoHistoricoProprioProbabilidades = RiscoModeloProbabilidadeHistoricoProprio::find()
                                                    ->where([
                                                        'risco_modelo_risco_id' => $riscoModelo->id,
                                                        'status' => RiscoModeloProbabilidadeHistoricoProprio::ATIVO,
                                                    ])
                                                    ->all();

                                                foreach ($riscoHistoricoProprioProbabilidades as $riscoHistoricoProprioProbabilidade) {

                                                    if ($valid) {

                                                        $riscoHistoricoProprio = new RiscoProbabilidadeHistoricoProprio();
                                                        $riscoHistoricoProprio->risco_id = $risco->id;
                                                        $riscoHistoricoProprio->descritor = $riscoHistoricoProprioProbabilidade->descritor;
                                                        $riscoHistoricoProprio->eo = $riscoHistoricoProprioProbabilidade->eo;
                                                        $riscoHistoricoProprio->ec = (string) $riscoHistoricoProprioProbabilidade->ec;
                                                        $riscoHistoricoProprio->nr = $riscoHistoricoProprioProbabilidade->nr;
                                                        $riscoHistoricoProprio->status = RiscoProbabilidadeHistoricoProprio::ATIVO;
                                                        $riscoHistoricoProprio->created_by = \Yii::$app->user->identity->id ?? User::USER_EXTERNAL;
                                                        $riscoHistoricoProprio->created_at = date('Y-m-d H:i:s');

                                                        if (!$riscoHistoricoProprio->save()) {
                                                            $valid = false;
                                                            \Yii::$app->session->setFlash('error', "ECR5 - Erro ao salvar a taxa de probabilidade do Fatores Internos do risco, motivo: " . json_encode($riscoHistoricoProprio->getErrors()));
                                                        }
                                                    }
                                                }
                                            }

                                            if ($valid) {

                                                $riscoContextoSimilarProbabilidades = RiscoModeloProbabilidadeContextoSimilar::find()
                                                    ->where([
                                                        'risco_modelo_risco_id' => $riscoModelo->id,
                                                        'status' => RiscoModeloProbabilidadeContextoSimilar::ATIVO,
                                                    ])
                                                    ->all();

                                                foreach ($riscoContextoSimilarProbabilidades as $riscoContextoSimilarProbabilidade) {

                                                    if ($valid) {

                                                        $riscoContextoSimilar = new RiscoProbabilidadeContextoSimilar();
                                                        $riscoContextoSimilar->risco_id = $risco->id;
                                                        $riscoContextoSimilar->descritor = $riscoContextoSimilarProbabilidade->descritor;
                                                        $riscoContextoSimilar->eo = $riscoContextoSimilarProbabilidade->eo;
                                                        $riscoContextoSimilar->ec = (string) $riscoContextoSimilarProbabilidade->ec;
                                                        $riscoContextoSimilar->nr = $riscoContextoSimilarProbabilidade->nr;
                                                        $riscoContextoSimilar->status = $riscoContextoSimilarProbabilidade::ATIVO;
                                                        $riscoContextoSimilar->created_by = \Yii::$app->user->identity->id ?? User::USER_EXTERNAL;
                                                        $riscoContextoSimilar->created_at = date('Y-m-d H:i:s');

                                                        if (!$riscoContextoSimilar->save()) {
                                                            $valid = false;
                                                            \Yii::$app->session->setFlash('error', "ECR6 - Erro ao salvar a taxa de probabilidade do Fatores Externos do risco, motivo: " . json_encode($riscoContextoSimilar->getErrors()));
                                                        }
                                                    }
                                                }
                                            }

                                            if ($valid) {

                                                $riscoModeloVerticais = RiscoModeloRiscoVertical::find()
                                                    ->where([
                                                        'risco_modelo_risco_id' => $riscoModelo->id,
                                                    ])
                                                    ->all();

                                                foreach ($riscoModeloVerticais as $riscoModeloVertical) {

                                                    if ($valid) {

                                                        $riscoVertical = new RiscoVertical();
                                                        $riscoVertical->risco_id = $risco->id;
                                                        $riscoVertical->chave = $riscoModeloVertical->chave;
                                                        $riscoVertical->parent = $riscoModeloVertical->parent;
                                                        $riscoVertical->parent_id = $riscoModeloVertical->parent_id;
                                                        $riscoVertical->texto = $riscoModeloVertical->texto;
                                                        $riscoVertical->tipo = $riscoModeloVertical->tipo;
                                                        $riscoVertical->taxa_substituicao = $riscoModeloVertical->taxa_substituicao;
                                                        $riscoVertical->created_by = \Yii::$app->user->identity->id ?? User::USER_EXTERNAL;
                                                        $riscoVertical->created_at = date('Y-m-d H:i:s');
                                                        $riscoVertical->status = $riscoModeloVertical->status;

                                                        if (!$riscoVertical->save()) {
                                                            $valid = false;
                                                            \Yii::$app->session->setFlash('error', "ECR7 - Erro ao salvar o item da vertical do risco, motivo: " . json_encode($riscoVertical->getErrors()));
                                                        }
                                                    }
                                                }
                                            }

                                            if ($valid) {
                                                $geraPontuacao = $risco->getGeraPontuacaoAnalise();
                                                if (!$geraPontuacao) {
                                                    $valid = false;
                                                    \Yii::$app->session->setFlash('error', "ECR10 - Erro ao gerar a pontuação da Análise do risco, motivo: " . $geraPontuacao->getMessage());
                                                }
                                            }

                                            if ($valid) {
                                                $atualizaHistoricoProprioOcorrencia = $risco->getAtualizaHistoricoProprioOcorrencia();
                                                if (!$atualizaHistoricoProprioOcorrencia) {
                                                    $valid = false;
                                                    $msg .= "ECR10C - Erro ao atualizar o Fatores Internos baseado nas ocorrências, motivo: " . $atualizaHistoricoProprioOcorrencia->getMessage();
                                                }
                                            }

                                            if ($valid) {
                                                $risco->pendencia = $risco->getPendencia();
                                                if (!$risco->save()) {
                                                    $valid = false;
                                                    \Yii::$app->session->setFlash('error', "ECR8 - Erro ao salvar a pendência do risco, motivo: " . json_encode($risco->getErrors()));
                                                }
                                            }
                                            //
                                            //                                            if ($valid) {
                                            //                                                $geraPontuacao = $risco->getGeraPontuacaoAnalise();
                                            //                                                if (!$geraPontuacao) {
                                            //                                                    $valid = false;
                                            //                                                    $msg .= "ECR10 - Erro ao gerar a pontuação da Análise do risco, motivo: " . $geraPontuacao->getMessage();
                                            //                                                }
                                            //                                            }
                                            //
                                            //                                            if ($valid) {
                                            //                                                $geraProbabilidade = $risco->getGeraProbabilidade();
                                            //                                                if (!$geraProbabilidade) {
                                            //                                                    $valid = false;
                                            //                                                    $msg .= "ECR11 - Erro ao gerar a probabilidade do risco, motivo: " . $geraProbabilidade->getMessage();
                                            //                                                }
                                            //                                            }
                                            //
                                            //                                            if ($valid) {
                                            //                                                $geraPontuacaoRisco = $risco->getGeraPontuacao();
                                            //                                                if (!$geraPontuacaoRisco) {
                                            //                                                    $valid = false;
                                            //                                                    $msg .= "ECR12 - Erro ao gerar a pontuação do risco, motivo: " . $geraPontuacaoRisco->getMessage();
                                            //                                                }
                                            //                                            }
                                        }
                                    }
                                }
                            }


                            if ($valid) {
                                $model->pontuacao = self::geraPontuacao($model);
                                if (!$model->save()) {
                                    $valid = false;
                                    \Yii::$app->session->setFlash('error', "ECR13 - Erro ao gerar a pontuacao do cenário, motivo: " . $cenarioRisco->getMessage());
                                }
                            }
                        }

                        if ($valid) {
                            $transaction->commit();
                        } else {
                            $transaction->rollback();
                        }
                    } catch (Exception $ex) {
                        $transaction->rollback();
                    }
                }
            }
        }
    }

    public function getSomaTaxasSubstituicao()
    {

        $total = $this->getRiscos()->select('sum(taxa_substituicao) as taxa_substituicao')->andWhere('status=1')->one();

        $valor = $total->taxa_substituicao + 0;

        $label = 'success';

        if ($valor != 100) {
            $label = 'danger';
        }
        return '<span class="badge badge-lg badge-' . $label . '">' . $valor . '%</span>';
    }

    public static function geraCenarioLgpd($coleta)
    {

        return true;
    }

    public static function percentualRiscoRespondido($todosCenarios)
    {

        $cenario = reset($todosCenarios);

        if (!isset($cenario['riscos'])) {
            return 0;
        }

        $totalRiscos = count($cenario['riscos']);

        if ($totalRiscos == 0) {
            return 0;
        }

        $totalPendencia = $totalRiscos;
        foreach ($cenario['riscos'] as $risco) {
            if ($risco->pendencia) {
                $totalPendencia--;
            }
        }

        return round(($totalPendencia / $totalRiscos) * 100);
    }

    public static function atualizaCenarioAtualOcorrencia($coletaId)
    {

        $riscoCenario = self::find()
            ->where([
                'coleta_vinculo' => $coletaId,
                'status' => self::ATIVO,
            ])
            ->orderBy('id DESC')
            ->one();

        if ($riscoCenario) {

            foreach ($riscoCenario->riscos as $risco) {

                $atualizaHistoricoProprioOcorrencia = $risco->getAtualizaHistoricoProprioOcorrencia();

                if (!$atualizaHistoricoProprioOcorrencia) {
                    throw new HttpException(500, "Erro ao atualizar o risco " . $risco->id . ", motivo: " . $atualizaHistoricoProprioOcorrencia);
                }
            }

            self::geraPontuacao($riscoCenario);
        }

        return true;
    }

    public function getCorFaixa()
    {

        $faixas = [];

        $riscoCenarioFaixas = RiscoCenarioFaixa::find()
            ->where([
                'risco_cenario_id' => $this->id,
                'status' => RiscoCenarioFaixa::ATIVO
            ])
            ->all();


        if ($riscoCenarioFaixas) {

            foreach ($riscoCenarioFaixas as $riscoCenarioFaixa) {

                $faixas[] = [
                    'faixa' => $riscoCenarioFaixa->faixa,
                    'de' => $riscoCenarioFaixa->de,
                    'ate' => $riscoCenarioFaixa->ate,
                    'cor' => $riscoCenarioFaixa->cor,
                ];
            }
        } else {

            $riscoModeloFaixas = RiscoModeloFaixa::find()
                ->where([
                    'risco_modelo_id' => $this->risco_modelo_id,
                    'status' => RiscoModeloFaixa::ATIVO
                ])
                ->all();

            if ($riscoModeloFaixas) {

                foreach ($riscoModeloFaixas as $riscoModeloFaixa) {
                    $faixas[] = [
                        'faixa' => $riscoModeloFaixa->faixa,
                        'de' => $riscoModeloFaixa->de,
                        'ate' => $riscoModeloFaixa->ate,
                        'cor' => $riscoModeloFaixa->cor,
                    ];
                }
            } else {
                $faixas = RiscoModeloFaixa::FAIXA_BASE;
            }
        }

        foreach ($faixas as $faixa) {
            if ($this->pontuacao >= $faixa['de'] && $this->pontuacao <= $faixa['ate']) {
                return $faixa["cor"];
            }
        }

        return 'gray';
    }
}
