<?php

namespace app\api\controller;

use app\common\model\auth\Admin;
use app\common\model\auth\AdminRole;
use app\common\model\auth\SystemRole;
use app\common\model\Company;
use app\common\model\contract\Contract;
use app\common\model\user\User;
use think\facade\Db;

/**
 * Class CompanyController
 * @package app\api\controller
 */
class CompanyController extends BaseApiController
{

    public function index()
    {
        [$page, $limit] = $this->getPage();
        $admin = Admin::findOrEmpty($this->userInfo['admin_id']);
        $myCompany = Company::findOrEmpty($admin['company_id'])->toArray();
        $companyIds = Contract::where('party_a', $myCompany['id'])->column('party_b');
        $query = Company::whereIn('id', $companyIds)->append(['province_name', 'city_name', 'area_name', 'street_name', 'area_manager_name']);
        $count = $query->count();
        $companies = $query->page($page)->limit($limit)->select()->each(function ($company) {
            $company['other_contacts'] = json_decode($company['other_contacts'], true);
            $company['qualification'] = $company['qualification'] != null ? json_decode($company['qualification'], true) : '';
            $company['company_type_name'] = Db::name('dict_data')->where('id', $company['company_type'])->value('name');
        })->toArray();
        return $this->success('', ['count' => $count, 'data' => $companies]);
    }

    public function view()
    {
        $id = $this->request->param('id', 0);
        if (empty($id)) {
            $admin = Admin::findOrEmpty($this->userInfo['admin_id']);
            $query = Company::find($admin['company_id']);
        } else {
            $query = Company::find($id);
        }
        $company = $query->append(['province_name', 'city_name', 'area_name', 'street_name', 'area_manager_name'])->toArray();
        $company['other_contacts'] = json_decode($company['other_contacts'], true);
        $company['qualification'] = $company['qualification'] != null ? json_decode($company['qualification'], true) : '';
        $contract = Contract::find($company['contract_id']);
        if (!empty($contract)) {
            if ($contract['admin_id'] != 0) {
                $contract['party_b_name'] = Admin::where('id', $contract['admin_id'])->value('name');
            } else {
                $contract['party_b_name'] = Db::name('company')->where('id', $contract['party_b'])->value('company_name');
            }
            $contract['party_a_name'] = Db::name('company')->where('id', $contract['party_a'])->value('company_name');

            $contract['contract_type_name'] = Db::name('dict_data')->where('id', $contract['contract_type'])->value('name');
        }
        $company['company_type_name'] = Db::name('dict_data')->where('id', $company['company_type'])->value('name');
        $users = Admin::where('company_id', $company['id'])->field('id,name,account,phone,qualification')->select()->toArray();
        foreach ($users as &$user) {
            $user['is_main'] = $user['id'] == $company['admin_id'] ? 1 : 0;
            $user['qualification'] = $user['qualification'] != null ? json_decode($user['qualification'], true) : [];
            unset($user['role_id'], $user['dept_id'], $user['jobs_id'], $user['id']);
        }
        return $this->success('success', ['contract' => $contract ?? [], 'company' => $company, 'users' => $users]);
    }

    public function areaManager()
    {
        [$page, $limit] = $this->getPage();
        $admin = Admin::find($this->userInfo['admin_id']);
        $company = Company::find($admin['company_id']);
        $query = Admin::where('id', $company['area_manager']);
        $count = $query->count();
        $data = $query->page($page)->limit($limit)->append(['province_name', 'city_name', 'area_name', 'street_name'])->field('id,name,account,avatar,province,city,area,street')->select()->toArray();
        return $this->success('success', ['count' => $count, 'data' => $data]);
    }

    public function users()
    {
        [$page, $limit] = $this->getPage();
        $companyId = $this->request->param('company_id', 0);
        $query = User::where('company_id', $companyId);
        $count = $query->count();
        $users = $query->page($page)->limit($limit)->with(['company' => function ($query) {
            $query->field('id,company_name');
        }])->append(['province_name', 'city_name', 'area_name', 'street_name'])->field('id,avatar,real_name,account,mobile as phone,province,city,area,street,company_id,qualification,nickname,is_contract')->select()->each(function($item,$key){
            if($item['qualification']!=''){
                $item['qualification']=json_decode($item['qualification'],true);
            }
        });
        return $this->success('success', ['count' => $count, 'data' => $users]);
    }

    public function user($id)
    {
        $query = Admin::where('id', $id);
        $user = $query->with(['company' => function ($query) {
            $query->field('id,company_name');
        }])->append(['province_name', 'city_name', 'area_name', 'street_name'])->field('id,sex,avatar,name,account,phone,id_card,qualification,province,city,area,street,is_contract,company_id')->find()->toArray();
        $contract = Contract::whereRaw("(type=1 and party_b={$user['company_id']}) or (type=2 and party_b={$user['id']})")->append(['contract_type_name'])->find();
        $user['contract'] = $contract;
        $roleIds = AdminRole::where('admin_id', $user['id'])->column('role_id');
        $user['roles'] = SystemRole::whereIn('id', $roleIds)->column('name');
        $user['qualification'] = $user['qualification'] != null ? json_decode($user['qualification'], true) : [];
        unset($user['role_id'], $user['dept_id'], $user['jobs_id']);
        return $this->success('success', $user);
    }

}