/*
    Flexisip, a flexible SIP proxy server with media capabilities.
    Copyright (C) 2010-2025 Belledonne Communications SARL, All rights reserved.

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#pragma once

#include <list>
#include <memory>
#include <string>

#include "registrar/extended-contact.hh"
#include "sofia-sip/sip.h"

namespace flexisip {

struct ForkDestination {
	std::string targetUris;
	sip_contact_t* sipContact;
	std::shared_ptr<ExtendedContact> extendedContact;
};

class ForkGroupSorter {
public:
	using ForkContacts = std::list<std::pair<sip_contact_t*, std::shared_ptr<ExtendedContact>>>;

	ForkGroupSorter(const std::list<std::pair<sip_contact_t*, std::shared_ptr<ExtendedContact>>>& usable_contacts)
	    : mAllContacts(usable_contacts){};

	void makeGroups();
	void makeDestinations();
	const std::list<ForkDestination>& getDestinations() const;

private:
	static constexpr std::string_view mLogPrefix{"ForkGroupSorter"};

	ForkContacts::iterator findDestination(const url_t* url);

	ForkContacts mAllContacts;
	std::list<ForkDestination> mDestinations;
};

} // namespace flexisip