package dynamic.sitebackup;

import dynamic.WebBackup;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;

/**
 * Created with IntelliJ IDEA.
 * User: John
 * Date: 25/04/12
 * Time: 12:11
 * To change this template use File | Settings | File Templates.
 */
public class LinkAnalyser {

    public static ArrayList<String> getAllInternalLinks(String contents) {
        ArrayList<String> links = getLinks(contents);
        ArrayList<String> links2 = getImperialLinks(links);
        ArrayList<String> links3 = resolveRedirects(links2);
        ArrayList<String> links4 = removeAnchors(links3);
        ArrayList<String> links5 = restrictToSubURL(links4);
        checkLinksForSpaces(links5);
        return links5;
    }

    private static ArrayList<String> getLinks(String contents) {
        ArrayList<String> link_tags = new ArrayList<String>();

        int pos = 0;
        while((pos = contents.indexOf("<a",pos)) >= 0){
            int href_start = contents.indexOf("href",pos);
            href_start = contents.indexOf('\"',href_start) + 1;
            int href_end = contents.indexOf('\"',href_start);
            String relative_link = contents.substring(href_start,href_end);
            link_tags.add(relative_link);
            pos = href_end;
        }
        return link_tags;
    }

    private static ArrayList<String> getImperialLinks(ArrayList<String> links) {
        ArrayList<String> links2 = new ArrayList<String>();
        for (String link : links) {
            if(link.equals("/")) continue;  // don't re-do this page
            if(link.equals("#")) continue;  // ignore '#'
            if(link.contains("'")) continue;  // ignore links that have quotations (i.e. in scripts)
            if(link.indexOf("http") == 0 && link.indexOf(WebBackup.BASE_URL) != 0) continue; // exclude external link

            if(link.charAt(0) == '/') link = WebBackup.BASE_URL + link;  // expand relative links

            links2.add(link);
        }
        return links2;
    }

    private static ArrayList<String> resolveRedirects(ArrayList<String> links) {

        String redirect_url_base = WebBackup.BASE_URL + "/portal/page";

        ArrayList<String> links2 = new ArrayList<String>();
        for (String link : links) {
            if(link.indexOf(redirect_url_base) == 0 ){
                try {
                    URL u = new URL(link);
                    HttpURLConnection urlConnection = (HttpURLConnection) u.openConnection();
                    urlConnection.setInstanceFollowRedirects(false);
                    String location = urlConnection.getHeaderField("Location");
                    if(location != null)
                        links2.add(location);
                    else {
                        WebBackup.flagError("*** Check redirect: " + link);
                    }
                } catch (IOException e) {
                    WebBackup.flagError("*** problem resolving redirect - " + link);
                    continue;
                }
            } else
                links2.add(link);
        }
        return links2;
    }

    private static ArrayList<String> removeAnchors(ArrayList<String> links) {
        ArrayList<String> links2 = new ArrayList<String>();
        for (String link : links) {
            int hash_pos = link.indexOf('#');
            if(hash_pos < 0)
                links2.add(link);
            else
                links2.add(link.substring(0,hash_pos));
        }
        return links2;
    }

    private static ArrayList<String> restrictToSubURL(ArrayList<String> links) {

        String sub_url_base = WebBackup.BASE_URL + WebBackup.SUB_URL;

        ArrayList<String> links2 = new ArrayList<String>();
        for (String link : links) {
            if(link.indexOf(sub_url_base) == 0)
                links2.add(link);
        }
        return links2;
    }

    private static void checkLinksForSpaces(ArrayList<String> links) {
        for (String link : links) {
            if(link.indexOf(" ") >= 0)
                WebBackup.flagError("*** space in link - " + link);
        }
    }




}
