/*
 *  Copyright (C) 2012-2018 Team Kodi
 *  This file is part of Kodi - https://kodi.tv
 *
 *  SPDX-License-Identifier: GPL-2.0-or-later
 *  See LICENSES/README.md for more information.
 */

#pragma once

#include "threads/CriticalSection.h"

#include <chrono>
#include <memory>
#include <string>
#include <vector>

namespace PVR
{
  class CPVRTimerInfoTag;

  class CPVRGUITimerInfo
  {
  public:
    CPVRGUITimerInfo();
    virtual ~CPVRGUITimerInfo() = default;

    void ResetProperties();

    void UpdateTimersCache();
    void UpdateTimersToggle();
    void UpdateNextTimer();

    const std::string& GetActiveTimerTitle() const;
    const std::string& GetActiveTimerChannelName() const;
    const std::string& GetActiveTimerChannelIcon() const;
    const std::string& GetActiveTimerDateTime() const;
    const std::string& GetNextTimerTitle() const;
    const std::string& GetNextTimerChannelName() const;
    const std::string& GetNextTimerChannelIcon() const;
    const std::string& GetNextTimerDateTime() const;
    const std::string& GetNextTimer() const;

    bool HasTimers() const { return m_iTimerAmount > 0; }
    bool HasRecordingTimers() const { return m_iRecordingTimerAmount > 0; }
    bool HasNonRecordingTimers() const { return m_iTimerAmount - m_iRecordingTimerAmount > 0; }

  private:
    bool TimerInfoToggle();

    virtual int AmountActiveTimers() = 0;
    virtual int AmountActiveRecordings() = 0;
    virtual std::vector<std::shared_ptr<CPVRTimerInfoTag>> GetActiveRecordings() = 0;
    virtual std::shared_ptr<CPVRTimerInfoTag> GetNextActiveTimer() = 0;

    unsigned int m_iTimerAmount;
    unsigned int m_iRecordingTimerAmount;

    std::string m_strActiveTimerTitle;
    std::string m_strActiveTimerChannelName;
    std::string m_strActiveTimerChannelIcon;
    std::string m_strActiveTimerTime;
    std::string m_strNextRecordingTitle;
    std::string m_strNextRecordingChannelName;
    std::string m_strNextRecordingChannelIcon;
    std::string m_strNextRecordingTime;
    std::string m_strNextTimerInfo;

    std::chrono::time_point<std::chrono::steady_clock> m_iTimerInfoToggleStart;
    unsigned int m_iTimerInfoToggleCurrent;

    mutable CCriticalSection m_critSection;
  };

  class CPVRGUIAnyTimerInfo : public CPVRGUITimerInfo
  {
  public:
    CPVRGUIAnyTimerInfo() = default;

  private:
    int AmountActiveTimers() override;
    int AmountActiveRecordings() override;
    std::vector<std::shared_ptr<CPVRTimerInfoTag>> GetActiveRecordings() override;
    std::shared_ptr<CPVRTimerInfoTag> GetNextActiveTimer() override;
  };

  class CPVRGUITVTimerInfo : public CPVRGUITimerInfo
  {
  public:
    CPVRGUITVTimerInfo() = default;

  private:
    int AmountActiveTimers() override;
    int AmountActiveRecordings() override;
    std::vector<std::shared_ptr<CPVRTimerInfoTag>> GetActiveRecordings() override;
    std::shared_ptr<CPVRTimerInfoTag> GetNextActiveTimer() override;
  };

  class CPVRGUIRadioTimerInfo : public CPVRGUITimerInfo
  {
  public:
    CPVRGUIRadioTimerInfo() = default;

  private:
    int AmountActiveTimers() override;
    int AmountActiveRecordings() override;
    std::vector<std::shared_ptr<CPVRTimerInfoTag>> GetActiveRecordings() override;
    std::shared_ptr<CPVRTimerInfoTag> GetNextActiveTimer() override;
  };

} // namespace PVR
