{* UltraStar Deluxe - Karaoke Game
 *
 * UltraStar Deluxe is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; see the file COPYING. If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 *
 * $URL: https://ultrastardx.svn.sourceforge.net/svnroot/ultrastardx/trunk/src/screens/UScreenStatMain.pas $
 * $Id: UScreenStatMain.pas 1939 2009-11-09 00:27:55Z s_alexander $
 *}

unit UScreenStatMain;

interface

{$IFDEF FPC}
  {$MODE Delphi}
{$ENDIF}

{$I switches.inc}

uses
  UDisplay,
  UIni,
  UMenu,
  UMusic,
  UThemes,
  sdl2,
  SysUtils;

type
  TScreenStatMain = class(TMenu)
    private
      //Some Stat Value that don't need to be calculated 2 times
      SongsWithVid: cardinal;
      function FormatOverviewIntro(FormatStr: UTF8String): UTF8String;
      function FormatSongOverview(FormatStr: UTF8String): UTF8String;
      function FormatPlayerOverview(FormatStr: UTF8String): UTF8String;
    public
      TextOverview:    integer;
      constructor Create; override;
      function ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean; override;
      procedure OnShow; override;
      procedure SetAnimationProgress(Progress: real); override;

      procedure SetOverview;
  end;

const
  ID='ID_050';   //for help system

implementation

uses
  UCommon,
  UDataBase,
  UGraphic,
  UHelp,
  ULanguage,
  ULog,
  USong,
  USongs,
  UUnicodeUtils,
  Classes;

function TScreenStatMain.ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean;
begin
  Result := true;
  if (PressedDown) then
  begin // Key Down
    // check normal keys
    case PressedKey of
      SDLK_Q:
        begin
          Result := false;
          Exit;
        end;
    end;
    
    // check special keys
    case PressedKey of
      SDLK_ESCAPE,
      SDLK_BACKSPACE :
        begin
          Ini.Save;
          AudioPlayback.PlaySound(SoundLib.Back);
          FadeTo(@ScreenMain);
        end;
      SDLK_TAB:
        begin
          ScreenPopupHelp.ShowPopup();
        end;
      SDLK_RETURN:
        begin
          //Exit Button Pressed
          if Interaction = 4 then
          begin
            AudioPlayback.PlaySound(SoundLib.Back);
            FadeTo(@ScreenMain);
          end
          else //One of the Stats Buttons Pressed
          begin
            AudioPlayback.PlaySound(SoundLib.Back);
            ScreenStatDetail.Typ := TStatType(Interaction);
            FadeTo(@ScreenStatDetail);
          end;
        end;
      SDLK_LEFT:
      begin
          InteractPrev;
      end;
      SDLK_RIGHT:
      begin
          InteractNext;
      end;
      SDLK_UP:
      begin
          InteractPrev;
      end;
      SDLK_DOWN:
      begin
          InteractNext;
      end;
    end;
  end;
end;

constructor TScreenStatMain.Create;
var
  I:    integer;
begin
  inherited Create;

  TextOverview := AddText(Theme.StatMain.TextOverview);

  LoadFromTheme(Theme.StatMain);

  AddButton(Theme.StatMain.ButtonScores);
  if (Length(Button[0].Text)=0) then
    AddButtonText(14, 20, Theme.StatDetail.Description[0]);

  AddButton(Theme.StatMain.ButtonSingers);
  if (Length(Button[1].Text)=0) then
    AddButtonText(14, 20, Theme.StatDetail.Description[1]);

  AddButton(Theme.StatMain.ButtonSongs);
  if (Length(Button[2].Text)=0) then
    AddButtonText(14, 20, Theme.StatDetail.Description[2]);

  AddButton(Theme.StatMain.ButtonBands);
  if (Length(Button[3].Text)=0) then
    AddButtonText(14, 20, Theme.StatDetail.Description[3]);

  AddButton(Theme.StatMain.ButtonExit);
  if (Length(Button[4].Text)=0) then
    AddButtonText(14, 20, Theme.Options.Description[OPTIONS_DESC_INDEX_BACK]);

  Interaction := 0;

  //Set Songs with Vid
  SongsWithVid := 0;
  for I := 0 to Songs.SongList.Count -1 do
    if (TSong(Songs.SongList[I]).Video.IsSet) then
      Inc(SongsWithVid);
end;

procedure TScreenStatMain.OnShow;
begin
  inherited;

  if not Help.SetHelpID(ID) then
    Log.LogWarn('No Entry for Help-ID ' + ID, 'ScreenStatMain');

  //Set Overview Text:
  SetOverview;
end;

function TScreenStatMain.FormatOverviewIntro(FormatStr: UTF8String): UTF8String;
var
  Year, Month, Day: word;
begin
  {Format:
    %0:d Ultrastar Version
    %1:d Day of Reset
    %2:d Month of Reset
    %3:d Year of Reset}

  Result := '';

  try
    DecodeDate(Database.GetStatReset(), Year, Month, Day);
    Result := Format(FormatStr, [Language.Translate('US_VERSION'), Day, Month, Year]);
  except
    on E: EConvertError do
      Log.LogError('Error Parsing FormatString "STAT_OVERVIEW_INTRO": ' + E.Message);
  end;
end;

function TScreenStatMain.FormatSongOverview(FormatStr: UTF8String): UTF8String;
var
  CntSongs, CntSungSongs, CntVidSongs: integer;
  MostPopSongArtist, MostPopSongTitle: UTF8String;
  StatList: TList;
  MostSungSong: TStatResultMostSungSong;
begin
  {Format:
    %0:d Count Songs
    %1:d Count of Sung Songs
    %2:d Count of UnSung Songs
    %3:d Count of Songs with Video
    %4:s Name of the most popular Song}

  CntSongs := Songs.SongList.Count;
  CntSungSongs := Database.GetTotalEntrys(stMostSungSong);
  CntVidSongs := SongsWithVid;

  StatList := Database.GetStats(stMostSungSong, 1, 0, false);
  if ((StatList <> nil) and (StatList.Count > 0)) then
  begin
    MostSungSong := StatList[0];
    MostPopSongArtist := MostSungSong.Artist;
    MostPopSongTitle := MostSungSong.Title;
  end
  else
  begin
    MostPopSongArtist := '-';
    MostPopSongTitle := '-';
  end;
  Database.FreeStats(StatList);

  Result := '';
  
  try
    Result := Format(FormatStr, [
        CntSongs, CntSungSongs, CntSongs-CntSungSongs, CntVidSongs,
        MostPopSongArtist, MostPopSongTitle]);
  except
    on E: EConvertError do
      Log.LogError('Error Parsing FormatString "STAT_OVERVIEW_SONG": ' + E.Message);
  end;
end;

function TScreenStatMain.FormatPlayerOverview(FormatStr: UTF8String): UTF8String;
var
  CntPlayers: integer;
  BestScoreStat:    TStatResultBestScores;
  BestSingerStat:   TStatResultBestSingers;
  BestPlayer, BestScorePlayer: UTF8String;
  BestPlayerScore, BestScore: integer;
  SingerStats, ScoreStats: TList;
begin
  {Format:
    %0:d Count Players
    %1:s Best Player
    %2:d Best Players Score
    %3:s Best Score Player
    %4:d Best Score}

  CntPlayers := Database.GetTotalEntrys(stBestSingers);

  SingerStats := Database.GetStats(stBestSingers, 1, 0, false);
  if ((SingerStats <> nil) and (SingerStats.Count > 0)) then
  begin
    BestSingerStat := SingerStats[0];
    BestPlayer := BestSingerStat.Player;
    BestPlayerScore := BestSingerStat.AverageScore;
  end
  else
  begin
    BestPlayer := '-';
    BestPlayerScore := 0;
  end;
  Database.FreeStats(SingerStats);

  ScoreStats  := Database.GetStats(stBestScores, 1, 0, false);
  if ((ScoreStats <> nil) and (ScoreStats.Count > 0)) then
  begin
    BestScoreStat := ScoreStats[0];
    BestScorePlayer := BestScoreStat.Singer;
    BestScore := BestScoreStat.Score;
  end
  else
  begin
    BestScorePlayer := '-';
    BestScore := 0;
  end;
  Database.FreeStats(ScoreStats);

  Result := '';

  try
    Result := Format(Formatstr, [
        CntPlayers, BestPlayer, BestPlayerScore,
        BestScorePlayer, BestScore]);
  except
    on E: EConvertError do
      Log.LogError('Error Parsing FormatString "STAT_OVERVIEW_PLAYER": ' + E.Message);
  end;
end;

procedure TScreenStatMain.SetOverview;
var
  Overview: UTF8String;
begin
  // Format overview
  Overview := FormatOverviewIntro(Language.Translate('STAT_OVERVIEW_INTRO')) + '\n \n' + 
              FormatSongOverview(Language.Translate('STAT_OVERVIEW_SONG')) + '\n \n' + 
              FormatPlayerOverview(Language.Translate('STAT_OVERVIEW_PLAYER'));
  Text[0].Text := Overview;
end;

procedure TScreenStatMain.SetAnimationProgress(Progress: real);
var
  I: integer;
begin
  for I := 0 to high(Button) do
    Button[I].Texture.ScaleW := Progress;
end;

end.
