<?php

namespace Microsoft\Graph;

use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;

if (!class_exists('Microsoft\Graph\Graph')) {
    class Graph
    {
        private $accessToken = '';

        public function setAccessToken($accessToken)
        {
            $this->accessToken = $accessToken;
            return $this;
        }

        public function createRequest($requestType, $requestUrl)
        {
            return new GraphRequest($requestType, $requestUrl, $this->accessToken);
        }
    }

    class GraphRequest
    {
        private $requestType;
        private $requestUrl;
        private $accessToken;
        private $returnType = null;

        public function __construct($requestType, $requestUrl, $accessToken)
        {
            $this->requestType = strtoupper($requestType);
            $this->requestUrl = ltrim($requestUrl, '/');
            $this->accessToken = $accessToken;
        }

        public function setReturnType($returnType)
        {
            $this->returnType = $returnType;
            return $this;
        }

        public function execute()
        {
            $url = 'https://graph.microsoft.com/v1.0/' . $this->requestUrl;

            try {
                $response = Http::withToken($this->accessToken)
                    ->acceptJson()
                    ->timeout(15)
                    ->send($this->requestType, $url);

                $data = $response->json() ?? [];

                if (!$response->successful()) {
                    Log::error('Microsoft Graph API request failed', [
                        'url' => $url,
                        'status' => $response->status(),
                        'response' => $response->body()
                    ]);
                }
            } catch (\Throwable $e) {
                Log::error('Microsoft Graph API Exception: ' . $e->getMessage(), [
                    'url' => $url
                ]);
                $data = [];
            }

            if ($this->returnType && class_exists($this->returnType)) {
                return new $this->returnType($data);
            }

            return new \Microsoft\Graph\Model\User($data);
        }
    }
}

namespace Microsoft\Graph\Model;

if (!class_exists('Microsoft\Graph\Model\MailboxSettings')) {
    class MailboxSettings
    {
        private $data;

        public function __construct(array $data = [])
        {
            $this->data = $data;
        }

        public function getTimeZone()
        {
            return $this->data['timeZone'] ?? 'UTC';
        }
    }
}

if (!class_exists('Microsoft\Graph\Model\User')) {
    class User
    {
        public $_propDict = [];
        public $id;

        public function __construct(array $data = [])
        {
            $this->_propDict = $data;
            $this->id = $data['id'] ?? null;
        }

        public function getDisplayName()
        {
            return $this->_propDict['displayName'] ?? '';
        }

        public function getMail()
        {
            return $this->_propDict['mail'] ?? ($this->_propDict['userPrincipalName'] ?? null);
        }

        public function getUserPrincipalName()
        {
            return $this->_propDict['userPrincipalName'] ?? '';
        }

        public function getMailboxSettings()
        {
            return new MailboxSettings($this->_propDict['mailboxSettings'] ?? []);
        }

        public function getMailNickname()
        {
            return $this->_propDict['mailNickname'] ?? '';
        }

        public function getPhoto()
        {
            return $this->_propDict['photo'] ?? null;
        }

        public function getId()
        {
            return $this->id;
        }
    }
}
