/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.usergrid.rest.management.organizations;


import com.sun.jersey.api.client.UniformInterfaceException;
import org.apache.usergrid.rest.test.resource2point0.AbstractRestIT;
import org.apache.usergrid.rest.test.resource2point0.model.Application;
import org.apache.usergrid.rest.test.resource2point0.model.Entity;
import org.apache.usergrid.rest.test.resource2point0.model.Organization;
import org.apache.usergrid.rest.test.resource2point0.model.Token;
import org.junit.Ignore;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.UUID;

import static junit.framework.TestCase.assertNotNull;
import static org.junit.Assert.assertEquals;

/**
 * Tests for admin emails with + signs create accounts correctly, and can get tokens in both the POST and GET forms of
 * the api
 *
 * @author tnine
 */
public class AdminEmailEncodingIT extends AbstractRestIT {
    private static Logger log = LoggerFactory.getLogger(AdminEmailEncodingIT.class);

    /**
     * Ensure that '+' characters in email addresses are handled properly
     *
     * @throws Exception
     */
    @Test
    public void getTokenPlus() throws Exception {
        doTest("+");
    }

    /**
     * Ensure that '_' characters in email addresses are handled properly
     *
     * @throws Exception
     */
    @Test
    public void getTokenUnderscore() throws Exception {
        doTest("_");
    }

    /**
     * Ensure that '-' characters in email addresses are handled properly
     *
     * @throws Exception
     */
    @Test
    public void getTokenDash() throws Exception {
        doTest("-");
    }

    /**
     * Ensure that "'" characters in email addresses are handled properly
     *
     * @throws Exception
     */
    @Test
    @Ignore //This fails. I'm not sure if it is by design, but a single quote is valid in an email address
    public void getTokenQuote() throws Exception {
        doTest("'");
    }

    /**
     * Given an organization name and an arbitrary character or string,
     * ensure that an organization and admin user can be created when
     * the given string is a part of the admin email address
     *
     * @param symbol
     * @throws UniformInterfaceException
     */
    private void doTest(String symbol) throws UniformInterfaceException {

        String unique = UUID.randomUUID().toString();
        String org = "org_getTokenDash" + unique;
        String app = "app_getTokenDash" + unique;

        //Username and password
        String username = "testuser" + unique;
        String password = "password" + unique;
        //create an email address containing 'symbol'
        String email = String.format("test%suser%s@usergrid.com", symbol, unique);

        //create the organization entity
        Organization orgPayload = new Organization(org, username, email, username, password, null);

        //post the organization entity
        Organization organization = clientSetup.getRestClient().management().orgs().post(orgPayload);
        assertNotNull(organization);

        //Retrieve an authorization token using the credentials created above
        Token tokenReturned = clientSetup.getRestClient().management().token()
                                         .post(false,Token.class,new Token("password", username, password),null);
        assertNotNull(tokenReturned);

        //Instruct the test framework to use the new token
        this.app().token().setToken(tokenReturned);
        //Create an application within the organization
        clientSetup.getRestClient().management().orgs().organization(organization.getName()).app().post(new Application(app));

        //retrieve the new management user by username and ensure the username and email address matches the input
        Entity me = clientSetup.getRestClient().management().users().entity(username).get();
        assertEquals(email, me.get("email"));
        assertEquals(username, me.get("username"));

        //retrieve the new management user by email and ensure the username and email address matches the input
        me = clientSetup.getRestClient().management().users().entity(email).get();
        assertEquals(email, me.get("email"));
        assertEquals(username, me.get("username"));

    }
}
