/*
 * Copyright 2022 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * This file contains private enums related to paths. See also skbug.com/40042016
 */

#ifndef SkPathEnums_DEFINED
#define SkPathEnums_DEFINED

#include "include/core/SkPathTypes.h"

#include <optional>

enum class SkPathConvexity {
    kConvex_CW,
    kConvex_CCW,
    kConvex_Degenerate,  // known to not have a determinable direction, but convex

    kConcave,

    kUnknown,   // todo: can we eliminate this, and use optional or other patterns?
};

enum class SkResolveConvexity : bool {
    kNo = false,
    kYes = true,
};

static inline bool SkPathConvexity_IsConvex(SkPathConvexity cv) {
    return cv == SkPathConvexity::kConvex_CW
        || cv == SkPathConvexity::kConvex_CCW
        || cv == SkPathConvexity::kConvex_Degenerate;
}

static inline SkPathConvexity SkPathConvexity_OppositeConvexDirection(SkPathConvexity cv) {
    SkASSERT(SkPathConvexity_IsConvex(cv));
    switch (cv) {
        case SkPathConvexity::kConvex_CW:  cv = SkPathConvexity::kConvex_CCW; break;
        case SkPathConvexity::kConvex_CCW: cv = SkPathConvexity::kConvex_CW;  break;
        default: break;
    }
    return cv;
}

enum class SkPathFirstDirection {
    kCW,         // == SkPathDirection::kCW
    kCCW,        // == SkPathDirection::kCCW
    kUnknown,
};

static inline SkPathConvexity SkPathDirection_ToConvexity(SkPathDirection dir) {
    switch (dir) {
        case SkPathDirection::kCW:  return SkPathConvexity::kConvex_CW;
        case SkPathDirection::kCCW: return SkPathConvexity::kConvex_CCW;
    }
    SkUNREACHABLE;
}

static inline SkPathConvexity SkPathFirstDirection_ToConvexity(SkPathFirstDirection dir) {
    switch (dir) {
        case SkPathFirstDirection::kCW:      return SkPathConvexity::kConvex_CW;
        case SkPathFirstDirection::kCCW:     return SkPathConvexity::kConvex_CCW;
        case SkPathFirstDirection::kUnknown: return SkPathConvexity::kConvex_Degenerate;
    }
    SkUNREACHABLE;
}

static inline std::optional<SkPathDirection> SkPathConvexity_ToDirection(SkPathConvexity cv) {
    if (cv == SkPathConvexity::kConvex_CW) {
        return SkPathDirection::kCW;
    }
    if (cv == SkPathConvexity::kConvex_CCW) {
        return SkPathDirection::kCCW;
    }
    return {};
}

static inline SkPathFirstDirection SkPathConvexity_ToFirstDirection(SkPathConvexity cv) {
    if (cv == SkPathConvexity::kConvex_CW) {
        return SkPathFirstDirection::kCW;
    }
    if (cv == SkPathConvexity::kConvex_CCW) {
        return SkPathFirstDirection::kCCW;
    }
    return SkPathFirstDirection::kUnknown;
}

static inline SkPathFirstDirection SkPathDirectionToFirst(SkPathDirection dir) {
    return dir == SkPathDirection::kCW ? SkPathFirstDirection::kCW
                                       : SkPathFirstDirection::kCCW;
}

#endif
