<?php

require_once __DIR__ . '/../config/config.php';
require_once __DIR__ . '/../models/SenderIdRequest.php';
require_once __DIR__ . '/../utilities/Validator.php';
require_once __DIR__ . '/../utilities/Logger.php';

/**
 * SenderIdController handles all sender ID API endpoints
 */
class SenderIdController {
    /**
     * Create a new sender ID request
     * 
     * @param array $data Request data
     * @param string $clientId API client ID
     * @param string $clientIp Client IP address
     * @return array Response data
     */
    public function create($data, $clientId, $clientIp) {
        // Validate required fields
        $validator = new Validator();
        $requiredFields = ['sender_id', 'user_name', 'password', 'IP'];
        
        if (!$validator->validateRequiredFields($data, $requiredFields)) {
            return [
                'success' => false,
                'error' => [
                    'message' => 'Missing required fields',
                    'code' => 'MISSING_FIELDS',
                    'details' => $validator->getErrors()
                ]
            ];
        }
        
        // Validate sender ID format
        if (!$validator->validateSenderId($data['sender_id'])) {
            return [
                'success' => false,
                'error' => [
                    'message' => $validator->getFirstError(),
                    'code' => 'INVALID_SENDER_ID'
                ]
            ];
        }
        
        // Create the sender ID request
        return SenderIdRequest::create(
            $clientId,
            $data['sender_id'],
            $data['user_name'],
            $data['password'],
            $data['IP'] ?? $clientIp
        );
    }
    
    /**
     * Get a sender ID request by request ID
     * 
     * @param string $requestId Request ID
     * @param string $clientId API client ID
     * @return array Response data
     */
    public function getByRequestId($requestId, $clientId) {
        // Validate request ID format
        $validator = new Validator();
        if (!$validator->validateRequestId($requestId)) {
            return [
                'success' => false,
                'error' => [
                    'message' => 'Invalid request ID format',
                    'code' => 'INVALID_REQUEST_ID'
                ]
            ];
        }
        
        // Get the sender ID request
        return SenderIdRequest::getByRequestId($clientId, $requestId);
    }
    
    /**
     * Get sender ID requests by sender ID
     * 
     * @param string $senderId Sender ID text
     * @param string $clientId API client ID
     * @return array Response data
     */
    public function getBySenderId($senderId, $clientId) {
        // Validate sender ID format
        $validator = new Validator();
        if (!$validator->validateSenderId($senderId)) {
            return [
                'success' => false,
                'error' => [
                    'message' => $validator->getFirstError(),
                    'code' => 'INVALID_SENDER_ID'
                ]
            ];
        }
        
        // Get the sender ID requests
        return SenderIdRequest::getBySenderId($clientId, $senderId);
    }
    
    /**
     * Get all sender ID requests with pagination and filtering
     * 
     * @param array $params Query parameters
     * @param string $clientId API client ID
     * @return array Response data
     */
    public function getAll($params, $clientId) {
        // Parse and validate pagination parameters
        $page = isset($params['page']) ? (int) $params['page'] : 1;
        $limit = isset($params['limit']) ? (int) $params['limit'] : 20;
        
        $validator = new Validator();
        if (!$validator->validatePagination($page, $limit)) {
            return [
                'success' => false,
                'error' => [
                    'message' => 'Invalid pagination parameters',
                    'code' => 'INVALID_PAGINATION',
                    'details' => $validator->getErrors()
                ]
            ];
        }
        
        // Process date filters
        $filters = [];
        
        // Status filter
        if (isset($params['status'])) {
            $filters['status'] = $params['status'];
        }
        
        // Date filters
        if (isset($params['date_from'])) {
            if (!$validator->validateDate($params['date_from'], 'date_from')) {
                return [
                    'success' => false,
                    'error' => [
                        'message' => 'Invalid date format for date_from',
                        'code' => 'INVALID_DATE_FORMAT'
                    ]
                ];
            }
            $filters['date_from'] = $params['date_from'];
        }
        
        if (isset($params['date_to'])) {
            if (!$validator->validateDate($params['date_to'], 'date_to')) {
                return [
                    'success' => false,
                    'error' => [
                        'message' => 'Invalid date format for date_to',
                        'code' => 'INVALID_DATE_FORMAT'
                    ]
                ];
            }
            $filters['date_to'] = $params['date_to'];
        }
        
        // Get all sender ID requests
        return SenderIdRequest::getAll($clientId, $filters, $page, $limit);
    }
} 