<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发，右手开源，未来可期！]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/

declare (strict_types = 1);

namespace app\home\controller;

use app\base\BaseController;
use app\home\model\Message as MessageList;
use app\home\model\Msg as MsgList;
use think\facade\Db;
use think\facade\View;

class Message extends BaseController
{	
	/**
     * 构造函数
     */
	protected $model;
	protected $model2;
	public function __construct() {
        parent::__construct(); // 调用父类构造函数
        $this->model = new MessageList();
        $this->model2 = new MsgList();
    }
    //收件箱
    public function inbox()
    {
        if (request()->isAjax()) {
            $param = get_params();
            $where = [];
			$where[] = ['to_uid', '=', $this->uid];
			$where[] = ['delete_time', '=', 0];
            if (!empty($param['keywords'])) {
                $where[] = ['title', 'like', '%' . $param['keywords'] . '%'];
            }
            if (!empty($param['read'])) {
				if($param['read']==1){
					$where[] = ['read_time', '=', 0];
				}else{
					$where[] = ['read_time', '>', 0];
				}                
            }
			if (!empty($param['types'])) {
				if($param['types']==1){
					$where[] = ['from_uid', '=', 0];
				}else{
					$where[] = ['from_uid', '>', 0];
				}                
            }
            //按发送时间检索
			if (!empty($param['range_time'])) {
				$range_time =explode('~', $param['range_time']);
				$where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]];
			}			
            $list = $this->model2->datalist($where,$param);
            return table_assign(0, '', $list);
        } else {
			$a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
			$b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
			$count = [
				'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
				'inbox'   => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
				'star'   => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
				'draft'   => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
				'rubbish' => $a+$b
			];
			View::assign('count', $count);
			View::assign('action', $this->action);
            return view();
        }
    }
	
    //星标信息
    public function star()
    {
        if (request()->isAjax()) {
            $param = get_params();
            $where = [];
			$where[] = ['to_uid', '=', $this->uid];
			$where[] = ['delete_time', '=', 0];
			$where[] = ['is_star', '=', 1];
            if (!empty($param['keywords'])) {
                $where[] = ['title', 'like', '%' . $param['keywords'] . '%'];
            }
            if (!empty($param['read'])) {
				if($param['read']==1){
					$where[] = ['read_time', '=', 0];
				}else{
					$where[] = ['read_time', '>', 0];
				}                
            }
			if (!empty($param['types'])) {
				if($param['types']==1){
					$where[] = ['from_uid', '=', 0];
				}else{
					$where[] = ['from_uid', '>', 0];
				}                
            }
            //按发送时间检索
			if (!empty($param['range_time'])) {
				$range_time =explode('~', $param['range_time']);
				$where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]];
			}			
            $list = $this->model2->datalist($where,$param);
            return table_assign(0, '', $list);
        } else {
			$a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
			$b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
			$count = [
				'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
				'inbox'   => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
				'star'   => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
				'draft'   => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
				'rubbish' => $a+$b
			];
			View::assign('count', $count);
			View::assign('action', $this->action);
            return view();
        }
    }
	
    //发件箱
    public function sendbox()
    {
        if (request()->isAjax()) {
            $param = get_params();
            $where = [];
            if (!empty($param['keywords'])) {
                $map[] = ['title', 'like', '%' . $param['keywords'] . '%'];
            }
            $where[] = ['from_uid', '=', $this->uid];
            $where[] = ['is_draft', '=', 1];
            $where[] = ['delete_time', '=', 0];
            //按发送时间检索
			if (!empty($param['range_time'])) {
				$range_time =explode('~', $param['range_time']);
				$where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]];
			}			
            $list = $this->model->datalist($where,$param);
            return table_assign(0, '', $list);
        } else {
			$a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
			$b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
			$count = [
				'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
				'inbox'   => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
				'star'   => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
				'draft'   => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
				'rubbish' => $a+$b
			];
			View::assign('count', $count);
			View::assign('action', $this->action);
            return view();
        }
    }

    //草稿箱
    public function draft()
    {
        if (request()->isAjax()) {
            $param = get_params();
            $where = [];
            if (!empty($param['keywords'])) {
                $map[] = ['title', 'like', '%' . $param['keywords'] . '%'];
            }
            $where[] = ['from_uid', '=', $this->uid];
            $where[] = ['is_draft', '=', 2];
            $where[] = ['delete_time', '=', 0];
            //按发送时间检索
			if (!empty($param['range_time'])) {
				$range_time =explode('~', $param['range_time']);
				$where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]];
			}			
            $list = $this->model->datalist($where,$param);
            return table_assign(0, '', $list);
        } else {
			$a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
			$b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
			$count = [
				'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
				'inbox'   => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
				'star'   => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
				'draft'   => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
				'rubbish' => $a+$b
			];
			View::assign('count', $count);
			View::assign('action', $this->action);
            return view();
        }
    }

    //垃圾箱
    public function rubbish()
    {
        if (request()->isAjax()) {
			$param = get_params();
			$uid = $this->uid;
			$where = "delete_time > 0";
			$where.= " AND clear_time = 0";
            if (!empty($param['keywords'])) {
				$where.= " AND title like '%" . $param['keywords'] . "%'";
            }
			$sqlParts = [];
			$sqlCounts = [];
			$tables=['message','msg'];
			$prefix = get_config('database.connections.mysql.prefix');
			foreach ($tables as $table) {
				$tableName = $prefix.$table;
				if($table=='message'){
					$wherea= $where.' AND from_uid = '.$uid;
					// 假设每个表都有相同的列结构，这里只是简单示例
					$sqlPart = "SELECT id,title,from_uid,send_time,'{$table}' as table_name FROM {$tableName} WHERE {$wherea}";
					$sqlCount = "SELECT COUNT(*) AS count FROM {$tableName} WHERE {$wherea}";
				}
				else{
					$whereb= $where.' AND to_uid = '.$uid;
					$sqlPart = "SELECT id,title,from_uid,create_time as send_time,'{$table}' as table_name FROM {$tableName} WHERE {$whereb}";
					$sqlCount = "SELECT COUNT(*) AS count FROM {$tableName} WHERE {$whereb}";
				}			
				
				// 查询数据库中是否存在该数据表
				$is_table = Db::query("SHOW TABLES LIKE '{$tableName}'");
				// 判断查询结果
				if (!empty($is_table)) {
					$sqlParts[] = $sqlPart;
					$sqlCounts[] = $sqlCount;
				}
			}
			// 使用implode将各个部分用UNION ALL连接起来
			$unionSql = implode(" UNION ALL ", $sqlParts);
			
			$totalCount = 0;
			foreach ($sqlCounts as $sql) {
				$count = Db::query($sql)[0]['count']; // 假设每个查询都返回了一个包含'count'键的数组
				$totalCount += $count;
			}
			// 添加排序和分页逻辑
			// 假设每页显示10条记录，当前页码为$page（需要预先定义或获取）
			$pageSize = $param['limit'];
			$page = 1; // 示例页码
			$offset = ($page - 1) * $pageSize;

			// 注意：不同的数据库分页语法可能有所不同，这里以MySQL为例
			$finalSql = $unionSql . " ORDER BY send_time DESC LIMIT {$offset}, {$pageSize}";

			// 执行查询
			$result = Db::query($finalSql);
			// 处理结果
			foreach ($result as &$row) {
				// 处理每一行数据
				$row['types'] = 0;
				$row['sourse'] = '发件箱';
				if($row['send_time'] == 0){
					$row['sourse'] = '草稿箱';
					$row['types'] = 1;
					$row['send_time'] = '-';
				}
				else{
					if($row['table_name'] == 'msg'){
						$row['sourse'] = '收件箱';
						$row['types'] = 2;
					}
					$row['send_time'] = date('Y-m-d H:i:s',$row['send_time']);
				}
				if(!empty($row['from_uid'])){
					$row['from_name'] = Db::name('Admin')->where('id','=',$row['from_uid'])->value('name');
				}
				else{
					$row['from_name']='-';
				}
			}
			$list=array(
				'data'=>$result,
				'total'=>$totalCount
			);
            return table_assign(0, '', $list);
        } else {
			$a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
			$b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
			$count = [
				'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
				'inbox'   => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
				'star'   => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
				'draft'   => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
				'rubbish' => $a+$b
			];
			View::assign('count', $count);
			View::assign('action', $this->action);
			return view();
        }
    }

    //新增&编辑信息
    public function add()
    {
        $param = get_params();
		$id = isset($param['id']) ? $param['id'] : 0;
		$msg_id = 0;
        if ($id > 0) {
			$detail = $this->model->detail($id);
            if (empty($detail)) {
				throw new \think\exception\HttpException(404, '找不到记录');
            }
			if ($detail['from_uid'] != $this->uid) {
				throw new \think\exception\HttpException(406, '无权限编辑');
			}
			if($detail['msg_id']>0){
				 $msg_id = $detail['msg_id'];
			}
            View::assign('detail', $detail);
        }
        View::assign('id', $id);
        View::assign('msg_id', $msg_id);
        return view();
    }
	
    //查看发件箱、草稿箱消息
    public function view($id)
    {
		$detail = $this->model->detail($id);
		if (empty($detail)) {
			throw new \think\exception\HttpException(404, '找不到记录');
		}
		if ($detail['from_uid'] != $this->uid) {
			throw new \think\exception\HttpException(406, '无权限查看');
		}
		//已读回执
		if($detail['send_time']>0){	
			$read_user_ids= msgList::where([['message_id','=',$id],['read_time','>',0]])->column('to_uid');
			$read_users = Db::name('Admin')->where('status', 1)->where('id', 'in', $read_user_ids)->column('name');
			$detail['read_user_names'] = implode(',',$read_users);
		}
		View::assign('detail', $detail);
        return view();
    }
	
	//删除发件、草稿
    public function del()
    {
        $param = get_params();
        $ids = empty($param['ids']) ? 0 : $param['ids'];
        $idArray = explode(',', $ids);
        foreach ($idArray as $key => $val) {
			MessageList::where(['id' => $val])->update(['delete_time' => time()]);
			add_log('delete', $val,[],'消息');
        }
        return to_assign(0, '操作成功');
    }

    //保存消息
    public function save()
    {
        $param = get_params();
        $id = empty($param['id']) ? 0 : $param['id'];
        //接受人类型判断
        if ($param['types'] == 1 && empty($param['uids'])) {
			return to_assign(1, '收件人员不能为空');
        }
		if ($param['types'] == 2 && empty($param['dids'])) {
			return to_assign(1, '收件部门不能为空'); 
        }
		if ($param['types'] == 3 && empty($param['pids'])) {
           return to_assign(1, '收件岗位不能为空');
        }
		if ($param['types'] == 4) {
			$param['uids'] = '';
			$param['dids'] = '';
			$param['pids'] = '';
			$param['copy_uids'] = '';
        }
		$res = false;
        if ($id > 0) {
            //编辑信息的情况
            $param['update_time'] = time();
            $res = MessageList::strict(false)->field(true)->update($param);
        } else {
            //新增信息的情况
            $param['create_time'] = time();
			$param['update_time'] = time();
            $param['from_uid'] = $this->uid;
            $res = MessageList::strict(false)->field(true)->insertGetId($param);
        }
        if ($res !== false) {
            if ($id > 0) {
                $mid = $id;
            } else {
                $mid = $res;
            }
            add_log('save',$mid,$param,'消息');
			if($param['is_draft'] == 1){
				$res = $this->model->send($mid);
				if ($res!==false) {
					return to_assign(0, '发送成功');
				} else {
					return to_assign(1, '发送失败');
				}
			}
			else{
				return to_assign(0, '保存成功', $mid);
			}
        } else {
            return to_assign(1, '操作失败');
        }
    }
	
    //发送消息
    public function send_message($id)
    {
        //查询要发的消息
        $msg = MessageList::where(['id' => $id])->find();
        if (!empty($msg)) {
            $res = $this->model->send($id);
            if ($res!==false) {
                return to_assign(0, '发送成功');
            } else {
                return to_assign(1, '发送失败');
            }
        } else {
            return to_assign(1, '发送失败，找不到要发送的内容');
        }
    }
	

    //查看收件箱消息
    public function read($id )
    {
        $detail = $this->model2->detail($id);
        if (empty($detail)) {
            throw new \think\exception\HttpException(406, '找不到记录');
        }
        if ($detail['to_uid'] != $this->uid) {
            throw new \think\exception\HttpException(406, '找不到记录');
        }
        MsgList::where(['id' => $id])->update(['read_time' => time()]);
		if($detail['message_id']>0){
			 View::assign('message', $this->model->detail($detail['message_id']));
		}
		$detail['from_uname'] = Db::name('Admin')->where('id', $detail['from_uid'])->value('name');
        View::assign('detail', $detail);
        return view();
    }
	
	
    //回复信息
    public function reply()
    {
        $param = get_params();
		$msg_id = isset($param['msg_id']) ? $param['msg_id'] : 0;
		$detail = $this->model2->detail($msg_id);
		if (empty($detail)) {
			throw new \think\exception\HttpException(404, '找不到记录');
		}
		if ($detail['to_uid'] != $this->uid) {
			throw new \think\exception\HttpException(406, '无权限回复');
		}
        $detail['from_name'] =  Db::name('Admin')->where('id', $detail['from_uid'])->value('name');
		View::assign('detail', $detail);
        return view();
    }
	
    //转发信息
    public function resend()
    {
        $param = get_params();
		$msg_id = isset($param['msg_id']) ? $param['msg_id'] : 0;
		$detail = $this->model2->detail($msg_id);
		if (empty($detail)) {
			throw new \think\exception\HttpException(404, '找不到记录');
		}
		if ($detail['to_uid'] != $this->uid) {
			throw new \think\exception\HttpException(406, '无权限回复');
		}
        $detail['from_name'] =  Db::name('Admin')->where('id', $detail['from_uid'])->value('name');
		View::assign('detail', $detail);
        return view();
    }

    //状态修改
    public function check()
    {
        $param = get_params();
        $type = empty($param['type']) ? 0 : $param['type'];
        $ids = empty($param['ids']) ? 0 : $param['ids'];
        $idArray = explode(',', $ids);
        foreach ($idArray as $key => $val) {
            if ($type==1) { //设置信息为已读
				MsgList::where(['id' => $val])->update(['read_time' => time()]);
				add_log('view', $val,[],'消息');
            }
            else if ($type==2) {  //信息进入垃圾箱
				MsgList::where(['id' => $val])->update(['delete_time' => time()]);
				add_log('delete', $val,[],'消息');
            }
            else if ($type==3) {  //信息从垃圾箱恢复
				MsgList::where(['id' => $val])->update(['delete_time' => 0]);
				add_log('recovery', $val,[],'消息');
            }
            else if ($type==4) {  //信息彻底删除
				MsgList::where(['id' => $val])->update(['clear_time' => 0]);
				add_log('clear', $val,[],'消息');
            }
			else if ($type==5) {  //星标信息
				MsgList::where(['id' => $val])->update(['is_star' => 1]);
				add_log('star', $val,[],'消息');
            }
			else if ($type==6) {  //取消星标信息
				MsgList::where(['id' => $val])->update(['is_star' => 0]);
				add_log('unstar', $val,[],'消息');
            }
        }
        return to_assign(0, '操作成功');
    }
	
    //还原消息
    public function recovery()
    {
        $param = get_params();
        $table = empty($param['table']) ? '' : $param['table'];
        $ids = empty($param['ids']) ? 0 : $param['ids'];
        $idArray = explode(',', $ids);
        foreach ($idArray as $key => $val) {
			Db::name($table)->update(['id' => $val,'delete_time' => 0]);
			add_log('recovery', $val,[],'消息');
        }
        return to_assign(0, '操作成功');
    }
	//清除消息
    public function clear()
    {
        $param = get_params();
        $table = empty($param['table']) ? '' : $param['table'];
        $ids = empty($param['ids']) ? 0 : $param['ids'];
        $idArray = explode(',', $ids);
        foreach ($idArray as $key => $val) {
			Db::name($table)->update(['id' => $val,'clear_time' => time()]);
			add_log('clear', $val,[],'消息');
        }
        return to_assign(0, '操作成功');
    }

}
