<?php

declare(strict_types=1);

class Regulacao_Service_Buscahistoricoalteracaoitemvsd
{
    private const MAP_FIELD_TO_LABEL = [
        'vl_altitude' => 'Altitude',
        'id_tipo_solo' => 'Tipo de Solo',
        'id_variedade' => 'Variedade',
        'dt_inicio_plantio' => 'Data Início Plantio',
        'dt_termino_plantio' => 'Data Término Plantio',
        'id_sistema_plantio' => 'Sistema de Plantio',
        'vl_area_vistoriada' => 'Area Vistoriada',
        'vl_rendimento_final' => 'Rendimento Final',
        'fl_zoneamento_valido' => 'Zoneamento Válido',
        'vl_percentual_graos_podres' => 'Grãos Podres (%)',
        'vl_percentual_graos_brotados' => 'Grãos Brotados (%)',
        'vl_percentual_graos_avariados' => 'Grãos Avariados (%)',
        'vl_area_colhidos_antes_vistoria' => 'Área Colhida Antes da Vistoria',
        'vl_percentual_pragas_doencas_outros' => 'Pragas, doenças e outros danos (%)',
        'mecanizado' => 'Amostragem Mecanizada',
        'vl_distancia_percorrida' => 'Distância percorrida (m)',
        'vl_largura_plataforma' => 'Largura da Plataforma (m)',
        'vl_m2_perda_colheita' => 'Perda de colheita (%)',
        'vl_percentual_desconto_umidade' => 'Desconto de Umidade (%)',
        'vl_producao_colhida' => 'Produção colhida na amostra (Kg)',
        'vl_producao_perdida_colheita' => 'Perda de colheita (%)',
        'manual' => 'Amostragem Manual',
        'index_amostra' => 'Amostra',
        'fl_exclusao' => 'Excluída',
        'vl_espacamento' => 'Espaçamento entre linhas (m)',
        'vl_metro_linear_colhido' => 'Metros de linha colhidos',
        'vl_m2_colhido' => 'Metros quadrados colhidos',
        'vl_producao_colhida' => 'Produção colhida na amostra (Kg)',
        'vl_percentual_perda_colheita' => 'Perdas de colheita',
        'vl_percentual_umidade_graos' => 'Umidade dos grãos (%)',
        'vl_percentual_desconto_umidade' => 'Desconto de Umidade (%)',
        'vl_producao_liquida' => 'Produção líquida em Kg / Hectare',
    ];

    public function busca(int $idLaudoFinal, int $idItemSegurado): array
    {
        $modelLog = new Log_Model_LogAlteracoesVistoriasFinais();
        $rsLogs = $modelLog->getDados(
            $idLaudoFinal,
            $idItemSegurado
        );
        
        foreach ($rsLogs as $indice => $logs) {
            $alteracoes = json_decode($logs['ds_alteracoes'], true);
            $alteracoesAtualizadas = [];
            
            $alteracoesAtualizadas['metadata'] = [
                'data_alteracao' => $logs['dt_criacao'],
                'id' => $logs['id'],
                'nome_usuario' => $logs['ds_nome_usuario']
            ];

            if (!array_key_exists(0, $alteracoes)) {
                throw new Exception('Não há alterações.');
            }

            foreach ($alteracoes[0] as $campo => $valor) {
                $campoAtualizado = self::MAP_FIELD_TO_LABEL[$campo];
    
                if (empty($campoAtualizado)) {
                    continue;
                }

                $dados = new stdClass();

                if ($campo == 'mecanizado') {
                    foreach ($valor as $campoMec => $valorMec) {
                        $dadosMecanizados = new stdClass();

                        $dadosMecanizados->campo = self::MAP_FIELD_TO_LABEL[$campoMec];
                        $dadosMecanizados->valor = $valorMec === true ? 'Sim' : $valorMec;
                        $dadosMecanizados->valor = $valorMec === false ? 'Não' : $dadosMecanizados->valor;

                        $alteracoesAtualizadas['mecanizado'][] = $dadosMecanizados;
                    }
                    
                    continue;
                } elseif ($campo == 'manual') {
                    foreach ($valor as $amostrasManuais) {
                        foreach ($amostrasManuais as $amostraManual) {
                            foreach ($amostraManual as $campoManual => $valorManual) {
                                $dadosManuais = new stdClass();

                                $dadosManuais->campo = self::MAP_FIELD_TO_LABEL[$campoManual];
                                $dadosManuais->valor = $valorManual === true ? 'Sim' : $valorManual;
                                $dadosManuais->valor = $valorManual === false ? 'Não' : $dadosManuais->valor;

                                $alteracoesAtualizadas['manual'][$amostraManual['index_amostra']][] = $dadosManuais;
                            }
                        }
                    }

                    continue;
                }

                $aux = explode('_', $campo);
                $val = $aux[0] == 'id' ? $this->getDescricaoById($campo, $valor) : $valor;

                $val = $val === true ? 'Sim' : $val;
                $val = $val === false ? 'Não' : $val;

                if ($aux[0] == 'dt') {
                    $date = new DateTime($valor);
                    $val = $date->format('d/m/Y H:i:s');
                }

                $dados->campo = $campoAtualizado;
                $dados->valor = $val;
                $alteracoesAtualizadas[] = $dados;
            }

            $rowsLogs[$indice]['ds_alteracoes'] = json_encode($alteracoesAtualizadas);
        }
        
        return $rowsLogs ?? [];
    }

    private function getDescricaoById(string $nomeCampo, int $id): string
    {
        switch($nomeCampo) {
            case 'id_tipo_solo':
                    $tipoSolo = (new Produto_Model_Tiposolo())->find($id)->current();
                    return $tipoSolo->ds_descricao_resumida ?? '';
                break;
            case 'id_variedade':
                    $variedade = (new Produto_Model_Variedades())->find($id)->current();
                    return $variedade->ds_nome_variedade ?? '';
                break;
            case 'id_sistema_plantio':
                    $sistemaPlantio = (new Produto_Model_SistemaPlantio())->find($id)->current();
                    return $sistemaPlantio->ds_descricao ?? '';
                break;
        }

        return '';
    }
}
?>