<?php
$this->layout = false;

use CrmSpreadsheet\CrmSpreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;

$spreadsheet = new CrmSpreadsheet();
$spreadsheet->setDefaults();
$spreadsheet->getProperties()->setTitle("Relatório de Cancelamentos");

$abaAnalitico = $spreadsheet->getActiveSheet();
$abaAnalitico->setTitle("Analítico");

$header = array(
    array(
        'name' => 'Data de ativação',
        'width' => 'auto',
        'wrap' => false,
    ),
    array(
        'name' => 'Data de rescisão',
        'width' => 'auto',
        'wrap' => false,
    ),
    array(
        'name' => 'Meses ativo',
        'width' => 'auto',
        'wrap' => false,
    ),
    array(
        'name' => 'Razão Social',
        'width' => 'auto',
        'wrap' => false,
    ),
    array(
        'name' => 'CNPJ / CPF',
        'width' => 'auto',
        'wrap' => false,
    ),
    array(
        'name' => 'Unidade de negócios',
        'width' => 'auto',
        'wrap' => false,
    ),
    array(
        'name' => 'Cidade',
        'width' => 'auto',
        'wrap' => false,
    ),
    array(
        'name' => 'Motivo da rescisão',
        'width' => 'auto',
        'wrap' => false,
    ),
    array(
        'name' => 'Valor da Mensalidade',
        'width' => 'auto',
        'wrap' => false,
    ),
    array(
        'name' => 'Produto',
        'width' => 'auto',
        'wrap' => false,
    ),
    array(
        'name' => 'Módulos complementares',
        'width' => 'auto',
        'wrap' => false,
    ),
    array(
        'name' => 'Ramo de Atividade',
        'width' => 'auto',
        'wrap' => false,
    ),
    array(
        'name' => 'Como nos conheceu',
        'width' => 'auto',
        'wrap' => false,
    ),
    array(
        'name' => 'Versão do sistema',
        'width' => 'auto',
        'wrap' => false,
    ),
);
$spreadsheet->createHeader($header, true);

$abasExtras = array(
    'MotivoRescisao' => array('name' => 'Motivo da rescisão', 'currency' => false),
    'Produto' => array('name' => 'Produto que usava', 'currency' => false),
    'Revenda' => array('name' => 'Unidade de negócios', 'currency' => false),
    'Cidade' => array('currency' => false),
    'AnoRescisao' => array('name' => 'Ano da rescisão', 'currency' => false),
    'MesRescisao' => array('name' => 'Mês da rescisão', 'currency' => false),
);

$linha = 2;
foreach ($data as $key => $cliente) {
    $motivoRescisao = ExcelUtil::parseValue($cliente->MotivoRescisao);
    $produto = ExcelUtil::parseValue($cliente->ProdutoContratado);

    $revendaResponsavel = $cliente->getRevendaResponsavel2() ?? false;
    $revenda = ExcelUtil::parseValue($revendaResponsavel);

    $cidade = $cliente->Cidade ?? false;
    $dataRescisao = DateTime::createFromFormat('d/m/Y', $cliente->CLI_DTRESCISAO);
    $anoRescisao = $dataRescisao->format('Y');
    $mesRescisao = $dataRescisao->format('m/Y');

    ######
    $id = ExcelUtil::parseId($motivoRescisao);
    if (!isset($abasExtras['MotivoRescisao'][$id])) {
        $abasExtras['MotivoRescisao'][$id] = array(
            'valor' => array(),
            'count' => 0
        );
        $abasExtras['MotivoRescisao'][$id]['valor'] = $motivoRescisao;
    }
    $abasExtras['MotivoRescisao'][$id]['count']++;
    ######
    $id = ExcelUtil::parseId($produto);
    if (!isset($abasExtras['Produto'][$id])) {
        $abasExtras['Produto'][$id] = array(
            'valor' => array(),
            'count' => 0
        );
        $abasExtras['Produto'][$id]['valor'] = $produto;
    }
    $abasExtras['Produto'][$id]['count']++;
    ######
    $id = "";
    if ($revendaResponsavel) {
        $id .= $revendaResponsavel->REV_TIPO;
    }
    $id .= $revenda;
    $id = ExcelUtil::parseId($id);
    if (!isset($abasExtras['Revenda'][$id])) {
        $abasExtras['Revenda'][$id] = array(
            'valor' => array(),
            'count' => 0
        );
        $abasExtras['Revenda'][$id]['valor'] = $revenda;
    }
    $abasExtras['Revenda'][$id]['count']++;
    ######
    $id = ExcelUtil::parseId($cidade);
    if (!isset($abasExtras['Cidade'][$id])) {
        $abasExtras['Cidade'][$id] = array(
            'valor' => array(),
            'count' => 0
        );
        $abasExtras['Cidade'][$id]['valor'] = $cidade ? ExcelUtil::parseValue($cidade->CidadeEstado) : "-";
    }
    $abasExtras['Cidade'][$id]['count']++;
    ######
    $id = ExcelUtil::parseId($anoRescisao);
    if (!isset($abasExtras['AnoRescisao'][$id])) {
        $abasExtras['AnoRescisao'][$id] = array(
            'valor' => array(),
            'count' => 0
        );
        $abasExtras['AnoRescisao'][$id]['valor'] = $anoRescisao;
    }
    $abasExtras['AnoRescisao'][$id]['count']++;
    ######
    $id = ExcelUtil::parseId($mesRescisao);
    if (!isset($abasExtras['MesRescisao'][$id])) {
        $abasExtras['MesRescisao'][$id] = array(
            'valor' => array(),
            'count' => 0
        );
        $abasExtras['MesRescisao'][$id]['valor'] = $mesRescisao;
    }
    $abasExtras['MesRescisao'][$id]['count']++;

    $coluna = 1;
    # A
        $valor = ExcelUtil::parseValue($cliente->CLI_DTATIVACAO);
        if ($valor != "-") {
            $valor = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($valor);
        }
        $abaAnalitico->setCellValueByColumnAndRow($coluna, $linha, $valor);
        $abaAnalitico
                    ->getStyleByColumnAndRow($coluna, $linha)
                    ->getNumberFormat()
                    ->setFormatCode('dd/mm/yyyy');
        $coluna++;

    # B
        $valor = ExcelUtil::parseValue($cliente->CLI_DTRESCISAO);
        if ($valor != "-") {
            $valor = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($valor);
        }
        $abaAnalitico->setCellValueByColumnAndRow($coluna, $linha, $valor);
        $abaAnalitico
                    ->getStyleByColumnAndRow($coluna, $linha)
                    ->getNumberFormat()
                    ->setFormatCode('dd/mm/yyyy');
        $coluna++;

    # C
        $mesesAtivo = 0;
        $de  = DateTime::createFromFormat('d/m/Y', $cliente->CLI_DTATIVACAO);
        $ate = DateTime::createFromFormat('d/m/Y', $cliente->CLI_DTRESCISAO);
        if ($de) {
            $diff = $ate->diff($de);
            $anosAtivo = $diff->y;
            $mesesAtivo = $diff->m;
            if ($anosAtivo > 0)  {
                $mesesAtivo += ($anosAtivo * 12);
            }
        }
        $abaAnalitico->setCellValueByColumnAndRow($coluna, $linha, $mesesAtivo);
        $coluna++;

    # D
        $valor = ExcelUtil::parseValue($cliente->CLI_NOME);
        $abaAnalitico->setCellValueByColumnAndRow($coluna, $linha, $valor);
        $coluna++;

    # E
        $valor = Util::formataCNPJCPF($cliente->CLI_CNPJCPF) ?? "-";
        $abaAnalitico->setCellValueByColumnAndRow($coluna, $linha, $valor);
        $coluna++;

    # F
        $valor = $revenda;
        $abaAnalitico->setCellValueByColumnAndRow($coluna, $linha, $valor);
        $coluna++;

    # G
        $valor = $cidade;
        $abaAnalitico->setCellValueByColumnAndRow($coluna, $linha, $valor);
        $coluna++;

    # H
        $valor = $motivoRescisao;
        $abaAnalitico->setCellValueByColumnAndRow($coluna, $linha, $valor);
        $coluna++;

    # I
        $valor = ExcelUtil::parseValue($cliente->CLI_VLRMENSAL);
        $abaAnalitico->setCellValueByColumnAndRow($coluna, $linha, $valor);
        $abaAnalitico
                    ->getStyleByColumnAndRow($coluna, $linha)
                    ->getNumberFormat()
                    ->setFormatCode('"R$ "#,##0.00_-');
        $coluna++;

    # J
        $valor = $produto;
        $abaAnalitico->setCellValueByColumnAndRow($coluna, $linha, $valor);
        $coluna++;

    # K
        $complementares = $cliente->getComplementares();
        $valor = ExcelUtil::parseValue($complementares);
        $abaAnalitico->setCellValueByColumnAndRow($coluna, $linha, $valor);
        $coluna++;

    # L
        $valor = ExcelUtil::parseValue($cliente->RamoAtividade);
        $abaAnalitico->setCellValueByColumnAndRow($coluna, $linha, $valor);
        $coluna++;

    # M
        $valor = ExcelUtil::parseValue($cliente->ComoConheceu);
        $abaAnalitico->setCellValueByColumnAndRow($coluna, $linha, $valor);
        $coluna++;

    # N
        $valor = ExcelUtil::parseValue($cliente->Versao);
        $abaAnalitico->setCellValueByColumnAndRow($coluna, $linha, $valor);
        $coluna++;

    $linha++;
}

if (!empty($abasExtras)) {
    $spreadsheet->abasSintetico($abasExtras);

    $title = "Filtros Aplicados";

    $sheet = $spreadsheet->createSheet();
    $sheet->setTitle($title);

    $spreadsheet->setActiveSheetIndexByName($title);
    $aba = $spreadsheet->getActiveSheet();

    $header = array(
        array(
            'name' => 'Filtro',
            'width' => 'auto',
            'wrap' => false
        ),
        array(
            'name' => 'Valor Informado',
            'width' => 'auto',
            'wrap' => false
        ),
    );
    $spreadsheet->createHeader($header);

    $linha = 2;

    if (!empty($model->CLI_IDREVENDA)) {
        $aba->setCellValueByColumnAndRow(1, $linha, "Unidade de Negócios");

        $revenda = Revendas::model()->findByPk($model->CLI_IDREVENDA);
        $valor = ExcelUtil::parseValue($revenda);
        $aba->setCellValueByColumnAndRow(2, $linha, $valor);

        $linha++;
    }

    if (!empty($model->CLI_IDRESCISAO)) {
        $aba->setCellValueByColumnAndRow(1, $linha, "Motivo da Rescisão");

        $motivoRescisao = Motivos::model()->findByPk($model->CLI_IDRESCISAO);
        $valor = ExcelUtil::parseValue($motivoRescisao);
        $aba->setCellValueByColumnAndRow(2, $linha, $valor);

        $linha++;
    }

    if (!empty($model->CLI_DTRESCISAO)) {
        $aba->setCellValueByColumnAndRow(1, $linha, "Data Inicial");

        $valor = ExcelUtil::parseValue($model->CLI_DTRESCISAO);
        if ($valor != "-") {
            $valor = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($valor);
        }
        $aba->setCellValueByColumnAndRow(2, $linha, $valor);
        $aba
            ->getStyleByColumnAndRow(2, $linha)
            ->getNumberFormat()
            ->setFormatCode('dd/mm/yyyy');

        $linha++;
    }

    if (!empty($model->CLI_DTRESCISAO_FINAL)) {
        $aba->setCellValueByColumnAndRow(1, $linha, "Data Final");

        $valor = ExcelUtil::parseValue($model->CLI_DTRESCISAO_FINAL);
        if ($valor != "-") {
            $valor = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($valor);
        }
        $aba->setCellValueByColumnAndRow(2, $linha, $valor);
        $aba
            ->getStyleByColumnAndRow(2, $linha)
            ->getNumberFormat()
            ->setFormatCode('dd/mm/yyyy');

        $linha++;
    }

    if (!empty($model->CLI_CIDADE)) {
        $aba->setCellValueByColumnAndRow(1, $linha, "Cidade");

        $cidade = Cidades::model()->findByPk($model->CLI_CIDADE);
        $valor = ExcelUtil::parseValue($cidade->CidadeEstado);
        $aba->setCellValueByColumnAndRow(2, $linha, $valor);

        $linha++;
    }

    if (!empty($model->CLI_PRODUTO)) {
        $aba->setCellValueByColumnAndRow(1, $linha, "Produto");

        $produtos = array();
        foreach ($model->CLI_PRODUTO as $produto) {
            if ($complementar = Modulos::model()->findByPk($produto)) {
                $produtos[] = $complementar->MOD_DESCRICAO;
            }
        }
        $produtos = implode("\n", $produtos);
        $valor = ExcelUtil::parseValue($produtos);
        $aba->setCellValueByColumnAndRow(2, $linha, $valor);

        $linha++;
    }

    if (!empty($model->CLI_MODULOS_COMPLEMENTARES)) {
        $aba->setCellValueByColumnAndRow(1, $linha, "Módulos Complementares");

        $complementares = array();
        foreach ($model->CLI_MODULOS_COMPLEMENTARES as $modulo) {
            if ($complementar = Modulos::model()->findByPk($modulo)) {
                $complementares[] = $complementar->MOD_DESCRICAO;
            }
        }
        $complementares = implode("\n", $complementares);
        $valor = ExcelUtil::parseValue($complementares);
        $aba->setCellValueByColumnAndRow(2, $linha, $valor);

        $linha++;
    }

    if (!empty($model->CLI_VLRMENSAL)) {
        $aba->setCellValueByColumnAndRow(1, $linha, "Valor da Mensalidade Mínimo");

        $valor = Util::convertDecimal($model->CLI_VLRMENSAL);
        $valor = ExcelUtil::parseValue($valor);
        $aba->setCellValueByColumnAndRow(2, $linha, $valor);
        $aba
            ->getStyleByColumnAndRow(2, $linha)
            ->getNumberFormat()
            ->setFormatCode('"R$ "#,##0.00_-');

        $linha++;
    }

    if (!empty($model->CLI_VLRMENSAL_FINAL)) {
        $aba->setCellValueByColumnAndRow(1, $linha, "Valor da Mensalidade Máximo");

        $valor = Util::convertDecimal($model->CLI_VLRMENSAL_FINAL);
        $valor = ExcelUtil::parseValue($valor);
        $aba->setCellValueByColumnAndRow(2, $linha, $valor);
        $aba
            ->getStyleByColumnAndRow(2, $linha)
            ->getNumberFormat()
            ->setFormatCode('"R$ "#,##0.00_-');

        $linha++;
    }
}

$spreadsheet->setActiveSheetIndex(0);

$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
