<?php

namespace App\Jobs;

use App\Models\RecruitAppointInfo;
use App\Models\RecruitPost;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Models\Recruit;
use App\Models\RecruitTicket;
use PhpOffice\PhpWord\TemplateProcessor;
use Illuminate\Support\Facades\Storage;

class TicketJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    private $recruit_id;
    private $type;
    private $data;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($recruit_id, $type, $data)
    {
        $this->recruit_id = $recruit_id;
        $this->type = $type;
        $this->data = $data;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $recruit = Recruit::where('id',$this->recruit_id)->first();
        if(!$recruit->status){
            return ;
        }
        switch ($this->type){
            case 'pen':
                if(!$recruit->pen_ticket_content){
                    return;
                }
                switch ($this->data['type']){
                    case '1':
                        //自动生成
                        $list = RecruitAppointInfo::where('recruit_id',$this->recruit_id)->where('audit',3)->where('pen_audit',-1)->orderBy('post_id','asc')->orderBy('created_at','asc')->get()->toArray();
                        $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id');
                        $list = array_chunk($list,$this->data['auto_each_number'],true);
                        if(!empty($recruit->preliminary_start)){
                            $preliminary_start = date("Y-m-d H:i:s",strtotime("+1 days",date("Y-m-d",time())));
                            $preliminary_end = date("Y-m-d H:i:s",strtotime("+5 days",date("Y-m-d",time())));
                        }else{
                            $preliminary_start = date("Y-m-d H:i:s",strtotime("-5 days",strtotime($recruit->preliminary_start)));
                            $preliminary_end = date("Y-m-d H:i:s",strtotime("+1 days",strtotime($recruit->preliminary_start)));
                        }
                        foreach ($list as $room => $room_list){
                            if(is_array($room_list)){
                                foreach ($room_list as $k => $v){
                                    $seat = $k + 1;
                                    $item = [
                                        'realname' => $v['realname'],
                                        'ex_number' => date("Y",time()) . '9' . sprintf("%03d",$v['recruit_id']) . sprintf("%04d",$seat),
                                        'card' => $v['card'],
                                        'post' => $post_data[$v['post_id']],
                                        'ex_room' => sprintf("%02d",($room+1)),
                                        'ex_seat' => sprintf("%03d",$seat),
                                        'avatar' => $v['avatar']
                                    ];
                                    $ticket = [
                                        'appoint_id' => $v['id'],
                                        'ex_type' => 1,
                                        'ex_number' => $item['ex_number'],
                                        'ex_seat' => $item['ex_seat'],
                                        'ex_room' => $item['ex_room'],
                                        'ex_status' => 0,
                                        'ex_start' => $preliminary_start,
                                        'ex_end' => $preliminary_end
                                    ];
                                    RecruitTicket::create($ticket);
                                    $this->fetch($item,$recruit->pen_ticket_content, 'pen', $recruit);
                                }
                            }
                        }
                        $this->pdf('pen',$recruit);
                        Recruit::where('id',$this->recruit_id)->update(['pen_ticket_status' => 2]);
                        break;
                    case '2':
                        $ticket_data_list = $this->data['list'];
                        $list = RecruitAppointInfo::where('recruit_id',$this->recruit_id)->where('audit',3)->where('pen_audit',-1)->orderBy('post_id','asc')->orderBy('created_at','asc')->get()->toArray();
                        $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id');
                        if(empty($recruit->preliminary_start)){
                            $preliminary_start = date("Y-m-d H:i:s",strtotime("+1 days",strtotime(date("Y-m-d",time()))));
                            $preliminary_end = date("Y-m-d H:i:s",strtotime("+5 days",strtotime(date("Y-m-d",time()))));
                        }else{
                            $preliminary_start = date("Y-m-d H:i:s",strtotime("-5 days",strtotime($recruit->preliminary_start)));
                            $preliminary_end = date("Y-m-d H:i:s",strtotime("+1 days",strtotime($recruit->preliminary_start)));
                        }
                        foreach ($list as $k => $v){
                            if(!array_key_exists($v['card'],$ticket_data_list)){
                                echo "{$v['realname']}_{$v['card']}_{$post_data[$v['post_id']]} 不在准考名单内\r\n";
                                continue;
                            }
                            if(!$this->word_exist($recruit,'pen', ['realname' => $v['realname'],'card' => $v['card'],'post' => $post_data[$v['post_id']]])){
                                $item = [
                                    'realname' => $v['realname'],
                                    'ex_number' => array_key_exists('ex_number',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_number'] : '',
                                    'card' => $v['card'],
                                    'post' => $post_data[$v['post_id']],
                                    'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '',
                                    'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '',
                                    'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '',
                                    'ex_room' => array_key_exists('ex_room',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_room'] : '',
                                    'ex_seat' => array_key_exists('ex_seat',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_seat'] : '',
                                    'avatar' => $v['avatar']
                                ];
                                $ticket = [
                                    'appoint_id' => $v['id'],
                                    'ex_type' => 1,
                                    'ex_number' => $item['ex_number'],
                                    'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '',
                                    'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '',
                                    'ex_seat' => $item['ex_seat'],
                                    'ex_room' => $item['ex_room'],
                                    'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '',
                                    'ex_status' => 0,
                                    'ex_start' => $preliminary_start,
                                    'ex_end' => $preliminary_end
                                ];
                                RecruitTicket::create($ticket);
                                $this->fetch($item,$recruit->pen_ticket_content, 'pen', $recruit);
                            }

                        }
                        //$this->pdf('pen',$recruit);
                        Recruit::where('id',$this->recruit_id)->update(['pen_ticket_status' => 2]);
                        break;
                }


                break;
            case 'face':
                if(!$recruit->face_ticket_content){
                    return;
                }
                if(empty($recruit->interview_start)){
                    $interview_start = date("Y-m-d H:i:s",strtotime("+1 days",strtotime(date("Y-m-d",time()))));
                    $interview_end = date("Y-m-d H:i:s",strtotime("+5 days",strtotime(date("Y-m-d",time()))));
                }else{
                    $interview_start = date("Y-m-d H:i:s",strtotime("-5 days",strtotime($recruit->interview_start)));
                    $interview_end = date("Y-m-d H:i:s",strtotime("+1 days",strtotime($recruit->interview_end)));
                }
                switch ($this->data['type']){
                    case '0'://不需要额外数据
                        $list = RecruitAppointInfo::where('recruit_id',$this->recruit_id)->where('audit',3)->where('face_audit',-1)->where(function($query){
                            $query->where('pen_audit',1)
                                  ->orWhere('pen_audit',3);
                        })->orderBy('post_id','asc')->orderBy('created_at','asc')->get()->toArray();
                        $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id');
                        if($list){
                            foreach ($list as $k => $v){
                                $item = [
                                    'appoint_id' => $v['id'],
                                    'ex_type' => 3,
                                    'realname' => $v['realname'],
                                    'ex_title' => '',
                                    'card' => $v['card'],
                                    'ex_time' => '',
                                    'ex_address' => '',
                                    'post' => $post_data[$v['post_id']],
                                ];
                                $ticket = [
                                    'appoint_id' => $v['id'],
                                    'ex_type' => 3,
                                    'ex_status' => 1,
                                    'ex_start' => $interview_start,
                                    'ex_end' => $interview_end
                                ];
                                RecruitTicket::create($ticket);
                                $this->fetch($item,$recruit->face_ticket_content, 'face', $recruit);
                            }
                        }
                        break;
                }
                break;
            case 'pen_result':
                    $list = $this->data;
                    foreach ($list as $k => $v){
                        if(!array_key_exists('id',$v) || intval($v['id']) <= 0){
                            continue;
                        }
                        $appoint_info = RecruitAppointInfo::where('recruit_appoint_info.id',$v['id'])->where('recruit_appoint_info.recruit_id',$this->recruit_id)->join('recruit_ticket', 'recruit_appoint_info.id', '=', 'recruit_ticket.appoint_id')->select('recruit_appoint_info.*','recruit_ticket.ex_number')->first();
                        if(!$appoint_info){
                            continue;
                        }
                        if($appoint_info->realname != $v['realname'] || $appoint_info->card != $v['card'] || $appoint_info->ex_number != $v['ex_number']){
                            //数据污染,路过处理
                            continue;
                        }
                        if($v['next'] == '是'){
                            $update['pen_audit'] = 1;
                            $status = -1;
                        }else{
                            $update['pen_audit'] = 0;
                            $status = 3;
                        }
                        if(!is_numeric($v['record']) && empty($v['record'])){
                            $update['pen_audit'] = 2;
                            $status = 3;
                        }
                        if(in_array(4,explode(',',$recruit->step))){
                            $update['computer_audit'] = $status;
                        }else{
                            $update['face_audit'] = $status;
                        }
                        RecruitAppointInfo::where('id',$v['id'])->update($update);
                    }
                break;
        }
    }

    protected function fetch($data, $template, $type, $recruit = null){
        $templateProcessor = new TemplateProcessor(base_path() . $template);
        foreach ($data as $k => $v){
            if($k == 'avatar'){
                $templateProcessor->setImageValue('avatar',['path' => 'http://www.jucai.gov.cn/'.$v, 'width' => 200, 'height' => 150]);
            }else{
                $templateProcessor->setValue($k, $v);
            }
        }
        if($recruit){
            $name = $recruit->name_en;
            $date = date("Y-m-d",strtotime($recruit->created_at));
        }else{
            $name = uniqid();
            $date = date("Y-m-d",time());
        }

        if(!is_dir(base_path() . "/storage/app/public/recruit/ticket/word/{$date}/{$name}/{$type}")){
            Storage::makeDirectory("public/recruit/ticket/word/{$date}/{$name}/{$type}");
        }
//        if(!is_dir(base_path() . "/storage/app/public/recruit/ticket/pdf/{$date}/{$name}/{$type}" )){
//            Storage::makeDirectory("public/recruit/ticket/pdf/{$date}/{$name}/{$type}");
//        }

        $filename = $date . '_' . $data['realname'] . '_' . $data['card'] . '_' . $data['post'];
        $word_url = base_path() . "/storage/app/public/recruit/ticket/word/{$date}/{$name}/{$type}/" . $filename . '.docx';
        $templateProcessor->saveAs($word_url);//另存为
//        $pdf_url = base_path() . "/storage/app/public/recruit/ticket/pdf/{$date}/{$name}/{$type}";
//        shell_exec('export DISPLAY=:0.0');
//        shell_exec('libreoffice --headless --convert-to pdf:writer_pdf_Export ' . $word_url . ' --outdir ' . $pdf_url);
    }

    protected function word_exist($recruit,$type,$data)
    {
        if($recruit){
            $name = $recruit->name_en;
            $date = date("Y-m-d",strtotime($recruit->created_at));
        }else{
            $name = uniqid();
            $date = date("Y-m-d",time());
        }
        $filename = $date . '_' . $data['realname'] . '_' . $data['card'] . '_' . $data['post'];
        if(file_exists(base_path() . "/storage/app/public/recruit/ticket/word/{$date}/{$name}/{$type}/" . $filename . '.docx')){
            echo $filename . "跳过\r\n";
            return true;
        }else{
            echo $filename . "生成\r\n";
            return false;
        }
    }

    protected function pdf($type, $recruit = null){
        if($recruit){
            $name = $recruit->name_en;
            $date = date("Y-m-d",strtotime($recruit->created_at));
        }else{
            $name = uniqid();
            $date = date("Y-m-d",time());
        }
        if(!is_dir(base_path() . "/storage/app/public/recruit/ticket/pdf/{$date}/{$name}/{$type}" )){
            Storage::makeDirectory("public/recruit/ticket/pdf/{$date}/{$name}/{$type}");
        }
        $word_url = base_path() . "/storage/app/public/recruit/ticket/word/{$date}/{$name}/{$type}/*.docx";
        $pdf_url = base_path() . "/storage/app/public/recruit/ticket/pdf/{$date}/{$name}/{$type}";
        shell_exec('export DISPLAY=:0.0 && export HOME=/data/wwwroot &&libreoffice --headless --convert-to pdf:writer_pdf_Export ' . $word_url . ' --outdir ' . $pdf_url);
    }
}