<?php

class DiariasValoresController extends Controller
{
    private $diariasValoresModel;
    private $db;

    public function __construct()
    {
        $this->diariasValoresModel = $this->model('DiariasValores');
    }

    // Listar todos os valores cadastrados
    public function index()
    {
        $dados = [
            'valores' => $this->diariasValoresModel->listarTodos()
        ];

        $this->view('layout', [
            'conteudo' => __DIR__ . '/../Views/diarias_valores/index.php',
            'dados'    => $dados
        ]);
    }

    // Cadastrar novo valor de diária
    public function cadastrar()
    {
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            $formulario = filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);

            $dados = [
                'cargo'         => trim($formulario['cargo']),
                'tipo_destino'  => trim($formulario['tipo_destino']),
                'valor'         => trim($formulario['valor'])
            ];

            if (empty($dados['cargo']) || empty($dados['tipo_destino']) || empty($dados['valor'])) {
                Sessao::mensagem('diarias_valores', 'Preencha todos os campos obrigatórios.', 'alert-danger');

                $this->view('layout', [
                    'conteudo' => __DIR__ . '/../Views/diarias_valores/cadastrar.php',
                    'dados'    => $dados
                ]);
                return;
            }

            if ($this->diariasValoresModel->inserir($dados)) {
                Sessao::mensagem('diarias_valores', 'Valor cadastrado com sucesso!');
                URL::redirecionar('diariasvalores');
            } else {
                Sessao::mensagem('diarias_valores', 'Erro ao cadastrar valor.', 'alert-danger');

                $this->view('layout', [
                    'conteudo' => __DIR__ . '/../Views/diarias_valores/cadastrar.php',
                    'dados'    => $dados
                ]);
            }
        } else {
            $dados = [
                'cargo'        => '',
                'tipo_destino' => '',
                'valor'        => ''
            ];

            $this->view('layout', [
                'conteudo' => __DIR__ . '/../Views/diarias_valores/cadastrar.php',
                'dados'    => $dados
            ]);
        }
    }

    // Editar valor de diária
    public function editar($id)
    {
        $valor = $this->diariasValoresModel->buscarPorId($id);
        if (!$valor) {
            Sessao::mensagem('diarias_valores', 'Valor não encontrado!', 'alert-danger');
            URL::redirecionar('diariasvalores');
        }

        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            $formulario = filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);

            $dados = [
                'cargo'         => trim($formulario['cargo']),
                'tipo_destino'  => trim($formulario['tipo_destino']),
                'valor'         => trim($formulario['valor'])
            ];

            if ($this->diariasValoresModel->atualizar($id, $dados)) {
                Sessao::mensagem('diarias_valores', 'Valor alterado com sucesso!');
                URL::redirecionar('diariasvalores');
            } else {
                Sessao::mensagem('diarias_valores', 'Erro ao editar valor.', 'alert-danger');

                $this->view('layout', [
                    'conteudo' => __DIR__ . '/../Views/diarias_valores/editar.php',
                    'dados'    => $dados
                ]);
            }
        } else {
            $dados = (array) $valor;

            $this->view('layout', [
                'conteudo' => __DIR__ . '/../Views/diarias_valores/editar.php',
                'dados'    => $dados
            ]);
        }
    }

    // Remover valor de diária
    public function remover($id)
    {
        if ($this->diariasValoresModel->remover($id)) {
            Sessao::mensagem('diarias_valores', 'Valor removido com sucesso!');
        } else {
            Sessao::mensagem('diarias_valores', 'Erro ao remover valor.', 'alert-danger');
        }

        URL::redirecionar('diariasvalores');
    }

    // Visualizar valor de diária
    public function visualizar($id)
    {
        $valor = $this->diariasValoresModel->buscarPorId($id);
        if (!$valor) {
            Sessao::mensagem('diarias_valores', 'Valor não encontrado!', 'alert-danger');
            URL::redirecionar('diariasvalores');
        }

        $dados = ['valor' => $valor];

        $this->view('layout', [
            'conteudo' => __DIR__ . '/../Views/diarias_valores/visualizar.php',
            'dados'    => $dados
        ]);
    }

    // AJAX para cálculo de valor
    public function calcular_ajax()
    {
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            $cargo   = $_POST['cargo'] ?? '';
            $destino = $_POST['destino'] ?? '';
            $tempo   = $_POST['tempo'] ?? 24;
            $regiao  = $_POST['regiao'] ?? 'outra';

            $destino = $this->normalizarTipoDestino($destino);
            if (empty($destino)) {
                $destino = 'outras_cidades';
            }

            $valor = $this->diariasValoresModel->calcularValorDiaria($cargo, $destino, $tempo, $regiao);

            header('Content-Type: application/json');
            echo json_encode(['valor' => number_format($valor, 2, '.', '')]);
        }
    }

    // Normalizar nomes de destino
    private function normalizarTipoDestino($tipo)
    {
        $mapa = [
            'capital_estado'          => 'capitais_de_estado',
            'capitais'                => 'capitais_de_estado',
            'capitais_de_estado'      => 'capitais_de_estado',
            'outras'                  => 'outras_cidades',
            'interior'                => 'outras_cidades',
            'outras_cidades'          => 'outras_cidades',
            'capitalfederal'          => 'capital_federal',
            'capital_federal'         => 'capital_federal',
            'brasilia'                => 'capital_federal',
            'internacional'           => 'viagens_internacionais',
            'viagem_internacional'    => 'viagens_internacionais',
            'viagens_internacionais'  => 'viagens_internacionais'
        ];

        $tipo = strtolower(trim(str_replace(' ', '_', $tipo)));
        return $mapa[$tipo] ?? $tipo;
    }

    // Método auxiliar (não usado diretamente no controller, mas pode ser útil)
    public function calcularValorDiaria($cargo, $tipo_destino, $tempo = 24, $regiao = 'outra')
    {
        $this->db->query("SELECT valor FROM diarias_valores WHERE cargo = :cargo AND tipo_destino = :tipo_destino LIMIT 1");
        $this->db->bind('cargo', $cargo);
        $this->db->bind('tipo_destino', $tipo_destino);
        $res = $this->db->resultado();

        return $res ? (float) $res->valor : 0.0;
    }
}
