// Copyright (c) 2024 Synty Studios Limited. All rights reserved.
//
// Use of this software is subject to the terms and conditions of the Synty Studios End User Licence Agreement (EULA)
// available at: https://syntystore.com/pages/end-user-licence-agreement
//
// For additional details, see the LICENSE.MD file bundled with this software.
using SQLite;
using System.Collections.Generic;
namespace Synty.SidekickCharacters.Database.DTO
{
[Table("sk_part_preset_row")]
public class SidekickPartPresetRow
{
private SidekickPartPreset _partPreset;
private SidekickPart _part;
[PrimaryKey]
[AutoIncrement]
[Column("id")]
public int ID { get; set; }
[Column("part_name")]
public string PartName { get; set; }
[Column("ptr_part_preset")]
public int PtrPreset { get; set; }
[Column("ptr_part")]
public int PtrPart { get; set; } = -1;
[Column("part_type")]
public string PartType { get; set; }
[Ignore]
public SidekickPartPreset PartPreset
{
get => _partPreset;
set
{
_partPreset = value;
PtrPreset = value.ID;
}
}
[Ignore]
public SidekickPart Part
{
get => _part;
set
{
_part = value;
PtrPart = value.ID;
}
}
///
/// Gets a specific Preset Part by its database ID.
///
/// The Database Manager to use.
/// The id of the required Preset Part.
/// The specific Preset Part if it exists; otherwise null.
public static SidekickPartPresetRow GetByID(DatabaseManager dbManager, int id)
{
SidekickPartPresetRow partPreset = dbManager.GetCurrentDbConnection().Find(id);
Decorate(dbManager, partPreset);
return partPreset;
}
///
/// Gets a list of all the Preset Parts in the database.
///
/// The Database Manager to use.
/// A list of all preset parts in the database.
public static List GetAll(DatabaseManager dbManager)
{
List presetParts = dbManager.GetCurrentDbConnection().Table().ToList();
foreach (SidekickPartPresetRow preset in presetParts)
{
Decorate(dbManager, preset);
}
return presetParts;
}
///
/// Gets a list of all the Preset Part rows in the database that have the matching species.
///
/// The Database Manager to use.
/// The preset to get all the preset part rows for.
/// A list of all preset part rows in the database for the given preset.
public static List GetAllByPreset(DatabaseManager dbManager, SidekickPartPreset partPreset)
{
List presetParts = dbManager.GetCurrentDbConnection().Table()
.Where(presetPart => presetPart.PtrPreset == partPreset.ID)
.ToList();
foreach (SidekickPartPresetRow presetPart in presetParts)
{
Decorate(dbManager, presetPart);
}
return presetParts;
}
///
/// Gets a list of all the Preset Part rows in the database that have the matching part.
///
/// The Database Manager to use.
/// The part to get all the preset part rows for.
/// A list of all preset part rows in the database for the given part.
public static List GetAllByPart(DatabaseManager dbManager, SidekickPart part)
{
List presetParts = dbManager.GetCurrentDbConnection().Table()
.Where(presetPart => presetPart.PtrPart == part.ID)
.ToList();
foreach (SidekickPartPresetRow presetPart in presetParts)
{
Decorate(dbManager, presetPart);
}
return presetParts;
}
///
/// Ensures that the given preset has its nice DTO class properties set
///
/// The Database Manager to use.
/// The color preset to decorate
/// A color set with all DTO class properties set
private static void Decorate(DatabaseManager dbManager, SidekickPartPresetRow partPreset)
{
if (partPreset != null)
{
if (partPreset.PartPreset == null && partPreset.PtrPreset >= 0)
{
partPreset.PartPreset = SidekickPartPreset.GetByID(dbManager, partPreset.PtrPreset);
}
if (partPreset.Part == null && partPreset.PtrPart >= 0)
{
partPreset.Part = SidekickPart.GetByID(dbManager, partPreset.PtrPart);
}
else if (partPreset.Part == null && partPreset.PtrPart < 0)
{
SidekickPart part = SidekickPart.SearchForByName(dbManager, partPreset.PartName);
if (part != null)
{
partPreset.Part = part;
}
}
}
}
///
/// Updates or Inserts this item in the Database.
///
/// The database manager to use.
public int Save(DatabaseManager dbManager)
{
if (ID < 0)
{
dbManager.GetCurrentDbConnection().Insert(this);
// in theory this could return a different ID, but in practice it's highly unlikely
ID = (int) SQLite3.LastInsertRowid(dbManager.GetCurrentDbConnection().Handle);
}
dbManager.GetCurrentDbConnection().Update(this);
return ID;
}
///
/// Deletes this item from the database
///
/// The database manager to use.
public void Delete(DatabaseManager dbManager)
{
dbManager.GetCurrentDbConnection().Delete(ID);
}
///
/// Checks whether the associated part has a file that exists in the project.
///
/// True if the part has a file in the project; otherwise False.
public bool HasValidPart()
{
return Part == null || Part.FileExists;
}
}
}