/*
 * 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.sling.tooling.lc.jira;

import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Issue implements Comparable<Issue> {
    
    private static final Pattern KEY_PATTERN = Pattern.compile("^([A-Z]+)-(\\d+)$"); 

    private final String key;
    private final Fields fields;

    public Issue(String key, Fields fields) {
        this.key = key;
        this.fields = fields;
    }

    public String getKey() {
        return key;
    }
    
    public Fields getFields() {
        return fields;
    }
    
    public String getSummary() {
        return fields.getSummary();
    }
    
    @Override
    public String toString() {
        return key + " - " + getSummary();
    }

    @Override
    public int compareTo(Issue o) {
        
        Matcher ourMatcher = KEY_PATTERN.matcher(key);
        Matcher theirMatcher = KEY_PATTERN.matcher(o.key);
        
        if ( !ourMatcher.matches()) {
            throw new IllegalArgumentException("No match found for " + key);
        }

        if ( !theirMatcher.matches()) {
            throw new IllegalArgumentException("No match found for " + o.key);
        }
        
        String ourProject = ourMatcher.group(1);
        String theirProject = theirMatcher.group(1);
        
        
        if ( !Objects.equals(ourProject, theirProject)) {
            return ourProject.compareTo(theirProject);
        }
        
        int ourId = Integer.parseInt(ourMatcher.group(2));
        int theirId = Integer.parseInt(theirMatcher.group(2));

        return Integer.valueOf(ourId).compareTo(theirId);
    }
}
