<?php
declare (strict_types = 1);

namespace app\manager\controller;

use app\admin\model\Version as VersionModel;
use think\admin\Controller;
use think\admin\extend\DataExtend;
use think\admin\service\AdminService;
use think\admin\service\SystemService;
use think\admin\Storage;

/**
 * 版本管理
 * @auth true
 * @menu true
 */
class Version extends Controller
{
    /**
     * 允许上传的文件类型
     * @var array
     */
    protected $allowExts = ['zip', 'exe', 'dmg', 'pkg', 'deb', 'rpm'];

    /**
     * 版本列表
     * @auth true
     * @menu true
     */
    public function index()
    {
        $this->title = '版本管理';
        // 创建查询对象
        $query = VersionModel::mQuery();
        // 数据列表处理
        $query->like('version_no,version_name')->equal('platform,status');
        // 列表排序处理
        $query->order('version_no desc')->page();
    }

    /**
     * 添加版本
     * @auth true
     */
    public function add()
    {
        $this->title = '添加版本';
        VersionModel::mForm('form');
    }

    /**
     * 编辑版本
     * @auth true
     */
    public function edit()
    {
        $this->title = '编辑版本';
        VersionModel::mForm('form');
    }

    /**
     * 表单数据处理
     */
    protected function _form_filter(&$data)
    {
        if ($this->request->isGet()) {
            // 获取版本日志
            if (isset($data['id'])) {
                $data['logs'] = \think\facade\Db::name('version_log')
                    ->where(['version_id' => $data['id']])
                    ->order('id asc')
                    ->select()
                    ->toArray();
            }
        } else {
            // 检查版本号是否已存在
            if (empty($data['id'])) {
                $exists = VersionModel::mk()->where('version_no', $data['version_no'])->find();
                if ($exists) {
                    $this->error('该版本号已存在！');
                }
            }
            
            // 保存版本日志
            if (isset($data['logs'])) {
                $logs = [];
                foreach ($data['logs']['type'] as $key => $type) {
                    if (!empty($data['logs']['content'][$key])) {
                        $logs[] = [
                            'version_id' => $data['id'] ?? 0,
                            'type' => $type,
                            'content' => $data['logs']['content'][$key],
                            'create_time' => date('Y-m-d H:i:s')
                        ];
                    }
                }
                unset($data['logs']);
                if (!empty($logs)) {
                    if (isset($data['id'])) {
                        \think\facade\Db::name('version_log')->where(['version_id' => $data['id']])->delete();
                    }
                    \think\facade\Db::name('version_log')->insertAll($logs);
                }
            }
        }
    }

    /**
     * 删除版本
     * @auth true
     */
    public function remove()
    {
        VersionModel::mDelete();
    }

    /**
     * 版本状态
     * @auth true
     */
    public function state()
    {
        VersionModel::mSave($this->_vali([
            'status.in:0,1' => '状态值范围异常！',
            'status.require' => '状态值不能为空！',
        ]));
    }

    /**
     * 上传更新包
     * @auth true
     */
    public function upload()
    {
        if ($this->request->isPost()) {
            try {
                // 获取上传的文件
                $file = $this->request->file('file');
                if (empty($file)) {
                    $this->error('文件上传异常，文件可能过大！');
                }
                
                // 检查文件类型
                $ext = strtolower($file->getOriginalExtension());
                if (!in_array($ext, $this->allowExts)) {
                    $this->error('不支持的文件类型！');
                }
                
                // 获取原始文件名
                $originalName = $file->getOriginalName();
                
                // 从文件名解析版本号
                $version_no = VersionModel::parseVersionFromFilename($originalName);
                
                // 生成版本名称
                $version_name = VersionModel::generateVersionName($version_no, $originalName);
                
                // 执行文件上传
                $type = sysconf('storage.type|raw') ?: 'local';
                if ($type === 'local') {
                    $local = \think\admin\storage\LocalStorage::instance();
                    $distName = dirname($local->path($originalName, false)) . '/' . $originalName;
                    $file->move(dirname($distName), basename($distName));
                    $info = [
                        'url' => '/upload/' . $originalName,
                        'key' => $originalName
                    ];
                    
                    // 设置上传文件的权限为755
                    @chmod($distName, 0755);
                } else {
                    $bina = file_get_contents($file->getPathname());
                    $info = \think\admin\Storage::instance($type)->set($originalName, $bina, false, $originalName);
                }
                
               
                if (isset($info['url'])) {
                    $data = [
                        'code' => 0,
                        'msg' => '文件上传成功！',
                        'data' => [
                            'url' => $info['url'],
                            'name' => $originalName,
                            'version_no' => $version_no,
                            'version_name' => $version_name
                        ]
                    ];
                    return json($data);
                } else {
                    $this->error('文件上传失败！');
                }
            } catch (\Exception $exception) {
                $this->error($exception->getMessage());
            }
        }
    }

    /**
     * 从文件名解析版本信息
     * @param string $filename
     * @return array
     */
    protected function parseVersionFromFilename($filename)
    {
        // 移除扩展名
        $name = pathinfo($filename, PATHINFO_FILENAME);
        
        // 匹配版本号 (支持 v3.4.0 或 3.4.0 格式)
        if (preg_match('/[v]?(\d+\.\d+\.\d+)/', $name, $matches)) {
            $version_no = $matches[1];
            // 提取版本名称 (去掉版本号部分)
            $version_name = trim(str_replace($matches[0], '', $name));
            if (empty($version_name)) {
                $version_name = "版本 {$version_no}";
            }
        } else {
            // 如果没有找到版本号,使用时间戳作为版本号
            $version_no = date('y.m.d');
            $version_name = $name ?: "版本 {$version_no}";
        }

        return [
            'version_no' => $version_no,
            'version_name' => $version_name
        ];
    }
} 