<?php

class ControllerCheckoutShippingMethod extends Controller
{
    public function index()
    {
        $this->language->load('checkout/checkout');
        $this->load->model('account/address');
        $this->load->type('tipocomum');

        if ($this->customer->isLogged() && isset($this->session->data['shipping_address_id'])) {
            $shipping_address = $this->model_account_address->getAddress($this->session->data['shipping_address_id']);
        } elseif (isset($this->session->data['guest'])) {
            $shipping_address = $this->session->data['guest']['shipping'];
        }

        $this->load->model('setting/extension');

        if (!empty($shipping_address)) {
            // Shipping Methods
            $quote_data = array();
            $shipping_address['layout_id'] = Type_SendPostcode::Tp_Confirm;
            $results = $this->model_setting_extension->getExtensions('shipping');

            foreach ($results as $result) {
                if ($this->config->get($result['code'] . '_status')) {
                    $this->load->model('shipping/' . $result['code']);

                    $quotes = $this->{'model_shipping_' . $result['code']}->getQuote($shipping_address);

                    if(!$quotes){
                      continue;
                    }

                    if(!isset($quotes[0])){
                      $quotes = array($quotes);
                    }
                    foreach ($quotes as $quote) {
                        $quote_data[$quote['code']] = array(
                            'title' => $quote['title'],
                            'quote' => $quote['quote'],
                            'cost' => isset($quote['cost'])? $quote['cost'] : 'R$ 0,00',
                            'sort_order' => $quote['sort_order'],
                            'error' => $quote['error']
                        );
                    }
                }
            }

            $sort_order = array();

            foreach ($quote_data as $key => $value) {
                if($key == 'pickup'){
                    $sort_order[$key] = -1;
                }else{
                    $sort_order[$key] = $value['sort_order'];
                }
            }

            array_multisort($sort_order, SORT_ASC, $quote_data);

            if (isset($this->session->data['shipping_checkout'])) {
                $this->data['shipping_cart_chk'] = $this->session->data['shipping_checkout'];
                unset($this->session->data['shipping_checkout']);
            } else {
                $this->data['shipping_cart_chk'] = '';
            }

            $this->session->data['shipping_methods'] = $quote_data;
        }

        $this->data['text_shipping_method'] = $this->language->get('text_shipping_method');
        $this->data['text_comments'] = $this->language->get('text_comments');
        $this->data['text_carrier'] = $this->language->get('text_carrier');
        $this->data['text_message_carrier'] = $this->language->get('text_message_carrier');
        $this->data['text_address'] = $this->language->get('text_address');
        $this->data['button_continue'] = $this->language->get('button_continue');
        $this->data['text_checkout_shipping_method'] = $this->language->get('text_checkout_shipping_method');

        $this->data['futura_frete_conta_cliente_status'] = $this->config->get('futura_frete_conta_cliente_status');

        if (empty($this->session->data['shipping_methods'])) {
            $this->data['error_warning'] = sprintf($this->language->get('error_no_shipping'), $this->url->link('information/contact'));
        } elseif (!ftr_geral::isIsset($this->config->get('shipping_status'))) {
            $this->data['error_warning'] = sprintf($this->language->get('error_no_shipping'), $this->url->link('information/contact'));
            unset($this->session->data['shipping_methods']);
        } else {
            $this->data['error_warning'] = '';
        }

        if (isset($this->session->data['shipping_methods'])) {
            $this->data['shipping_methods'] = $this->session->data['shipping_methods'];
        } else {
            $this->data['shipping_methods'] = array();
        }

        if (isset($this->session->data['shipping_method']['code'])) {
            $this->data['code'] = $this->session->data['shipping_method']['code'];
        } else {
            $this->data['code'] = '';
        }

        if (isset($this->session->data['comment'])) {
            $this->data['comment'] = $this->session->data['comment'];
        } else {
            $this->data['comment'] = '';
        }

        $this->response->setOutput($this->render('checkout/shipping_method'));
    }

    public function validate()
    {
        $this->language->load('checkout/checkout');

        $json = array();

        // Validate if shipping is required. If not the customer should not have reached this page.
        if (!$this->cart->hasShipping()) {
            $json['redirect'] = $this->url->link('checkout/checkout', '', 'SSL');
        }

        // Validate if shipping address has been set.
        $this->load->model('account/address');

        if ($this->customer->isLogged() && isset($this->session->data['shipping_address_id'])) {
            $shipping_address = $this->model_account_address->getAddress($this->session->data['shipping_address_id']);
        } elseif (isset($this->session->data['guest'])) {
            $shipping_address = $this->session->data['guest']['shipping'];
        }

        if (empty($shipping_address)) {
            $json['redirect'] = $this->url->link('checkout/checkout', '', 'SSL');
        }

        // Validate cart has products and has stock.
        if ((!$this->cart->hasProducts() && empty($this->session->data['vouchers'])) || (!$this->cart->hasStock() && !$this->config->get('config_stock_checkout'))) {
            $json['redirect'] = $this->url->link('checkout/cart');
        }

        // Validate minimum quantity requirments.
        $products = $this->cart->getProducts();

        foreach ($products as $product) {
            $product_total = 0;

            foreach ($products as $product_2) {
                if ($product_2['product_id'] == $product['product_id']) {
                    $product_total += $product_2['quantity'];
                }
            }

            if ($product['minimum'] > $product_total) {
                $json['redirect'] = $this->url->link('checkout/cart');

                break;
            }
        }

        if (!$json) {
            if (!isset($this->request->post['shipping_method'])) {
                $json['error']['warning'] = $this->language->get('error_shipping');
            } else {
                $shipping = explode('.', $this->request->post['shipping_method']);
                if (!isset($shipping[0]) || !isset($shipping[1]) || !isset($this->session->data['shipping_methods'][$shipping[0]]['quote'][$shipping[1]])) {
                    $json['error']['warning'] = $this->language->get('error_shipping');
                }
            }

            if (!$json) {
                $shipping = explode('.', $this->request->post['shipping_method']);

                $this->session->data['shipping_method'] = $this->session->data['shipping_methods'][$shipping[0]]['quote'][$shipping[1]];
                $this->session->data['comment'] = strip_tags($this->request->post['comment']);
                $json['selectedShippingTitle'] = $this->session->data['shipping_method']['title'];
            }
        }

        $this->response->setOutput(json_encode($json));
    }
}
