<?php

namespace App;

use App\Traits\CsvImportable;
use App\Traits\CsvSplitable;
use Carbon\Carbon;

class Staff2000Company extends RichSearchableModel
{
    use CsvImportable;
    use CsvSplitable;

    public $incrementing = false;
    public $errors = [];
    const CREATED_AT = NULL;
    const UPDATED_AT = 'modified';
    protected $table = 'tcd_staff2000company';
    protected $primaryKey = 'code';
    protected $fillable = [
        'code',
        'name',
        'dep',
        'contact_name',
        'zip',
        'address_1',
        'address_2',
        'address_3',
        'tel',
        'email',
        'basic_contract_date',
        'dispatch_agency_manager_name',
        'dispatch_agency_manager_position',
        'troubles_dispatch_agency_contact_name',
        'troubles_dispatch_agency_contact_position',
        'troubles_contact_name',
        'troubles_contact_position',
        'troubles_contact_tel',
        'pg_client_id',
        'client_to_code',
        'designated_contract',
        'designated_billing',
        'contact_position',
        'troubles_dispatch_agency_contact_dep',
        'dispatched_establishment_unit_conflict_day',
    ];
    public static $one_query_searchable_fields = [
        'code',
        'name',
        'tel'
    ];
    const FIELD_NAME = [
        'code' => '派遣先ｺｰﾄﾞ',
        'name' => '派遣先名',
        'dep' => '部署名',
        'valid_staff2000_contracts_count' => '契約件数',
        'contact_name' => '担当者名',
        'zip' => '郵便番号',
        'address_1' => '住所都道府県',
        'address_2' => '区市町村',
        'address_3' => '住所詳細',
        'tel' => '電話番号',
        'email' => 'ﾒｰﾙｱﾄﾞﾚｽ',
        'basic_contract_date' => '基本契約日',
        'dispatch_agency_manager_name' => '派遣元責任者名',
        'dispatch_agency_manager_position' => '派遣元責任者役職',
        'troubles_dispatch_agency_contact_name' => '苦情:派遣元担当者名',
        'troubles_dispatch_agency_contact_position' => '苦情:派遣元担当役職',
        'troubles_contact_name' => '苦情:派遣先担当者名',
        'troubles_contact_position' => '苦情:派遣先担当役職',
        'troubles_contact_tel' => '苦情:派遣先担当TEL',
        'pg_client_id' => '派遣先ID',
        'client_to_code' => 'ｸﾗｲｱﾝﾄ指ｺｰﾄﾞ',
        'designated_contract' => '指定 契約',
        'designated_billing' => '指定 請求',
        'contact_position' => '担当者役職',
        'troubles_dispatch_agency_contact_dep' => '苦情:派遣先担当所属',
        'dispatched_establishment_unit_conflict_day' => '派遣先事業所単位抵触日',
        'modified' => 'レコード更新日',
    ];

    const DEFAULT_LIST = [
        'number' => 100,
        'search_method' => 1,
        'custom_list_sorts' => [
            [
                'field' => 'code',
                'sort' => CustomListSort::DESC,
                'priority' => 1
            ]
        ],
        'custom_list_conditions' => [],
        'custom_list_fields' => [
            [
                'field' => 'dep'
            ],
            [
                'field' => 'contact_name'
            ],
            [
                'field' => 'modified'
            ],
        ],
    ];

    public static $function_id = CustomList::STAFF2000_COMPANY;
    public static $simple_searchable_fields = [
        'code',
        'name',
        'dep',
        'contact_name',
        'zip',
        'address_1',
        'address_2',
        'address_3',
        'tel',
        'email',
        'basic_contract_date',
        'dispatch_agency_manager_name',
        'dispatch_agency_manager_position',
        'troubles_dispatch_agency_contact_name',
        'troubles_dispatch_agency_contact_position',
        'troubles_contact_name',
        'troubles_contact_position',
        'troubles_contact_tel',
        'pg_client_id',
        'client_to_code',
        'designated_contract',
        'designated_billing',
        'contact_position',
        'troubles_dispatch_agency_contact_dep',
        'dispatched_establishment_unit_conflict_day',
        'modified',
    ];

    protected $validateFields = [
        'date_field' => ['date', 'datetime'],
        'num_field' => [],
        'bool_field' => [],
    ];

    public static $field_type_exceptions = [
        'valid_staff2000_contracts_count' => 'num'
    ];

    public function company()
    {
        return $this->belongsTo(Company::class, 'pg_client_id', 'co_id');
    }

    public function staff2000_contracts()
    {
        return $this->hasMany(Staff2000Contract::class, '2co_code', 'code')
            ->orderBy('2or_code', 'desc');
    }

    public function valid_staff2000_contracts()
    {
        $now = Carbon::now()->toDateString();
        return $this->hasMany(Staff2000Contract::class, '2co_code', 'code')
            ->whereDate('contract_period_start', '<=', $now)
            ->whereDate('contract_period_end', '>=', $now)
            ->orderby('contract_period_end', 'ASC');
    }

    public function expired_staff2000_contracts()
    {
        $now = Carbon::now()->toDateString();
        return $this->hasMany(Staff2000Contract::class, '2co_code', 'code')
            ->whereDate('contract_period_end', '<', $now);
    }

    public function getFullAddressAttribute()
    {
        return $this->address_1.$this->address_2.$this->address_3;
    }

    // 一覧画面向けアクセサ
    public function getIndexPgClientIdAttribute()
    {
        $value = $this->pg_client_id;
        if (empty($value)) return $value;
        return '<a href="company/view/' . $value.'">'.$value.'</a>';
    }

    public function scopeModified($query, $condition, $searchMethod)
    {
        return $query->datetime($condition, $searchMethod);
    }

    public function scopeAddParticularCons($query)
    {
        $query->withCount(['valid_staff2000_contracts']);
    }

    public function scopeValidStaff2000ContractsCount($query, $condition)
    {
        $query->searchCount('valid_staff2000_contracts', $condition);
    }
}
