<?php

namespace App\Models;

use Carbon\Carbon;
use function foo\func;
use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
    protected $table = 'students';

    protected $guarded = [];

    public $marry_list;

    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);

        $this->marry_list = collect([
            ['key' => 1, 'value' => 1, 'show_value' => '未婚'],
            ['key' => 2, 'value' => 2, 'show_value' => '已婚'],
//            ['key' => 3, 'value' => 3, 'show_value' => '离婚'],
        ]);
    }

    public function getMarryList()
    {
        return $this->marry_list;
    }

    public function getBindPhone()
    {
        return $this['bind_phone'] == 2 ? '已绑定' : '未绑定';
    }

    public function getMarry($key = null)
    {
        $key = empty($key) ? $this['marry'] : 1;
        $item = $this->marry_list->where('key', $key)->first();
        return empty($item) ? '未婚' : $item['show_value'];
    }

    public function course()
    {
        return $this->belongsTo('App\Models\Course');
    }

    public function getCheckCardDates()
    {
        return CheckCard::where('student_id', $this['id'])->whereNotNull('begin_date_time')->whereNotNull('end_date_time')->get()->pluck('begin_date_time')->map(function ($item) {
            return substr($item, 0, 10);
        })->unique();
    }

    public function getStudentCourse()
    {
        return StudentCourse::where('student_id', $this['id'])->first();
    }

    public function getCourseInfo()
    {
        $student_course = StudentCourse::where('student_id', $this['id'])->first();
        if(empty($student_course)) {
            return [
                'course_name' => '',
                'apply_date' => '',
                'end_date' => '',
                'teacher_names' => ''
            ];
        }
        $course = Course::find($student_course->course_id);
        if(empty($course)) {
            $course_name = '';
        } else {
            $course_name = $course->name;
        }

        $apply_date = $student_course->apply_date;
        if(empty($apply_date) || empty($student_course->duration)) {
            $end_date = '';
        } else {
            $end_date = Carbon::createFromTimestamp(strtotime($apply_date))->addDays($student_course->duration)->toDateString();
        }
        $teacher_names = $student_course->getTeacherFullNames();
        return [
            'course_name' => $course_name,
            'apply_date' => $apply_date,
            'end_date' => $end_date,
            'teacher_names' => $teacher_names
        ];
    }

    public function getCourseName()
    {
        $student_course = StudentCourse::where('student_id', $this['id'])->first();
        if(empty($student_course)) return '';
        $course = Course::find($student_course->course_id);
        return empty($course) ? '' : $course->name;
    }

    public function getIsNew()
    {
        $today = Carbon::today();
        $this_week_begin = null;
        while($today->dayOfWeekIso != 1) {
            $today = $today->subDay();
        }
        $this_week_begin = $today->toDateTimeString();
        $this_week_end = $today->addDays(7)->toDateTimeString();

        $tmp = Remark::where([
            ['student_id', '=', $this['id']],
            ['created_at', '>=', $this_week_begin],
            ['created_at', '<', $this_week_end],
        ])->first();
        return empty($tmp) ? true : false;
    }

    public function getThisWeekAverageScore(Remark $remark)
    {
        $today = Carbon::today();
        $this_week_begin = null;
        while($today->dayOfWeekIso != 1) {
            $today = $today->subDay();
        }
        $this_week_begin = $today->toDateTimeString();

        return RemarkDetail::where([
            ['remark_id', '=', $remark['id']],
            ['created_at', '>=', $this_week_begin],
        ])->get()->avg('score');
    }
}
