// 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; } } }