<?php

class ControllerShippingFreteFaixadeCep extends Controller
{
    private $error = array();

    public function index()
    {
        $language = $this->load->language('shipping/fretefaixadecep');
        $this->data = array_merge($this->data, $language);

        $this->document->setTitle($this->language->get('heading_title'));
        $this->document->addScript('admin/public/js/shipping/fretefaixadecep.js');

        $this->load->model('setting/setting');
        $this->load->dmodel('shipping/fretefaixadecep');
        $this->load->type('tipocomum');
        $this->load->helper('ftr_geral');

        $this->data['ftr_geral'] = new ftr_geral();

        $this->data['type_descontos'] = Type_Desconto::getEnumList();
        $this->data['Type_Status'] = Type_Status::getEnumList();

        $token = $this->session->data['token'];

        $this->data['breadcrumbs'] = [
            [
                'text' => $this->language->get('text_home'),
                'href' => $this->url->link('common/home', 'token=' . $token, 'SSL'),
            ],
            [
                'text' => $this->language->get('text_shipping'),
                'href' => $this->url->linkAnchor('extension/module', 'token=' . $token, 'tab-info=' . $this->request->get['type'], 'SSL')
            ],
            [
                'text' => $this->language->get('heading_title'),
                'href' => $this->url->link('shipping/fretefaixadecep', 'token=' . $token . '&type=' . $this->request->get['type'], 'SSL')
            ]
        ];

        $page = isset($this->request->get['page']) ? $this->request->get['page'] : 1;

        $url_pagination = $this->url->link(
            'shipping/fretefaixadecep',
            'token=' . $token . '&type=' . Type_TitleModules::Tp_Envio . '&page={page}',
            'SSL'
        );

        $pagination = new Pagination();
        $pagination->total = $this->dmodel_shipping_fretefaixadecep->getFreteFaixadeCepsTotal();
        $pagination->page = $page;
        $pagination->limit = $this->config->get('config_admin_limit');
        $pagination->text = $this->language->get('text_pagination');
        $pagination->url = $url_pagination;
        $this->data['pagination'] = $pagination->render();

        $faixaceps = $this->dmodel_shipping_fretefaixadecep->getFreteFaixadeCeps([
            'start' => ($page - 1) * $this->config->get('config_admin_limit'),
            'limit' => $this->config->get('config_admin_limit')
        ]);

        foreach ($faixaceps as $faixacepKey => $faixacep) {
            $valueMinWeight = $faixacep['produto_min_weight'] > 0 ? $faixacep['produto_min_weight'] : false;
            $faixaceps[$faixacepKey]['produto_min_weight'] = $valueMinWeight;

            $valueMaxWeight = $faixacep['produto_max_weight'] > 0 ? $faixacep['produto_max_weight'] : false;
            $faixaceps[$faixacepKey]['produto_max_weight'] = $valueMaxWeight;

            $valueStatus = Type_Status::getNickFromValue($faixacep['cep_status']);
            $faixaceps[$faixacepKey]['cep_status'] = $valueStatus;
        }

        $displayPage = count($faixaceps) > 0 ? 'faixaceps' : 'config';

        $urlInsert = $this->url->link(
            'shipping/fretefaixadecep/insert',
            'token=' . $token,
            'SSL'
        );
        $urlEdit = $this->url->link(
            'shipping/fretefaixadecep/edit',
            'token=' . $token . '&faixa_cep_id=',
            'SSL'
        );
        $urlShow = $this->url->link(
            'shipping/fretefaixadecep/show',
            'token=' . $token,
            'SSL'
        );
        $urlDelete = $this->url->link(
            'shipping/fretefaixadecep/delete',
            'token=' . $token,
            'SSL'
        );
        $urlSave = $this->url->link(
            'shipping/fretefaixadecep/save',
            'token=' . $token . '&type=' . $this->request->get['type'],
            'SSL'
        );

        $this->data['data'] = [
            'page' => $displayPage,
            'faixaceps' => $faixaceps,
            'configurations' => [
                'fretefaixadecep_title' => $this->config->get('fretefaixadecep_title'),
                'fretefaixadecep_status' => $this->config->get('fretefaixadecep_status'),
                'fretefaixadecep_sort_order' => $this->config->get('fretefaixadecep_sort_order'),
            ],
            'urlShow' => str_replace('&amp;', '&', $urlShow),
            'urlDelete' => str_replace('&amp;', '&', $urlDelete),
            'insert' => str_replace('&amp;', '&', $urlInsert),
            'edit' => str_replace('&amp;', '&', $urlEdit),
            'save' => str_replace('&amp;', '&', $urlSave),
        ];

        $this->children = [
            'common/header',
            'common/footer',
        ];

        $this->response->setOutput($this->render('shipping/fretefaixadecep'));
    }

    public function show()
    {
        $response = [];

        if (!$this->user->hasPermission('modify', 'shipping/fretefaixadecep')) {
            $response['warning'] = $this->language->get('error_permission');
            return $this->response->setOutputJson($response);
        }

        $faixaCepId = $this->request->post['faixa_cep_id'];

        if (!isset($faixaCepId)) {
            $response['warning'] = 'Faixa de cep não encontrado';
            return $this->response->setOutputJson($response);
        }

        $this->load->dmodel('shipping/fretefaixadecep');
        $faixaCepInfo = $this->dmodel_shipping_fretefaixadecep->getFreteFaixadeCep($faixaCepId);

        $this->response->setOutputJson($faixaCepInfo);
    }

    public function delete()
    {
        $language = $this->load->language('shipping/fretefaixadecep');
        $this->data = array_merge($this->data, $language);

        $response = [];

        if (!$this->user->hasPermission('modify', 'shipping/fretefaixadecep')) {
            $response['warning'] = $this->language->get('error_permission');
            return $this->response->setOutputJson($response);
        }

        if (!isset($this->request->post['selected'])) {
            $response['warning'] = $this->language->get('error_warning_not_faixa_cep');
            return $this->response->setOutputJson($response);
        }

        $this->load->dmodel('shipping/fretefaixadecep');
        foreach ($this->request->post['selected'] as $faixa_cep_id) {
            try {
                $this->dmodel_shipping_fretefaixadecep->deleteFreteFaixadeCep($faixa_cep_id);
                $this->session->data['success'] = $this->language->get('text_success_delete');
                $response['success'] = $this->language->get('text_success_delete');
            } catch (Exception $e) {
                $response['warning'] = $e->getMessage();
            }
        }

        $this->response->setOutputJson($response);
    }

    public function insert()
    {
        $language = $this->load->language('shipping/fretefaixadecep');
        $this->data = array_merge($this->data, $language);

        $response = [];

        $this->removeMaskFreteFaixaDeCep();

        if (!$this->user->hasPermission('modify', 'shipping/fretefaixadecep')) {
            $response['warning'] = $this->language->get('error_permission');
            return $this->response->setOutputJson($response);
        }

        $validate = $this->validateFreteFaixaDeCep();
        if ($validate) {
            $response['errors'] = $validate;
            return $this->response->setOutputJson($response);
        }

        $this->load->dmodel('shipping/fretefaixadecep');
        $this->dmodel_shipping_fretefaixadecep->addFreteFaixadeCep($this->request->post);
        $this->session->data['success'] = $this->language->get('text_success_insert');
        $response['success'] = $this->language->get('text_success_insert');

        $this->response->setOutputJson($response);
    }

    public function save()
    {
        $language = $this->load->language('shipping/fretefaixadecep');
        $this->data = array_merge($this->data, $language);

        $response = [];

        if (!$this->user->hasPermission('modify', 'shipping/fretefaixadecep')) {
            $response['warning'] = $this->language->get('error_permission');
            return $this->response->setOutputJson($response);
        }

        $validate = $this->validateConfig();
        if ($validate) {
            $response['errors'] = $validate;
            return $this->response->setOutputJson($response);
        }

        $this->load->model('setting/setting');
        $this->model_setting_setting->editSetting('fretefaixadecep', $this->request->post);
        $response['success'] = $this->language->get('text_success');

        $this->response->setOutputJson($response);
    }

    public function edit()
    {
        $language = $this->load->language('shipping/fretefaixadecep');
        $this->data = array_merge($this->data, $language);

        $response = [];

        $this->removeMaskFreteFaixaDeCep();

        if (!$this->user->hasPermission('modify', 'shipping/fretefaixadecep')) {
            $response['warning'] = $this->language->get('error_permission');
            return $this->response->setOutputJson($response);
        }

        if (!isset($this->request->get['faixa_cep_id'])) {
            $response['warning'] = $this->language->get('error_warning_not_faixa_cep');
            return $this->response->setOutputJson($response);
        }

        $this->request->post['faixa_cep_id'] = $this->request->get['faixa_cep_id'];

        $validate = $this->validateFreteFaixaDeCep();
        if ($validate) {
            $response['errors'] = $validate;
            return $this->response->setOutputJson($response);
        }

        $this->load->dmodel('shipping/fretefaixadecep');
        $this->dmodel_shipping_fretefaixadecep->editFreteFaixadeCep($this->request->post);

        $this->session->data['success'] = $this->language->get('text_success_edit');
        $response['success'] = true;

        $this->response->setOutputJson($response);
    }

    private function removeMaskFreteFaixaDeCep()
    {
        extract($this->request->post);

        $this->request->post['cep_valor'] = ftr_geral::removeMaskToDouble($cep_valor);
        $this->request->post['cep_valor_min'] = ftr_geral::removeMaskToDouble($cep_valor_min);

        $this->request->post['produto_comp'] = ftr_geral::removeMaskToDouble($produto_comp);
        $this->request->post['produto_larg'] = ftr_geral::removeMaskToDouble($produto_larg);
        $this->request->post['produto_alt'] = ftr_geral::removeMaskToDouble($produto_alt);

        $this->request->post['produto_min_weight'] = ftr_geral::removeMaskToDouble($produto_min_weight);
        $this->request->post['produto_max_weight'] = ftr_geral::removeMaskToDouble($produto_max_weight);
    }

    private function validateConfig()
    {
        extract($this->request->post);

        return $this->validate->execute([
            'fretefaixadecep_title' => [
                'value' => $fretefaixadecep_title,
                'validates' => ['isEmpty'],
            ],
            'fretefaixadecep_status' => [
                'value' => $fretefaixadecep_status,
                'validates' => ['isEmpty', 'isEnabledOrDisabled'],
            ],
            'fretefaixadecep_sort_order' => [
                'value' => $fretefaixadecep_sort_order,
                'validates' => ['isIntegerNumber'],
            ],
        ]);
    }

    private function validateFreteFaixaDeCep()
    {
        extract($this->request->post);

        $errors = [];

        $errors = $this->validate->execute([
            'cep_titulo' => [
                'value' => $cep_titulo,
                'validates' => ['isEmpty', 'isWithoutDot'],
            ],
            'cep_status' => [
                'value' => $cep_status,
                'validates' => ['isEmpty', 'isEnabledOrDisabled'],
            ],
            'cep_inicial' => [
                'value' => $cep_inicial,
                'validates' => ['isEmpty', 'isCep'],
            ],
            'cep_final' => [
                'value' => $cep_final,
                'validates' => ['isEmpty', 'isCep'],
            ],
            'cep_valor_type' => [
                'value' => $cep_valor_type,
                'validates' => ['isEmpty'],
            ],
            'cep_valor' => [
                'value' => $cep_valor,
                'validates' => ['isEmpty'],
            ],
            'cep_valor_min' => [
                'value' => $cep_valor_min,
                'validates' => ['isEmpty'],
            ],
        ]);

        $cep_inicial = ftr_geral::removeMaskToInt($cep_inicial);
        $cep_final = ftr_geral::removeMaskToInt($cep_final);

        if ($cep_final < $cep_inicial) {
            $errors['cep_final'][] = $this->language->get('error_cep_final');
        }

        $dimentions = [
            'produto_comp' => $produto_comp,
            'produto_larg' => $produto_larg,
            'produto_alt' => $produto_alt,
        ];

        $someDimentionIsFilled = array_filter(
            $dimentions,
            function ($dimention) {
                return !empty($dimention);
            }
        );

        foreach ($dimentions as $dimentionKey => $dimention) {
            if (!$someDimentionIsFilled) break;
            $dimentionErrors = $this->validate->execute([
                $dimentionKey => [
                    'value' => $dimention,
                    'validates' => ['isEmpty'],
                ],
            ]);
            if ($dimentionErrors) $errors = array_merge($errors, $dimentionErrors);
        }

        $weights = [
            'produto_min_weight' => $produto_min_weight,
            'produto_max_weight' => $produto_max_weight,
        ];

        $someWeightIsFilled = array_filter(
            $weights,
            function ($weight) {
                return !empty($weight);
            }
        );

        foreach ($weights as $weightKey => $weight) {
            if (!$someWeightIsFilled) break;
            $weightErrors = $this->validate->execute([
                $weightKey => [
                    'value' => $weight,
                    'validates' => ['isEmpty'],
                ],
            ]);
            if ($weightErrors) $errors = array_merge($errors, $weightErrors);
        }

        if ($produto_max_weight <= $produto_min_weight) {
            $errors['produto_max_weight'][] = $this->language->get('error_validate_weigth');
        }

        return $errors;
    }
}
