# SupportLevelHelper.java

    /*
    ** Module   : SupportLevelHelper.java
    ** Abstract : Tools for describing support levels.
    **
    ** Copyright (c) 2021, Golden Code Development Corporation.
    **
    ** -#- -I- --Date-- --------------------------------Description----------------------------------
    ** 001 GES 20210210 Added helpers for display of the constants.
    */

    /*
    ** This program is free software: you can redistribute it and/or modify
    ** it under the terms of the GNU Affero General Public License as
    ** published by the Free Software Foundation, either version 3 of the
    ** License, or (at your option) any later version.
    **
    ** This program is distributed in the hope that it will be useful,
    ** but WITHOUT ANY WARRANTY; without even the implied warranty of
    ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    ** GNU Affero General Public License for more details.
    **
    ** You may find a copy of the GNU Affero GPL version 3 at the following
    ** location: https://www.gnu.org/licenses/agpl-3.0.en.html
    **
    ** Additional terms under GNU Affero GPL version 3 section 7:
    **
    **   Under Section 7 of the GNU Affero GPL version 3, the following additional
    **   terms apply to the works covered under the License.  These additional terms
    **   are non-permissive additional terms allowed under Section 7 of the GNU
    **   Affero GPL version 3 and may not be removed by you.
    **
    **   0. Attribution Requirement.
    **
    **     You must preserve all legal notices or author attributions in the covered
    **     work or Appropriate Legal Notices displayed by works containing the covered
    **     work.  You may not remove from the covered work any author or developer
    **     credit already included within the covered work.
    **
    **   1. No License To Use Trademarks.
    **
    **     This license does not grant any license or rights to use the trademarks
    **     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
    **     of Golden Code Development Corporation. You are not authorized to use the
    **     name Golden Code, FWD, or the names of any author or contributor, for
    **     publicity purposes without written authorization.
    **
    **   2. No Misrepresentation of Affiliation.
    **
    **     You may not represent yourself as Golden Code Development Corporation or FWD.
    **
    **     You may not represent yourself for publicity purposes as associated with
    **     Golden Code Development Corporation, FWD, or any author or contributor to
    **     the covered work, without written authorization.
    **
    **   3. No Misrepresentation of Source or Origin.
    **
    **     You may not represent the covered work as solely your work.  All modified
    **     versions of the covered work must be marked in a reasonable way to make it
    **     clear that the modified work is not originating from Golden Code Development
    **     Corporation or FWD.  All modified versions must contain the notices of
    **     attribution required in this license.
    */

    package com.goldencode.p2j.report;

    import java.util.*;

    public class SupportLevelHelper
    implements ReportConstants
    {
       /** Storage for all support level descriptors. */
       private static final Map<Integer, Descriptor> descriptors = new HashMap<>();

       static
       {
          descriptors.put(LVL_UNKNOWN       , new Descriptor(0x000000, 0x808080, "Unknown" , "The support level is not known."));
          descriptors.put(CVT_LVL_NONE      , new Descriptor(0xFFFFFF, 0xFF0000, "None"    , "There is no conversion support for this feature."));
          descriptors.put(CVT_LVL_PARTIAL   , new Descriptor(0x000000, 0xFFFF00, "Partial" , "Partial conversion support is implemented but there is at least some implementation missing."));
          descriptors.put(CVT_LVL_BASIC     , new Descriptor(0x000000, 0xBFFF00, "Basic"   , "A basic conversion implementation is available but there are limitations which require more work before having a complete implementation.  This is typically a statement of more compatibility testing being needed."));
          descriptors.put(CVT_LVL_FULL_RESTR, new Descriptor(0x000000, 0x60CC00, "Full (R)", "Full conversion support is implemented, but there are permanent restrictions.  This is typlically due to some feature that does not make sense or is not needed in Java."));
          descriptors.put(CVT_LVL_FULL      , new Descriptor(0xFFFFFF, 0x009900, "Full"    , "Full conversion support is implemented.  It is expected to be fully compatible."));
          descriptors.put(RT_LVL_NONE       , new Descriptor(0xFFFFFF, 0xFF0000, "None"    , "There is no runtime support for this feature."));
          descriptors.put(RT_LVL_STUB       , new Descriptor(0xFFFFFF, 0xFF5000, "Stubs"   , "Runtime functionality stubbed out, but not implemented. This means that there are placeholder classes and methods in the Java code, sufficient for any converted code to compile.  BUT these classes and methods have no real implementation inside, they are just there to satisfy the @javac@ compiler."));
          descriptors.put(RT_LVL_UNTESTED   , new Descriptor(0x000000, 0xFFA500, "Untested", "A runtime implementation exists, but it needs testing.  It is likely there are issues to resolve to achieve compatibility."));
          descriptors.put(RT_LVL_PARTIAL    , new Descriptor(0x000000, 0xFFFF00, "Partial" , "Partial runtime support is implemented but there is at least some implementation missing."));
          descriptors.put(RT_LVL_BASIC      , new Descriptor(0x000000, 0xBFFF00, "Basic"   , "A basic runtime implementation is available but there are limitations which require more work before having a complete implementation.  This is typically a statement of more compatibility testing being needed."));
          descriptors.put(RT_LVL_FULL_RESTR , new Descriptor(0x000000, 0x60CC00, "Full (R)", "Full runtime support is implemented, but there are permanent restrictions.  This is typlically due to some feature that does not make sense or is not needed in Java."));
          descriptors.put(RT_LVL_FULL       , new Descriptor(0xFFFFFF, 0x009900, "Full"    , "Full runtime support is implemented.  It is expected to be fully compatible."));
       }

       /**
        * Obtains the descriptor for the level specified.
        *
        * @param    lvl
        *           Must be a single support level flag.
        *
        * @return   A descriptor for the support level or {@code null} if the level is not valid or if the level
        *           is not just one support level flag (but has more than one flag set).
        */
       public static Descriptor describe(int lvl)
       {
          return descriptors.get(lvl);
       }

       /**
        * Support level details for display purposes.
        */
       public static class Descriptor
       {
          /** Foreground color, RGB format. */
          public int fg;

          /** Background color, RGB format. */
          public int bg;

          /** Support level name. */
          public String name;

          /** Support level description. */
          public String descr;

          /**
           * Constructor.
           *
           * @param    fg
           *           Foreground color, RGB format.
           * @param    bg
           *           Background color, RGB format.
           * @param    name
           *           Support level name.
           * @param    descr
           *           Support level description.
           */
          private Descriptor(int fg, int bg, String name, String descr)
          {
             this.fg    = fg;
             this.bg    = bg;
             this.name  = name;
             this.descr = descr;
          }

          /**
           * Helper to format an RGB integer value as a hexidecimal constant.
           *
           * @param    color
           *           RGB color value.
           *
           * @return   The hexidecimal constant in "#RRGGBB" format.
           */
          public static String asRGBConstant(int color)
          {
             return String.format("#%06X", color);
          }
       }
    }