-- Deploy camper:parse_price to pg
-- requires: roles
-- requires: schema_camper

begin;

set search_path to camper, public;

create or replace function parse_price(price text, decimal_digits integer default 2) returns integer as
$$
declare
	parts text[];
	result int;
	frac_part text;
	sign int := 1;
begin
	if price like '-%' Then
		sign := -1;
		price := substring(price from 2);
	end if;

	parts := string_to_array(price, '.');
	if array_length(parts, 1) > 2 then
		raise invalid_parameter_value using message = price || ' is not a valid price representation.';	
	end if;

	result := parts[1]::integer;
	if result is null then
		raise invalid_parameter_value using message = price || ' is not a valid price representation.';
	end if;
	for d in 1..decimal_digits loop
		result := result * 10;
	end loop;

	if array_length(parts, 1) = 2 then
		frac_part := rtrim(parts[2], '0');
		if length(frac_part) > decimal_digits then
			raise invalid_parameter_value using message = price || ' has too many digits in the fraction part.';	
		end if;
		frac_part := rpad(frac_part, decimal_digits, '0');
		result := result + frac_part::integer;
	end if;

	return sign * result;
end;
$$
language plpgsql
immutable;

comment on function parse_price(text, integer) is
'Converts the string representation of a price in decimal form to cents, according to the number of decimal digits passed.';

revoke execute on function parse_price(text, integer) from public;
grant execute on function parse_price(text, integer) to guest;
grant execute on function parse_price(text, integer) to employee;
grant execute on function parse_price(text, integer) to admin;

commit;
