/**
 * Copyright 2017 Google Inc.
 *
 * Licensed 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.
 */

#include <experimental/filesystem>
#include <iostream>
#include <string>


#include "sysfs/util.hpp"

/*
 * There are two basic paths I want to support:
 * 1. /sys/class/hwmon/hwmon0/pwm1
 * 2. /sys/devices/platform/ahb/1e786000.pwm-tacho-controller/hwmon/<asterisk asterisk>/pwm1
 *
 * In this latter case, I want to fill in that gap.  Assuming because it's this
 * path that it'll only have one directory there.
 */

static constexpr auto platform = "/sys/devices/platform/";
namespace fs = std::experimental::filesystem;


std::string FixupPath(std::string original)
{
    std::string::size_type n, x;

    /* TODO: Consider the merits of using regex for this. */
    n = original.find("**");
    x = original.find(platform);

    if ((n != std::string::npos) && (x != std::string::npos))
    {
        /* This path has some missing pieces and we support it. */
        std::string base = original.substr(0, n);
        std::string fldr;
        std::string f = original.substr(n + 2, original.size() - (n + 2));

        /* Equivalent to glob and grab 0th entry. */
        for (const auto& folder : fs::directory_iterator(base))
        {
            fldr = folder.path();
            break;
        }

        if (!fldr.length())
        {
            return original;
        }

        return fldr + f;
    }
    else
    {
        /* It'll throw an exception when we use it if it's still bad. */
        return original;
    }
}
