<?php
class ControllerLocalisationProcessoVenda extends Controller {

  private $error = array();

  public function index(){

    $this->getList();

  }


  public function getList(){

    $this->load->dmodel('setting/processosvenda');
    $this->load->model('localisation/order_status');
    $this->load->dmodel('wsceo/pedido/wsprocessosvenda');

    $this->load->helper('ftr_geral');
    $this->load->type('tipocomum');

    $this->document->addScript('admin/public/js/localisation/processo_venda_list.js');

    $language = $this->load->language('module/processo_venda');
    $this->data = array_merge($this->data, $language);
    $this->document->setTitle($this->language->get('heading_title_doc'));

    $this->data['breadcrumbs'] = array();

    $this->data['breadcrumbs'][] = array(
      'text'      => $this->language->get('text_home'),
      'href'      => $this->url->link('common/home', 'token=' . $this->session->data['token'], 'SSL'),
      'separator' => false
    );

    $this->data['breadcrumbs'][] = array(
      'text'      => $this->language->get('heading_title'),
      'href'      => $this->url->link('localisation/processo_venda', 'token=' . $this->session->data['token'], 'SSL'),
      'separator' => ' :: '
    );

    $processosVenda = $this->dmodel_wsceo_pedido_wsprocessosvenda->getProcessosVenda();
    if (is_object($processosVenda)) {
        $this->data['error_ceo'] = $processosVenda;
    } else {
        if (is_array($processosVenda)){
        $this->data['processosVenda'] = array ();
        foreach ($processosVenda as $key => $processoVenda) {
            $this->data['processosVenda'][] = array(
            'id_processo_ecommerce'  => $processoVenda['id_processo_ecommerce'],
            'razao_social' => $processoVenda['razao_social'],
            'id_empresa' => $processoVenda['id_empresa'],
            'href' => $this->url->link('localisation/processo_venda/edit', 'token=' . $this->session->data['token'].'&processo_venda_id='.$processoVenda['id_processo_ecommerce'], 'SSL'),
            'select' => (ftr_geral::isIsset($this->config->get('processo_venda_id')) && ($this->config->get('processo_venda_id') == $processoVenda['id_processo_ecommerce'])) ? true : false
            );
        }
        }else{
        if($processosVenda == Type_ServidorStatus::Tp_ErrorServer){
            $this->data['processosVenda']	= $this->language->get('error_ceo_status_server');
        }else{
            $this->data['processosVenda']	= $this->language->get('error_ceo_processos_venda');
        }
        }
    }

    $this->data['data'] = [
        'errorCeo' => isset($this->data['error_ceo']) ? $this->data['error_ceo'] : false,
    ];

    $this->children = array(
      'common/header',
      'common/footer',
    );

    $this->response->setOutput($this->render('localisation/processos_venda_list'));

  }


  public function edit(){
    $this->getForm();
  }


  public function getForm(){
    $this->load->dmodel('setting/processosvenda');
    $this->load->model('localisation/order_status');
    $this->load->dmodel('wsceo/pedido/wsprocessosvenda');

    $this->load->helper('ftr_geral');
    $this->load->type('tipocomum');

    $language = $this->load->language('module/processo_venda');
    $this->data = array_merge($this->data, $language);
    $this->document->setTitle($this->language->get('heading_title_doc'));

    $this->document->addScript(array(
      'admin/public/js/localisation/processo_venda.js'
    ));

    $this->data['breadcrumbs'] = array();

    $this->data['breadcrumbs'][] = array(
      'text'      => $this->language->get('text_home'),
      'href'      => $this->url->link('common/home', 'token=' . $this->session->data['token'], 'SSL'),
      'separator' => false
    );

    $this->data['breadcrumbs'][] = array(
      'text'      => $this->language->get('heading_title'),
      'href'      => $this->url->link('localisation/processo_venda', 'token=' . $this->session->data['token'], 'SSL'),
      'separator' => ' :: '
    );

    $this->data['action'] = $this->url->link('localisation/processo_venda/validate', 'token=' . $this->session->data['token'], 'SSL');

    $this->data['cancel'] = $this->url->link('common/home', 'token=' . $this->session->data['token'], 'SSL');

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

    if(isset($this->request->get['processo_venda_id'])){
      $this->data['processo_venda_id'] = $this->request->get['processo_venda_id'];

      $items_processoscenda = $this->dmodel_setting_processosvenda->getProcessosVendaItens($this->request->get['processo_venda_id']);

      foreach ($items_processoscenda as $item){
        $order_status_list = $this->dmodel_setting_processosvenda->getProcessosVendaItensStatus($item['proccess_control_item_id']);

        if (!$order_status_list){
          //preencho valores default para a primeira config, melhor assim que duplicar no twig...
          for ($iTipo = 0; $iTipo <= 2; $iTipo++) {
            $order_status_list[$iTipo]['name']     = Type_StatusProcVenda::getNickFromValue($iTipo);
            $order_status_list[$iTipo]['type_status'] = $iTipo;
            $order_status_list[$iTipo]['values'][]   = array(
              'proccess_control_item_id' => $item['proccess_control_item_id'],
              'order_status_id' => '0',
              'tipo_status'     => (int)$iTipo,
              'tipo_status_prioridade' => '0'
            );
            switch ($iTipo) {
              case '0':
                $order_status_list[$iTipo]['text_status_repli'] = $item['status_inicial'];
                break;
              case '1':
                $order_status_list[$iTipo]['text_status_repli'] = $item['status_sucesso'];
                break;
              case '2':
                $order_status_list[$iTipo]['text_status_repli'] = $item['status_erro'];
                break;
            }
          }
        } else {
          foreach ($order_status_list as $key => $value ){
            switch ($key) {
              case '0':
                $order_status_list[$key]['text_status_repli'] = $item['status_inicial'];
                $order_status_list[$key]['type_status'] = $key;
                break;
              case '1':
                $order_status_list[$key]['text_status_repli'] = $item['status_sucesso'];
                $order_status_list[$key]['type_status'] = $key;
                break;
              case '2':
                $order_status_list[$key]['text_status_repli'] = $item['status_erro'];
                $order_status_list[$key]['type_status'] = $key;
                break;
            }
          }
        }

        $this->data['items_processoscenda'][] = array(
          'id_processo_venda_item'	=> $item['proccess_control_item_id'],
          'text_tipo_processo_venda' 	=> Type_ContrlProcVenda::getNickFromValue($item['tipo']),
          'status'					=> $item['utiliza'],
          'text_status'				=> Type_ProcessoVendaUtiliza::getNickFromValue($item['utiliza']),
          'ordem'						=> $item['ordem'],
          'tipo'						=> $item['tipo'],
          'order_status_list'			=> $order_status_list
        );
      }

      $order_statuses = $this->model_localisation_order_status->getOrderStatuses();
      $this->data['order_statuses'] = array();

      foreach ($order_statuses as $order_status) {
        $this->data['order_statuses'][] = array(
          'order_status_id' => $order_status['order_status_id'],
          'name'            => $order_status['name']
        );
      }

    }else{

      $this->data['text_no_results'] = 'Nenhum processo de venda encontrado!';

    }

    $this->children = array(
      'common/header',
      'common/footer',
    );

    $this->response->setOutput($this->render('localisation/processos_venda'));

  }

  public function validate() {

    $this->load->helper('ftr_geral');
    $this->load->helper('ftr_validacao');
    $this->language->load('setting/setting');
    $this->load->model('setting/setting');

    $json = array();

    if (!$this->user->hasPermission('modify', 'setting/setting')) {
      $json['error']['warning'] = $this->language->get('error_permission');
    }

    if(
      isset($this->request->post['processo_venda_status']) &&
      ($this->request->post['processo_venda_status']) &&
      isset($this->request->post['processo_venda_order_status_started']) &&
      (!$this->request->post['processo_venda_order_status_started'])
    ){
      $json['error']['config_order_status_started'] = $this->language->get('error_config_order_status_started');
    }

    if(isset($this->request->post['processo_venda'])){

      if($this->config->get('processo_venda_order_status_started')){

        $validaCount         = array();
        $validaStatusStarted = array();
        $validaStatusVenda   = array();
        foreach ($this->request->post['processo_venda'] as $tipoproccess => $processo_vendas){
          //validação para que tenha no maximo 10 itens por status (inicial/finalizado/erro)
          $count = false;
          array_walk($processo_vendas, function(&$array, $key) use(&$count, &$validaStatusVenda){
            if(count($array) > 10){
              $count = (int)$key;
            }
            //cria um array contendo somente os status dos itens
            array_walk($array, function(&$value) use (&$validaStatusVenda){
              $validaStatusVenda[] = $value;
            });
          });
          $validaCount[$tipoproccess] = is_int($count) ? $count : false;

          //validação para que os itens dos status não tenha o mesmo valor que a configuração "config_order_status_started"
          $processo_venda_order_status_started = $this->config->get('processo_venda_order_status_started');
          $status_started = array();
          array_walk($processo_vendas, function(&$array, $key) use(&$status_started, &$processo_venda_order_status_started){
            $retorno = array_filter($array, function ($value, $index) use (&$processo_venda_order_status_started){
              if($processo_venda_order_status_started === $value){
                return [$index => $value];
              }
            }, ARRAY_FILTER_USE_BOTH);
            if($retorno){
              $status_started[$key] = $retorno;
            }
          });

          $validaStatusStarted[$tipoproccess] = $status_started;
        }

        $statusVenda       = array_unique(array_diff_assoc($validaStatusVenda, array_unique( $validaStatusVenda )));
        $validaStatusVenda = array();
        foreach ($this->request->post['processo_venda'] as $tipoproccess => $processo_vendas){
          //validação para que os itens dos status não tenha o mesmo valor que outro item
          $retornoVenda = false;
          array_walk($processo_vendas, function(&$array, $key) use(&$retornoVenda, &$statusVenda){
            $retorno = array_filter($array, function ($value, $index) use (&$statusVenda){
              if(in_array($value, $statusVenda)){
                return [$index => $value];
              }
            }, ARRAY_FILTER_USE_BOTH);
            if($retorno){
              $retornoVenda[$key] = $retorno;
            }
          });
          $validaStatusVenda[$tipoproccess] = $retornoVenda;
        }

        if(array_filter($validaCount, function($var){return is_int($var);} )){
          $json['error']['proccess_count']     = array_filter($validaCount, function($var){return is_int($var);});
          $json['error']['proccess_count_msg'] = 'A quantidade máxima de status permita é 10.';
        }elseif(array_filter($validaStatusStarted)){
          $json['error']['proccess_status_started']     = array_filter($validaStatusStarted);
          $json['error']['proccess_status_started_msg'] = 'O status não pode ser igual ao campo Status do pedido iniciado.';
        }elseif(array_filter($validaStatusVenda)){
          $json['error']['proccess_status_venda']     = array_filter($validaStatusVenda);
          $json['error']['proccess_status_venda_msg'] = 'Os status não podem estar repetidos no processo de venda.';
        }

      }

    }

    if (!$json) {

      if ($this->request->server['REQUEST_METHOD'] == 'POST') {

        unset($this->request->post['config_processo_venda_id']);
        $this->model_setting_setting->editSetting('processo_venda', $this->request->post);

        $json['success']  = $this->language->get('text_success');

      }

    }


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

  }

  public function template() {
    $server = $this->urlloja->link('', '', 'SSL', false);

    if (file_exists(DIR_IMAGE . 'templates/' . basename($this->request->get['template']) . '.png')) {
      $image = $server . 'image/templates/' . basename($this->request->get['template']) . '.png';
    } else {
      $image = $server . 'image/no_image.jpg';
    }

    $this->response->setOutput('<img src="' . $image . '" alt="" title="" style="border: 1px solid #EEEEEE;" />');
  }

}
