<?php

namespace App\Modules\Company\Account;
use App\Models\Company as CompanyModel;
use App\Models\Worker;
use App\Models\CompanySubscriptionPayments;
use App\Models\CompanySubscriptionRates;
use App\Models\CompanyExpertise;

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

use App\Traits\GenerateCodeTraits;
use App\Traits\MobileNumberValidatorTraits;
use App\Traits\SendSMSTraits;
use App\Traits\ValidatorTraits;
use App\Traits\CreateUserActionTraits;

use  App\Http\Resources\Company\CompanyProfile as ProfileResource;

class Company
{
    use ValidatorTraits, MobileNumberValidatorTraits, SendSMSTraits, GenerateCodeTraits, CreateUserActionTraits;

    public function getCompanyDetails(){
        $companyDetails = CompanyModel::select(
            'companies.*',
            'workers.id as user_id',
            'workers.first_name',
            'workers.last_name',
            'workers.phone_num',
            'workers.email_address as user_email',
            'workers.profile_picture as profile_picture',
        )
            ->with('company_expertises')
            ->leftJoin('company_users', 'company_users.company_id', '=', 'companies.id')
            ->leftJoin('workers', 'workers.id', '=', 'company_users.worker_id')
            ->where('workers.id', Auth::user()->id)
            ->first();

        return array(
            'company_detail' => $companyDetails,
            'user' => $this->fetchProfileDetails(Auth::user()->id),
            'billing_info' => [],
        );
    }
    
    public function fetchProfileDetails($userId){
        $userData = ProfileResource::collection(
            Worker::select(
                'workers.id as user_id',
                'workers.email_address as user_email',
                'workers.first_name',
                'workers.last_name',
                'workers.phone_num',
                'workers.profile_picture as profile_picture',
            )   
                ->where('workers.id', $userId)
                ->get()
        );

        return $userData[0];
    }

    public function getMonthlyBillingDetails($payload){
        $companyDiscount = CompanyModel::select('discount')->where('id', $payload->companyID)->first();
        
        return [
            'latestPayment' => CompanySubscriptionPayments::where('company_id', $payload->companyID)->latest()->first(),
            'subscribedSubscriptionDetails' => CompanySubscriptionRates::where('id', $payload->subscriptionRateID)->first(),
            'hasCompanyDiscount' => $companyDiscount->discount > 0 ? $companyDiscount->discount : false,
        ];
    }


    public function update($payload, $id)
    {
        $validate = $this->validatePhoneNumber($payload->phone_num);
        if ($validate) {
            return $validate;
        }

        DB::beginTransaction();

        $rules = array(
            'name' => 'required|max:100',
            'company_email' => 'required|email:rfc,dns|max:191|unique:companies,email_address,' . $id,
            'phone_num' => 'required',
            'tel_num' => 'min:0|max:50',
            'contact_person' => 'required|max:100',
            'contact_person_no' => 'required|min:6|max:50',
            'street' => 'required|max:100',
            'city' => 'required|max:50',
            'state' => 'required|max:50',
            'zipcode' => 'required|string|min:5|max:5',
            'overheadType' => 'required',
            'overheadAmount' => 'required',
            'expertises' => 'required',
        );
        $validate = $this->validateRequest($payload, $rules);
        if ($validate) {
            return $validate;
        }

        /*========================================================================================================
        update company data to usecompanies table
        ========================================================================================================*/
        $company_data = CompanyModel::where('id', $id)->first();
        $company_data->name = ucwords($payload->name);
        $company_data->email_address = strtolower($payload->company_email);
        $company_data->company_tel = $this->databaseFormatNumber($payload->phone_num);
        $company_data->company_tel2 = $payload->tel_num? $this->databaseFormatNumber($payload->tel_num): "None";
        $company_data->contact_person_name = ucwords($payload->contact_person);
        $company_data->contact_person_no = "+1" . str_replace(array('-', '(', ')', ' '), '', $payload->contact_person_no);
        $company_data->street_address = $payload->street;
        $company_data->city = $payload->city;
        $company_data->state = $payload->state;
        $company_data->zipcode = $payload->zipcode;
        $company_data->overhead_charge = $payload->overheadAmount;
        $company_data->overhead_type = $payload->overheadType;


        //Updating expertises of a company
        $expertises = $payload->expertises;
        $expertiseData = [];

        CompanyExpertise::where('company_id', '=', $company_data->id)->delete();

        foreach($expertises as $expertise){
            $companyExpertise = array(
                'expertise_id' => $expertise,
                'company_id' => $company_data->id,
            );
            CompanyExpertise::create($companyExpertise);
        }

        $transactionChecker = $company_data->isDirty();
        $company_transaction = $company_data->save();

        /*==============================
        SAVE USER LOGS IF DATE UPDATE IS MADE
        ==============================*/
        if ($transactionChecker) {
            $this->createUserAction("Updated the company information");
        }

        if (!$company_transaction) {
            DB::rollBack();
            return response()->json(['error' => 'Server error.']);
        } else {
            DB::commit();
            return response()->json(['success' => 'Data updated successfully.'])->setStatusCode(201);
        }
    }

    
}