module src.SupplierInfoExplicit;

type <xsd> "UserName" from "AUTH.xsd" as username;
type <xsd> "Password" from "AUTH.xsd" as password;
type <xsd> "UUID" from "AUTH.xsd" as uuid;
type <xsd> "/retailhub/supplierdetails" from "Retailer.xsd" as supplierdetails;
type <xsd> "/retailhub/contractdetails" from "Retailer.xsd" as contractdetails;

type <xsd> "..." from "...xsd" as usercontext;
type <xsd> "..." from "...xsd" as filters;


explicit global protocol PartnershipSupplier(
		role loginsvc,
		role requestor,
		role authorisersvc,
		role filtersvc,
		role suppliersvc,
		role contractsvc)
{
	connect requestor to loginsvc;
	login(username, password) from requestor to loginsvc;
	choice at loginsvc
	{
		loginfailure() from loginsvc to requestor;
		disconnect requestor and loginsvc;
	}
	or
	{
		loginsuccess() from loginsvc to requestor;
		connect requestor to authorisersvc;
		connect authorisersvc to filtersvc;
		connect authorisersvc to suppliersvc;
		connect authorisersvc to contractsvc;
		do Main(requestor, authorisersvc, filtersvc, suppliersvc, contractsvc);
	}
}


aux global protocol Main(
		role requestor,
		role authorisersvc,
		role filtersvc,
		role suppliersvc,
		role contractsvc)
{
	choice at requestor
	{
		// GET SUPPLIER INFO
		getsuppliers(uuid) from requestor to authorisersvc;
		choice at authorisersvc
		{
			// DENIED
			deny() from authorisersvc to requestor;
		}
		or
		{
			// PREPARE FILTERED SUPPLIER INFO FOR REQUESTOR
			getsuppliers() from authorisersvc to suppliersvc;
			do FilterInfo
					<filterSupplier(usercontext, filters, supplierdetails)>
					(authorisersvc, filtersvc);
			suppliers() from suppliersvc to authorisersvc;
			suppliers() from authorisersvc to requestor;
		}
	}
	or
	{
		// GET CONTRACT INFO
		getcontracts() from requestor to authorisersvc;
		choice at authorisersvc
		{
			// DENIED
			deny() from authorisersvc to requestor;
		}
		or
		{
			// PREPARE FILTERED SUPPLIER INFO FOR REQUESTOR
			getcontracts() from authorisersvc to contractsvc;
			suppliers() from contractsvc to authorisersvc;
			do FilterInfo
					<filterContract(usercontext, filters, contractdetails)>
					(authorisersvc, filtersvc);
			contracts() from authorisersvc to requestor;
		}
	}

	do Main(requestor, authorisersvc, filtersvc, suppliersvc, contractsvc);
}


aux global protocol FilterInfo<sig Query>(
		role authorisersvc,
		role filtersvc)
{
	Query from authorisersvc to filtersvc;
	filtered() from filtersvc to authorisersvc;
}

