<?php

class Downloads extends GxActiveRecord {

    public $Arquivo;
    public $LocalArquivo;

    const ORIGEM_PROJETO = 1;
    const ORIGEM_OUTROS = 2;

    public $origens = array(
        self::ORIGEM_PROJETO => "Projeto",
        self::ORIGEM_OUTROS  => "Outros",
    );

    public static function model($className = __CLASS__) {
        return parent::model($className);
    }

    public function tableName() {
        return 'downloads';
    }

    public static function label($n = 1) {
        return Yii::t('app', 'Download|Downloads', $n);
    }

    public static function representingColumn() {
        return 'DWN_DESCRICAO';
    }

    public function behaviors() {
        return array('datetimeI18NBehavior' => array('class' => 'ext.DateTimeI18NBehavior'));
    }

    public function rules() {
        return array(
            array('DWN_ORIGEM, DWN_DESCRICAO, Arquivo', 'required'),
            array('DWN_IDPROJETO', 'validateOrigemProjeto'),
            array('DWN_DESCRICAO', 'length', 'max' => 200),
            array('DWN_IDPROJETO', 'default', 'setOnEmpty' => true, 'value' => null),
            array('DWN_ID, DWN_DTCADASTRO, DWN_DTATUALIZACAO, DWN_URL_ARQUIVO, DWN_URL_ARQUIVO_FTP, DWN_ORIGEM, DWN_IDPROJETO, DWN_DESCRICAO, DWN_STATUS', 'safe', 'on' => 'search'),
        );
    }

    public function relations() {
        return array(
            'Projeto' => array(self::BELONGS_TO, 'Projetos', 'DWN_IDPROJETO', 'joinType' => 'LEFT JOIN'),
        );
    }

    public function pivotModels() {
        return array(
        );
    }

    public function attributeLabels() {
        return array(
            'DWN_ID' => 'Código',
            'DWN_URL_ARQUIVO' => 'URL do Arquivo',
            'DWN_URL_ARQUIVO_FTP' => 'Caminho do Arquivo no servidor FTP',
            'DWN_ORIGEM' => 'Origem',
            'DWN_IDPROJETO' => 'Projeto',
            'Projeto' => 'Projeto',
            'DWN_DESCRICAO' => 'Descrição',
            'DWN_STATUS' => 'Status',
            'Arquivo' => 'Arquivo',
            'DWN_DTCADASTRO' => 'Data Cadastro',
            'DWN_DTATUALIZACAO' => 'Data Atualização',
        );
    }

    public function validateOrigemProjeto($attribute, $params) {
        if ($this->DWN_ORIGEM == 1) {
            if (empty($this->{$attribute})) {
                $this->addError($attribute, $this->getAttributeLabel($attribute) . ' É obrigatório');
                return false;
            }
        }
        return true;
    }

    public function conectaFTP() {
        $host = 'ftp.windel.com.br';
        $usuario_ftp = 'wcm3@windel.com.br';
        $senha_ftp = 'DT$9hcr%VFtl';
        $conexao_ftp = ftp_connect($host);
        $login_ftp = ftp_login($conexao_ftp, $usuario_ftp, $senha_ftp);
        ftp_pasv($conexao_ftp, true);
        $continue = true;
        if (!$login_ftp) {
            Yii::app()->user->setFlash('error', 'Usuário ou senha FTP incorretos.');
            $continue = false;
        }
        return array('continue' => $continue, 'conexao_ftp' => $conexao_ftp);
    }

    public function enviaArquivoFTP() {
        $data_hoje = date("Ymd-His");
        $arquivo = pathinfo($this->Arquivo->getName());
        $nome_arquivo = "";
        if (!empty($arquivo['filename']) && !empty($arquivo['extension'])) {
            $nome = $arquivo['filename'];
            $ext = $arquivo['extension'];
            $nome_arquivo = "{$nome}_{$data_hoje}.{$ext}";
        } else {
            $nome_arquivo = $this->Arquivo->getName() . "_{$data_hoje}";
        }
        $arquivo_temp = $this->Arquivo->getTempName();

        $caminho = (BASE_TESTES) ? "testes/" : "";
        $caminho .= ($this->DWN_ORIGEM == "1" || $this->DWN_ORIGEM == "Projeto") ? 'atual': 'downloads';

        $this->DWN_URL_ARQUIVO_FTP = "/public_html/{$caminho}/{$nome_arquivo}";
        $this->DWN_URL_ARQUIVO = "https://www.windel.com.br/{$caminho}/{$nome_arquivo}";

        $continue_conexao_ftp = $this->conectaFTP();
        if ($continue_conexao_ftp['continue']) {
            if (ftp_put($continue_conexao_ftp['conexao_ftp'], $this->DWN_URL_ARQUIVO_FTP, $arquivo_temp, FTP_BINARY)) {
                Yii::app()->user->setFlash('success', 'Novo arquivo salvo com sucesso.');
            } else {
                Yii::app()->user->setFlash('error', 'Houve um erro ao tentar salvar o arquivo, por favor tente novamente.');
                $continue_conexao_ftp['continue'] = false;
            }
        }
        ftp_close($continue_conexao_ftp['conexao_ftp']);
        return $continue_conexao_ftp['continue'];
    }

    static public function removeFTP($id) {
        $model = Downloads::model()->findByPk($id);
        $continue_conexao_ftp = $model->conectaFTP();
        if ($continue_conexao_ftp['continue']) {
            if (ftp_delete($continue_conexao_ftp['conexao_ftp'], $model->DWN_URL_ARQUIVO_FTP)) {
                Yii::app()->user->setFlash('success', 'Arquivo foi excluído com sucesso.');
                ftp_close($continue_conexao_ftp['conexao_ftp']);
            } else {
                ftp_close($continue_conexao_ftp['conexao_ftp']);
                Yii::app()->user->setFlash('error', 'Houve um erro ao tentar remover o arquivo, por favor tente novamente.');
            }
        }
    }

    public function search() {
        $criteria = new CDbCriteria;

        $criteria->compare('DWN_ID', $this->DWN_ID);
        $criteria->compare('DWN_IDPROJETO', $this->DWN_IDPROJETO);
        $criteria->compare('DWN_URL_ARQUIVO', $this->DWN_URL_ARQUIVO, true);
        $criteria->compare('DWN_DESCRICAO', $this->DWN_DESCRICAO, true);
        $criteria->compare('DWN_STATUS', $this->DWN_STATUS);

        if (!empty($this->DWN_ORIGEM)) {
            $criteria->addCondition("DWN_ORIGEM = {$this->DWN_ORIGEM}");
        }

        if (!empty($this->DWN_DTCADASTRO)) {
            $criteria->addCondition("DATE_FORMAT(DWN_DTCADASTRO, '%Y-%m-%d') = '" . Util::formatDataMysql($this->DWN_DTCADASTRO) . "'");
        }

        if (!empty($this->DWN_DTATUALIZACAO)) {
            $criteria->addCondition("DATE_FORMAT(DWN_DTATUALIZACAO, '%Y-%m-%d') = '" . Util::formatDataMysql($this->DWN_DTATUALIZACAO) . "'");
        }

        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
            'sort' => array(
                'defaultOrder' => 'DWN_DTCADASTRO ASC',
            ),
            'pagination' => array(
                'pageSize' => 20,
            ),
        )
        );
    }

    public function origemNumerico()
    {
        if (!is_numeric($this->DWN_ORIGEM)) {
            if (in_array($this->DWN_ORIGEM, $this->origens)) {
                $origens = array_flip($this->origens);
                $this->DWN_ORIGEM = $origens[$this->DWN_ORIGEM];
            } else {
                $this->DWN_ORIGEM = null;
            }
        }
    }
}