001package armyc2.c5isr.renderer.utilities;
002
003import android.content.Context;
004
005import java.io.BufferedReader;
006import java.io.IOException;
007import java.io.InputStream;
008import java.io.InputStreamReader;
009import java.util.ArrayList;
010import java.util.HashMap;
011import java.util.List;
012import java.util.Map;
013
014import armyc2.c5isr.renderer.R;
015
016public class C2DLookup {
017
018    private static C2DLookup _instance = null;
019    private static Boolean _initCalled = false;
020
021    private static Map<String, String[]> _C2DLookup = null;
022
023    private String TAG = "C2DLookup";
024
025
026    private C2DLookup() {
027
028    }
029
030    public static synchronized C2DLookup getInstance() {
031        if (_instance == null) {
032            _instance = new C2DLookup();
033        }
034        return _instance;
035    }
036
037    public final synchronized void init(Context context)
038    {
039        if (_initCalled == false)
040        {
041            _C2DLookup = new HashMap<>();
042            String[] temp = null;
043            String delimiter = "\t";
044
045            try {
046                InputStream is = context.getResources().openRawResource(R.raw.c2d);
047
048                BufferedReader br = new BufferedReader(new InputStreamReader(is));
049
050
051                String line = br.readLine();
052                while (line != null) {
053                    //parse first line
054                    temp = line.split(delimiter);
055
056                    if(temp.length >= 3) {
057                        _C2DLookup.put(temp[0], temp);
058                    }
059
060                    //read next line for next loop
061                    line = br.readLine();
062                }
063
064                _initCalled = true;
065            } catch (IOException ioe) {
066                System.out.println(ioe.getMessage());
067            } catch (Exception e) {
068                System.out.println(e.getMessage());
069            }
070        }
071    }
072
073    /**
074     * Take a complete 15 character 2525C symbol code and converts it to 2525D if there is a match.
075     * Returns null if no match.
076     * @param symbolID 15 character 2525C symbol code.
077     * @return 30 character 2525D code or null if no matching symbol
078     */
079    public String getDCode(String symbolID)
080    {
081        return getDCode(symbolID, true);
082    }
083
084    /**
085     * Take a complete 15 character 2525C symbol code and converts it to 2525D if there is a match.
086     * Returns null if no match.
087     * @param symbolID 15 character 2525C symbol code.
088     * @param includeCountryCode 2525C symbols don't display the country label so set to false if you don't want it displayed.
089     * @return 30 character 2525D code or null if no matching symbol.
090     */
091    public String getDCode(String symbolID, boolean includeCountryCode)
092    {
093        String basicID = SymbolUtilities.getBasicSymbolID2525C(symbolID);
094        String newCode = "110000000000000000000000000000";
095
096        String[] parts = _C2DLookup.get(basicID);
097        if(parts==null)
098            return null;
099
100        //set version
101        newCode = SymbolID.setVersion(newCode, Integer.parseInt(parts[1]));
102        //set symbol set
103        newCode = SymbolID.setSymbolSet(newCode, Integer.parseInt(parts[2]));
104        //set entity code
105        newCode = SymbolID.setEntityCode(newCode, Integer.parseInt(parts[3]));
106        //Set Echelon/Mobility (not used currently)
107        /*if(!parts[4].isEmpty())
108            newCode = SymbolID.setEchelonMobility(newCode, (parts[4]));*/
109        //set sector modifier 1
110        if(!parts[5].isEmpty())
111            newCode = SymbolID.setModifier1(newCode, (parts[5]));
112        //set sector modifier 2
113        if(!parts[6].isEmpty())
114            newCode = SymbolID.setModifier2(newCode, (parts[6]));
115
116        //get affiliation to set context and affiliation
117        char aff = symbolID.charAt(1);
118
119        switch (aff)
120        {
121            case 'G':
122            case 'W':
123            case 'M':
124            case 'D':
125            case 'L':
126            case 'J':
127            case 'K':
128                newCode = SymbolID.setContext(newCode, SymbolID.StandardIdentity_Context_Exercise);
129                break;
130            default:
131                newCode = SymbolID.setContext(newCode, SymbolID.StandardIdentity_Context_Reality);
132        }
133
134        //set affiliation
135        if(aff=='F' || aff=='D')
136            newCode = SymbolID.setAffiliation(newCode, SymbolID.StandardIdentity_Affiliation_Friend);
137        else if(aff=='H' || aff=='K')
138            newCode = SymbolID.setAffiliation(newCode, SymbolID.StandardIdentity_Affiliation_Hostile_Faker);
139        else if(aff=='N' || aff=='L')
140            newCode = SymbolID.setAffiliation(newCode, SymbolID.StandardIdentity_Affiliation_Neutral);
141        else if(aff=='P' || aff=='G')
142            newCode = SymbolID.setAffiliation(newCode, SymbolID.StandardIdentity_Affiliation_Pending);
143        else if(aff=='S' || aff=='J')
144            newCode = SymbolID.setAffiliation(newCode, SymbolID.StandardIdentity_Affiliation_Suspect_Joker);
145        else if(aff=='A' || aff=='M')
146            newCode = SymbolID.setAffiliation(newCode, SymbolID.StandardIdentity_Affiliation_AssumedFriend);
147        else if(aff=='U' || aff=='W')
148            newCode = SymbolID.setAffiliation(newCode, SymbolID.StandardIdentity_Affiliation_Unknown);
149
150        //set status
151        char status = symbolID.charAt(3);
152
153        if(status == 'A')
154            newCode = SymbolID.setStatus(newCode, SymbolID.Status_Planned_Anticipated_Suspect);
155        if(status == 'P')
156            newCode = SymbolID.setStatus(newCode, SymbolID.Status_Present);
157        if(status == 'C')
158            newCode = SymbolID.setStatus(newCode, SymbolID.Status_Present_FullyCapable);
159        if(status == 'D')
160            newCode = SymbolID.setStatus(newCode, SymbolID.Status_Present_Damaged);
161        if(status == 'X')
162            newCode = SymbolID.setStatus(newCode, SymbolID.Status_Present_Destroyed);
163        if(status == 'F')
164            newCode = SymbolID.setStatus(newCode, SymbolID.Status_Present_FullToCapacity);
165
166        String modifier = symbolID.substring(10,12);
167        if(modifier.charAt(0)!='H' &&//installation
168                modifier.charAt(0)!='M' && //mobility
169                modifier.charAt(0)!='N') //towed array
170        {
171            switch(modifier.charAt(1))
172            {
173                case 'A':
174                    newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Team_Crew);
175                    break;
176                case 'B':
177                    newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Squad);
178                    break;
179                case 'C':
180                    newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Section);
181                    break;
182                case 'D':
183                    newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Platoon_Detachment);
184                    break;
185                case 'E':
186                    newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Company_Battery_Troop);
187                    break;
188                case 'F':
189                    newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Battalion_Squadron);
190                    break;
191                case 'G':
192                    newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Regiment_Group);
193                    break;
194                case 'H':
195                    newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Brigade);
196                    break;
197                case 'I':
198                    newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Division);
199                    break;
200                case 'J':
201                    newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Corps_MEF);
202                    break;
203                case 'K':
204                    newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Army);
205                    break;
206                case 'L':
207                    newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_ArmyGroup_Front);
208                    break;
209                case 'M':
210                    newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Region_Theater);
211                    break;
212                case 'N':
213                    newCode = SymbolID.setAmplifierDescriptor(newCode,SymbolID.Echelon_Region_Command);
214                    break;
215
216            }
217
218            switch (modifier.charAt(0))
219            {
220                case 'A':
221                    newCode = SymbolID.setHQTFD(newCode,SymbolID.HQTFD_Headquarters);
222                    break;
223                case 'B':
224                    newCode = SymbolID.setHQTFD(newCode,SymbolID.HQTFD_TaskForce_Headquarters);
225                    break;
226                case 'C':
227                    newCode = SymbolID.setHQTFD(newCode,SymbolID.HQTFD_FeintDummy_Headquarters);
228                    break;
229                case 'D':
230                    newCode = SymbolID.setHQTFD(newCode,SymbolID.HQTFD_FeintDummy_TaskForce_Headquarters);
231                    break;
232                case 'E':
233                    newCode = SymbolID.setHQTFD(newCode,SymbolID.HQTFD_TaskForce);
234                    break;
235                case 'F':
236                    newCode = SymbolID.setHQTFD(newCode,SymbolID.HQTFD_FeintDummy);
237                    break;
238                case 'G':
239                    newCode = SymbolID.setHQTFD(newCode,SymbolID.HQTFD_FeintDummy_TaskForce);
240                    break;
241            }
242        }
243        else
244        {
245            if(modifier.equals("HB"))
246                SymbolID.setHQTFD(newCode,SymbolID.HQTFD_FeintDummy);
247            else if(modifier.charAt(0)=='M')
248            {
249                switch(modifier.charAt(1))
250                {
251                    case 'O':
252                        newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_WheeledLimitedCrossCountry);
253                        break;
254                    case 'P':
255                        newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_WheeledCrossCountry);
256                        break;
257                    case 'Q':
258                        newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_Tracked);
259                        break;
260                    case 'R':
261                        newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_Wheeled_Tracked);
262                        break;
263                    case 'S':
264                        newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_Towed);
265                        break;
266                    case 'T':
267                        newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_Rail);
268                        break;
269                    case 'U':
270                        newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_OverSnow);
271                        break;
272                    case 'V':
273                        newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_Sled);
274                        break;
275                    case 'W':
276                        newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_PackAnimals);
277                        break;
278                    case 'X':
279                        newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_Barge);
280                        break;
281                    case 'Y':
282                        newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_Amphibious);
283                        break;
284                }
285            }
286            else if(modifier.charAt(0)=='N')
287            {
288                switch(modifier.charAt(1)) {
289                    case 'S':
290                        newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_ShortTowedArray);
291                        break;
292                    case 'L':
293                        newCode = SymbolID.setAmplifierDescriptor(newCode, SymbolID.Mobility_LongTowedArray);
294                        break;
295                }
296            }
297        }
298
299        //country code
300        if(includeCountryCode)
301            newCode = newCode.substring(0,27) + GENCLookup.getInstance().get3DigitCode(symbolID.substring(12,14));
302
303        return newCode;
304    }
305
306}
307