<?php

namespace App\Packages\Core\Models;

use App\Packages\Core\Repository\AddressRepository;
use App\Packages\Core\Traits\RepositoryTrait;
use App\Packages\User\Models\User;
use App\Services\GoogleMaps\GoogleGeoService;
use App\Services\GoogleMaps\Unit\GoogleAddressUnit;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Ramsey\Uuid\Uuid;

/**
 * Class Address
 *
 * @package App\Packages\Core\Models
 *
 * @property int $id
 * @property string $uuid
 * @property string $user_input
 * @property string $city
 * @property string $country_title
 * @property string $country_code
 * @property string $street_title
 * @property string $street_number
 * @property string $full_string
 * @property string $lat
 * @property string $lng
 * @property string $google_place_id
 * @property string $migrated
 *
 * @property string $created_at
 * @property string $updated_at
 * @property string $deleted_at
 *
 * @property string $title
 */
class Address extends Model
{
	use SoftDeletes;
	use RepositoryTrait;

	/** @var string */
	public static $repositoryClass = AddressRepository::class;

	/** @var string */
	protected $table = 'table_address';

	protected $dates = [
		'deleted_at',
	];

	/**
	 * @param $addressString
	 *
	 * @return Address
	 */
	public static function createFullAddress($addressString)
	{
	    /** @var GoogleGeoService $googleGeoService */
		$googleGeoService = app(GoogleGeoService::class);
		$decodedAddress = $googleGeoService->getDecodedAddressUnit($addressString);

		return static::createFromGoogle($decodedAddress, $addressString);
	}

    /**
     * @param User $user
     * @param string $placeId
     *
     * @return Address
     */
    public static function createFullAddressFromPlace(User $user, $placeId)
    {
        /** @var GoogleGeoService $googleGeoService */
        $googleGeoService = app(GoogleGeoService::class);
        $decodedAddress = $googleGeoService->getPlaceDetails($user, $placeId);

        return static::createFromGoogle($decodedAddress, $decodedAddress->name);
    }


	/**
	 * @param GoogleAddressUnit $addressUnit
	 * @param string $userInput
	 *
	 * @return Address
	 */
	public static function createFromGoogle(GoogleAddressUnit $addressUnit, $userInput)
	{
		$address = new Address();
		$address->uuid = Uuid::uuid4();
		$address->user_input = $userInput;
		$address->city = $addressUnit->city;
		$address->country_title = $addressUnit->countryTitle;
		$address->country_code = $addressUnit->countryCode;
		$address->street_title = $addressUnit->streetTitle;
		$address->street_number = $addressUnit->streetNumber;
		$address->full_string = $addressUnit->fullAddress;
		$address->lat = $addressUnit->latitude;
		$address->lng = $addressUnit->longitude;
		$address->google_place_id = $addressUnit->googlePlaceId;
		$address->save();

		return $address;
	}

	/**
	 * @return string
	 */
	public function getTitleAttribute()
	{
		return $this->city && $this->street_title && $this->street_number
			? $this->concatAddress()
			: $this->user_input;
	}

	public function concatAddress()
	{
		return $this->city . ", " . $this->street_title . " " . $this->street_number;
	}
}