-- login a user to a phone, returns the previous phone
-- If this user is logged in on another phone, log him out, if possible.
-- If someone else is logged in to this phone (or the phone paired with it), log him out, if possible.
-- loginuser(phone, user)
CREATE OR REPLACE FUNCTION loginuser(integer, integer) RETURNS integer AS '
  DECLARE
    prevphone integer;
    pw integer;
    comp integer; -- company
    need_lic_check varchar; -- need license checking?
    _lic_per_company varchar; -- count per company licences?
    _lic_used integer; -- current amount of used licenses
    _licenses integer; -- assigned amount of used licenses
    curuser integer; -- current logged in user on this phone
    _canlogout varchar;
  BEGIN
    IF $1 <= 1 OR $2 <= 1 THEN
      RAISE NOTICE ''ERROR: invalid arguments to loginuser'';
      RETURN ''0'';
    END IF;

    need_lic_check := ''yes'';

    -- get the previous phone this user was logged in to
    SELECT INTO prevphone, _canlogout phone, canlogout FROM contact WHERE id = $2;

    IF prevphone = $1 THEN
      RAISE NOTICE ''user % already logged in on %'', $2, $1;
      RETURN prevphone;
    END IF;

    -- get id of phone, this phone is paired with
    SELECT INTO pw pairedwith FROM phone WHERE id = $1;
    IF pw > 1 AND prevphone = pw THEN
      RAISE NOTICE ''user % already logged in on %'', $2, pw;
      RETURN prevphone;
    END IF;

    IF prevphone > 1 AND _canlogout <> ''yes'' THEN
      RAISE NOTICE ''% logged in on another phone and cannot logout'', $2;
      RETURN ''0'';
    END IF;

    -- Is anyone else logged into this phone?
    SELECT INTO curuser, _canlogout id, canlogout FROM contact WHERE phone = $1 AND status <> ''deleted'';
    IF FOUND AND curuser > 1 THEN
      IF _canlogout <> ''yes'' THEN
        RAISE NOTICE ''% logged in on this phone % and cannot logout'', curuser, $1;
        RETURN ''0'';
      END IF;

      PERFORM logoutuser($1);
      need_lic_check := ''no'';
    END IF;

    -- Is anyone else logged into the paired phone?
    IF pw > 1 THEN
      SELECT INTO curuser, _canlogout id, canlogout FROM contact WHERE phone = pw AND status <> ''deleted'';
      IF FOUND AND curuser > 1 THEN
        IF _canlogout <> ''yes'' THEN
          RAISE NOTICE ''% logged in on phone % and cannot logout'', curuser, pw;
          RETURN ''0'';
        END IF;

        PERFORM logoutuser(pw);
        need_lic_check := ''no'';
      END IF;
    END IF;

    -- if switching to another phone, logout of the previous phone
    IF prevphone <> 1 THEN
      PERFORM logoutuser(prevphone);
      need_lic_check := ''no'';
    END IF;

    -- check license count
    SELECT INTO comp company FROM contact WHERE id = $2;
    IF need_lic_check = ''yes'' THEN
      SELECT INTO _lic_per_company value FROM astglobals WHERE name = ''lic_per_company'';
      -- are licenses set per company?
      IF _lic_per_company = ''yes'' THEN
        RAISE NOTICE ''licenses set per company'';
        SELECT INTO _licenses licenses FROM company where id = comp;
        SELECT INTO _lic_used count(*) as count FROM contact LEFT JOIN phone ON phone.id = contact.phone
          WHERE contact.phone > 1 AND contact.status != ''deleted'' AND phone.phonetype != 160 AND contact.company = comp;
        RAISE NOTICE ''used = %, max = %'', _lic_used, _licenses;
        IF _lic_used >= _licenses THEN
          RAISE NOTICE ''% cannot login: max licenses for company % = %'', $2, comp, _licenses;
          RETURN ''-1'';
        END IF;
      END IF;
      SELECT INTO _licenses value FROM astglobals WHERE name = ''licusers'';
      SELECT INTO _lic_used count(*) as count FROM contact LEFT JOIN phone on phone.id = contact.phone 
        WHERE contact.phone > 1 and contact.status != ''deleted'' and phone.phonetype != 160;
      IF _lic_used >= _licenses THEN
        RAISE NOTICE ''% cannot login: max licenses for system = %'', $2, _licenses;
        RETURN ''-1'';
      END IF;
    END IF;

    INSERT INTO contacthist (contact, stamp, event, parm1) VALUES
      ($2, CURRENT_TIMESTAMP, ''40'', ''Logon'');

    UPDATE contact SET phone = $1 WHERE id = $2;

    PERFORM dologinuser($1, $2);

    IF pw > 1 THEN
      PERFORM dologinuser(pw, $2);
    END IF;

    RETURN prevphone;
  END;
' LANGUAGE plpgsql;
