<?php

namespace Module\Tools;

use Pyramid\Component\HttpFoundation\Response;
use Pyramid\Component\HttpFoundation\RedirectResponse;
use Pyramid\Component\Utility\StringTool;
use Exception;

class Tools {

    /**
     * 链接管理
     * @route /tools/url/{id}
     * @route /url/{id}
     */
    public static function url($request) {
        $id = $request->route->getParameter('id', '');
        if (is_numeric($id)) {
            $item = db_query("select * from {tools_url} where id=:id", array(':id'=>$id))->fetchObject();
        } else {
            $item = db_query("select * from {tools_url} where code=:code", array(':code'=>$id))->fetchObject();
        }
        if ($item) {
            db_query("update {tools_url} set click=click+1 where id={$item->id}");
            return new RedirectResponse($item->url);
        }
        return new RedirectResponse($request->getUriForPath('/'));
    }

    /**
     * 管理端
     * @route /admin/tools
     * @route /admin/tools/url
     */
    public static function adminUrl($request) {
        if ($request->post->getParameters()) {
            $fields = array(
                'url' => $request->getParameter('url', ''),
                'notes' => $request->getParameter('notes', ''),
                'created' => time(),
            );
            $code = $request->getParameter('code', StringTool::shorturl($fields['url']));
            $code = preg_replace("|[^\w]|", '', $code);
            $exists = db_query("select * from {tools_url} where code=:code limit 1", array(':code'=>$code))->fetchObject();
            if ($exists) {
                return new RedirectResponse($request->getUriForPath('/admin/tools/url'), 4, '特征码重复');
            }
            $fields['code'] = $code;
            db_insert("tools_url")
                ->fields($fields)
                ->execute();
            return new RedirectResponse($request->getUriForPath('/admin/tools/url'), 1, '添加成功');
        }
        $data = db_query("select * from {tools_url} order by id desc")->fetchAll();
        return new Response(render('/admin/tools.url.html', array(
            'data' => $data,
        )));
    }
    
    /**
     * 添加
     * @route /admin/tools/url/add
     */
    public static function addUrl($request) {
        if ($request->post->getParameters()) {
            $url = $request->post->getParameter('url', '');
            $code = $request->post->getParameter('code', '');
            $notes = $request->post->getParameter('notes', '');
            if (empty($code)) {
                $code = StringTool::shorturl($url);
            }
            $code = preg_replace("|[^\w]|", '', $code);
            if (db_query("select * from {tools_url} where code=:code", array(':code'=>$code))->fetchObject()) {
                return new RedirectResponse($request->getUriForPath('/admin/tools/url'), 3, '操作失败,该特征码已经存在.');
            }
            db_update("tools_url")
                ->fields(array(
                    'url' => $url,
                    'code' => $code,
                    'notes' => $notes,
                ))
                ->condition('id', $id)
                ->execute();
            return new RedirectResponse($request->getUriForPath('/admin/tools/url'), 1, '操作成功');
        }
        return new Response(render('/admin/tools.url.add.html'));
    }
    
    /**
     * 修改
     * @route /admin/tools/url/edit/{id}
     */
    public static function editUrl($request) {
        $id = $request->route->getParameter('id');
        if (!$id) {
            return new RedirectResponse($request->getUriForPath('/admin/tools/url'), 4, '无此记录');
        }
        if (!$data = db_query('select * from {tools_url} where id=:id', array(':id'=>$id))->fetchObject()) {
            return new RedirectResponse($request->getUriForPath('/admin/tools/url'), 4, '无此记录');
        }
        if ($request->post->getParameters()) {
            $url = $request->post->getParameter('url', '');
            $code = $request->post->getParameter('code', '');
            $notes = $request->post->getParameter('notes', '');
            if (empty($code)) {
                $code = StringTool::shorturl($url);
            }
            $code = preg_replace("|[^\w]|", '', $code);
            //@todo 验证code唯一
            db_update("tools_url")
                ->fields(array(
                    'url' => $url,
                    'code' => $code,
                    'notes' => $notes,
                ))
                ->condition('id', $id)
                ->execute();
            return new RedirectResponse($request->getUriForPath('/admin/tools/url'), 1, '更新成功');
        }
        return new Response(render('/admin/tools.url.edit.html', array('data' => $data)));
    }
    
    /**
     * 删除
     * @route /admin/tools/url/delete/{id}
     */
    public static function deleteUrl($request) {
        validateRequestToken($request, 600);
        $id = $request->route->getParameter('id');
        if (!$id) {
            return new RedirectResponse($request->getUriForPath('/admin/tools/url'), 4, '无此记录');
        }
        db_delete('tools_url')->condition('id', $id)->execute();
        return new RedirectResponse($request->getUriForPath('/admin/tools/url'), 1, '操作成功');
    }

}
