<?php

namespace Webkul\UVDesk\AutomationBundle\Services;

use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RequestStack;
use Webkul\UVDesk\AutomationBundle\Workflow\FunctionalGroup;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Doctrine\DBAL\Connection;
use Webkul\UVDesk\CoreFrameworkBundle\Entity\Ticket;
use UVDesk\CommunityPackages\UVDesk\CustomFields\Entity\CustomFields;
use UVDesk\CommunityPackages\UVDesk\CustomFields\Entity\CustomFieldsValues;
use Webkul\UVDesk\CommunityPackages\UVDesk\CustomFields\Entity;
use Webkul\UVDesk\CommunityPackages\UVDesk\CustomFields\Entity as CommunityPackageEntities;
use Webkul\UVDesk\AutomationBundle\Entity\Workflow;
use Doctrine\Persistence\ManagerRegistry;
use UVDesk\CommunityPackages\UVDesk\CustomFields\Services\CustomFieldsService;
use Webkul\UVDesk\CoreFrameworkBundle\Entity as CoreFrameworkBundleEntities;

class AutomationService 
{
	private $container;
	private $requestStack;
    private $entityManager;

	public function __construct(ContainerInterface $container, RequestStack $requestStack, EntityManagerInterface $entityManager, TranslatorInterface $translator)
	{
		$this->container = $container;
		$this->requestStack = $requestStack;
        $this->entityManager = $entityManager;
        $this->translator = $translator;
    }

    public function getWorkflowEvents()
    {
        return [
            FunctionalGroup::USER => $this->translator->trans('User'),
            FunctionalGroup::AGENT => $this->translator->trans('Agent'),
            FunctionalGroup::CUSTOMER => $this->translator->trans('Customer'),
            FunctionalGroup::TICKET => $this->translator->trans('Ticket'),
        ];
    }

    public function getWorkflowEventValues()
    {
        $ticketEventCollection = [];

        foreach ($this->container->get('uvdesk.automations.workflows')->getRegisteredWorkflowEvents() as $workflowDefinition) {
            $functionalGroup = $workflowDefinition->getFunctionalGroup();

            if (!isset($ticketEventCollection[$functionalGroup])) {
                $ticketEventCollection[$functionalGroup] = [];
            }

            $ticketEventCollection[$functionalGroup][$workflowDefinition->getId()] = $this->translator->trans($workflowDefinition->getDescription());
        }

        return $ticketEventCollection;
    }

    public function getWorkflowConditions()
    {

        // Get Entity Manager
        //$entityManager = $this->getDoctrine()->getManager();

        // Fetch custom fields from the table where decider = 1
        $Workcustoms = $this->entityManager->getRepository(CustomFields::class)->findBy(['decider' => 1]);
            
        $conditions = [
            'ticket' => [
                'mail' => [
                    [
                        'lable' => $this->translator->trans('From Email'),
                        'value' => 'from_mail',
                        'match' => 'email'
                    ],
                    [
                        'lable' => $this->translator->trans('To Email'),
                        'value' => 'to_mail',
                        'match' => 'email'
                    ],
                ],
                'ticket' => [
                    [
                        'lable' => $this->translator->trans('Subject'),
                        'value' => 'subject',
                        'match' => 'string'
                    ],
                    [
                        'lable' => $this->translator->trans('Description'),
                        'value' => 'description',
                        'match' => 'string'
                    ],
                    [
                        'lable' => $this->translator->trans('Subject or Description'),
                        'value' => 'subject_or_description',
                        'match' => 'string'
                    ],
                    [
                        'lable' => $this->translator->trans('Priority'),
                        'value' => 'TicketPriority',
                        'match' => 'select'
                    ],
                    [
                        'lable' => $this->translator->trans('Type'),
                        'value' => 'TicketType',
                        'match' => 'select'
                    ],
                    [
                        'lable' => $this->translator->trans('Status'),
                        'value' => 'TicketStatus',
                        'match' => 'select'
                    ],
                    [
                        'lable' => $this->translator->trans('Source'),
                        'value' => 'source',
                        'match' => 'select'
                    ],
                    [
                        'lable' => $this->translator->trans('Created'),
                        'value' => 'created',
                        'match' => 'date'
                    ],
                    [
                        'lable' => $this->translator->trans('Agent'),
                        'value' => 'agent',
                        'match' => 'select'
                    ],
                    [
                        'lable' => $this->translator->trans('Group'),
                        'value' => 'group',
                        'match' => 'select'
                    ],
                    [
                        'lable' => $this->translator->trans('Customfields'),
                        'value' => 'customfields',
                        'match' => 'select'
                    ],
                    [
                        'lable' => $this->translator->trans('Team'),
                        'value' => 'team',
                        'match' => 'select'
                    ],
                ],
                'customer' => [
                    [
                        'lable' => $this->translator->trans('Customer Name'),
                        'value' => 'customer_name',
                        'match' => 'string'
                    ],
                    [
                        'lable' => $this->translator->trans('Customer Email'),
                        'value' => 'customer_email',
                        'match' => 'email'
                    ],
                ],
            ],
        ];
        
        // -----------------------------------------------------------------------
        // 1) Build the customFieldConditions array
        // -----------------------------------------------------------------------
        $customFieldConditions = [];
        foreach ($Workcustoms as $field) {
            $customFieldConditions[] = [
                'type'  => 'hidden',
                'lable' => $this->translator->trans($field->getName()),
                'value' => 'custom_field_' . $field->getId(),
                'match' => 'string',
            ];
        }

        // // -----------------------------------------------------------------------
        // // 2) Merge the customFieldConditions into the ticket array
        // // -----------------------------------------------------------------------
        // // This will append all custom-field conditions to the existing array
        // $conditions['ticket']['ticket'] = array_merge(
        //     $conditions['ticket']['ticket'],
        //     $customFieldConditions
        // );

        $conditions['ticket']['Customfields'] = $customFieldConditions;

        return $conditions;
    }

    public function getWorkflowMatchConditions()
    {
        return [
            'email' => [
                [
                    'lable' => $this->translator->trans('Is Equal To'),
                    'value' => 'is'
                ],
                [
                    'lable' => $this->translator->trans('Is Not Equal To'),
                    'value' => 'isNot'
                ],
                [
                    'lable' => $this->translator->trans('Contains'),
                    'value' => 'contains'
                ],
                [
                    'lable' => $this->translator->trans('Does Not Contain'),
                    'value' => 'notContains'
                ],
            ],
            'string' => [
                [
                    'lable' => $this->translator->trans('Is Equal To'),
                    'value' => 'is'
                ],
                [
                    'lable' => $this->translator->trans('Is Not Equal To'),
                    'value' => 'isNot'
                ],
                [
                    'lable' => $this->translator->trans('Contains'),
                    'value' => 'contains'
                ],
                [
                    'lable' => $this->translator->trans('Does Not Contain'),
                    'value' => 'notContains'
                ],
                [
                    'lable' => $this->translator->trans('Starts With'),
                    'value' => 'startWith'
                ],
                [
                    'lable' => $this->translator->trans('Ends With'),
                    'value' => 'endWith'
                ],
            ],
            'select' => [
                [
                    'lable' => $this->translator->trans('Is Equal To'),
                    'value' => 'is'
                ],
                [
                    'lable' => $this->translator->trans('Is Not Equal To'),
                    'value' => 'isNot'
                ],
            ],
            'date' => [
                [
                    'lable' => $this->translator->trans('Before'),
                    'value' => 'before'
                ],
                [
                    'lable' => $this->translator->trans('Before On'),
                    'value' => 'beforeOn'
                ],
                [
                    'lable' => $this->translator->trans('After'),
                    'value' => 'after'
                ],
                [
                    'lable' => $this->translator->trans('After On'),
                    'value' => 'afterOn'
                ],
            ],
            'datetime' => [
                [
                    'lable' => $this->translator->trans('Before'),
                    'value' => 'beforeDateTime'
                ],
                [
                    'lable' => $this->translator->trans('Before On'),
                    'value' => 'beforeDateTimeOn'
                ],
                [
                    'lable' => $this->translator->trans('After'),
                    'value' => 'afterDateTime'
                ],
                [
                    'lable' => $this->translator->trans('After On'),
                    'value' => 'afterDateTimeOn'
                ],
            ],
            'time' => [
                [
                    'lable' => $this->translator->trans('Before'),
                    'value' => 'beforeTime'
                ],
                [
                    'lable' => $this->translator->trans('Before On'),
                    'value' => 'beforeTimeOn'
                ],
                [
                    'lable' => $this->translator->trans('After'),
                    'value' => 'afterTime'
                ],
                [
                    'lable' => $this->translator->trans('After On'),
                    'value' => 'afterTimeOn'
                ],
            ],
            'number' => [
                [
                    'lable' => $this->translator->trans('Is Equal To'),
                    'value' => 'is'
                ],
                [
                    'lable' => $this->translator->trans('Is Not Equal To'),
                    'value' => 'isNot'
                ],
                [
                    'lable' => $this->translator->trans('Contains'),
                    'value' => 'contains'
                ],
                [
                    'lable' => $this->translator->trans('Greater Than'),
                    'value' => 'greaterThan'
                ],
                [
                    'lable' => $this->translator->trans('Less Than'),
                    'value' => 'lessThan'
                ],
            ],
        ];
    }

    public function getWorkflowActions($force = false)
    {
        $workflowActions = [];
        
        // @TODO: Add minimum required access levels to workflow actions to restrict usage
        foreach ($this->container->get('uvdesk.automations.workflows')->getRegisteredWorkflowActions() as $workflowDefinition) {
            $functionalGroup = $workflowDefinition->getFunctionalGroup();

            if (!isset($workflowActions[$functionalGroup])) {
                $workflowActions[$functionalGroup] = [];
            }

            $workflowActions[$functionalGroup][$workflowDefinition->getId()] = $this->translator->trans($workflowDefinition->getDescription());
        }

        return $workflowActions;
    }

    public function getPreparedResponseActions($force = false)
    {
        $preparedResponseActions = [];

        // @TODO: Add minimum required access levels to prepared response actions to restrict usage
        foreach ($this->container->get('uvdesk.automations.prepared_responses')->getRegisteredPreparedResponseActions() as $preparedResponseDefinition) {
            $functionalGroup = $preparedResponseDefinition->getFunctionalGroup();

            if (!isset($preparedResponseActions[$functionalGroup])) {
                $preparedResponseActions[$functionalGroup] = [];
            }

            $preparedResponseActions[$functionalGroup][$preparedResponseDefinition->getId()] = $this->translator->trans($preparedResponseDefinition->getDescription());
        }

        return $preparedResponseActions;
    }
}
