<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: huajie <banhuajie@163.com>
// +----------------------------------------------------------------------
namespace Admin\Logic;

/**
 * 文档模型子模型 - 下载模型
 */
class DownloadLogic extends BaseLogic{

    /* 自动验证规则 */
    protected $_validate = array(
        array('content', 'require', '详细内容不能为空！', self::MUST_VALIDATE , 'regex', self::MODEL_BOTH),
        array('download', 'number', '下载次数请输入整数！', self::VALUE_VALIDATE , 'regex', self::MODEL_BOTH),
        array('file_id', 'require', '请上传附件！', self::MUST_VALIDATE , 'regex', self::MODEL_BOTH),
    );

    /**
     * 获取模型详细信息
     * @param  integer $id 文档ID
     * @return array       当前模型详细信息
     * @author huajie <banhuajie@163.com>
     */
    public function detail($id){
        $data = $this->field(true)->find($id);
        if(!$data){
            $this->error = '获取详细信息出错！';
            return false;
        }
        $file = D('File')->field(true)->find($data['file_id']);
        return $data;
    }

    /**
     * 更新数据
     * @param intger $id
     * @author huajie <banhuajie@163.com>
     */
    public function update($id = 0){
        /* 获取下载数据 */ //TODO: 根据不同用户获取允许更改或添加的字段
        $data = $this->create();
        if(!$data){
            return false;
        }

        $file_id = I('post.file_id');
        if(is_numeric($file_id)){
            $data['file_id'] = $file_id;
        }else{

            $file = json_decode(think_decrypt(I('post.file_id')), true);
            if(!empty($file)){
                $data['file_id'] = $file['id'];
                $data['size']    = $file['size'];
            } else {
                $this->error = '获取上传文件信息失败！';
                return false;
            }
        }


        /* 添加或更新数据 */
        if(empty($data['id'])){//新增数据
            $data['id'] = $id;
            $id = $this->add($data);
            if(!$id){
                $this->error = '新增详细内容失败！';
                return false;
            }
        } else { //更新数据
            $status = $this->save($data);
            if(false === $status){
                $this->error = '更新详细内容失败！';
                return false;
            }
        }
        return true;
    }

    /**
     * 下载文件
     * @param  number $id 文档ID
     * @return boolean    下载失败返回false
     */
    public function download($id){
        $info = $this->find($id);
        if(empty($info)){
            $this->error = "不存在的文档ID：{$id}";
            return false;
        }

        $File = D('File');
        $root = C('DOWNLOAD_UPLOAD.rootPath');
        $call = array($this, 'setDownload');
        if(false === $File->download($root, $info['file_id'], $call, $info['id'])){
            $this->error = $File->getError();
        }
    }

    /**
     * 新增下载次数（File模型回调方法）
     */
    public function setDownload($id){
        $map = array('id' => $id);
        $this->where($map)->setInc('download');
    }

    /**
     * 保存为草稿
     * @return true 成功， false 保存出错
     * @author huajie <banhuajie@163.com>
     */
    public function autoSave($id = 0){
        $this->_validate = array();

        /* 获取文章数据 */
        $data = $this->create();
        if(!$data){
            return false;
        }

        $file = json_decode(think_decrypt(I('post.file_id')), true);
        if(!empty($file)){
            $data['file_id'] = $file['id'];
            $data['size']    = $file['size'];
        }

        /* 添加或更新数据 */
        if(empty($data['id'])){//新增数据
            $data['id'] = $id;
            $id = $this->add($data);
            if(!$id){
                $this->error = '新增详细内容失败！';
                return false;
            }
        } else { //更新数据
            $status = $this->save($data);
            if(false === $status){
                $this->error = '更新详细内容失败！';
                return false;
            }
        }
        return true;
    }

}
