import {
  DataTypes,
  InferAttributes,
  InferCreationAttributes,
  Model,
  NonAttribute,
  Sequelize,
} from "sequelize";
import { CustomerInvoice } from "../../../domain";

export type CustomerInvoiceTaxCreationAttributes = InferCreationAttributes<
  CustomerInvoiceTaxModel,
  { omit: "invoice" }
>;

export class CustomerInvoiceTaxModel extends Model<
  InferAttributes<CustomerInvoiceTaxModel>,
  InferCreationAttributes<CustomerInvoiceTaxModel>
> {
  declare tax_id: string;
  declare invoice_id: string;

  declare tax_code: string; //"iva_21"

  // Taxable amount (base imponible)  // 100,00 €
  declare taxable_amount_value: number;
  declare taxable_amount_scale: number;

  // Total tax amount / taxes total // 21,00 €
  declare taxes_amount_value: number;
  declare taxes_amount_scale: number;

  // Relaciones
  declare invoice: NonAttribute<CustomerInvoice>;

  static associate(database: Sequelize) {
    const { CustomerInvoiceModel } = database.models;

    CustomerInvoiceTaxModel.belongsTo(CustomerInvoiceModel, {
      as: "invoice",
      targetKey: "id",
      foreignKey: "invoice_id",
      onDelete: "CASCADE",
    });
  }

  static hooks(database: Sequelize) {}
}

export default (database: Sequelize) => {
  CustomerInvoiceTaxModel.init(
    {
      tax_id: {
        type: DataTypes.UUID,
        primaryKey: true,
      },

      invoice_id: {
        type: DataTypes.UUID,
        allowNull: false,
      },

      tax_code: {
        type: new DataTypes.STRING(),
        allowNull: false,
      },

      taxable_amount_value: {
        type: new DataTypes.BIGINT(), // importante: evita problemas de precisión con valores grandes
        allowNull: false,
        defaultValue: 0,
      },

      taxable_amount_scale: {
        type: new DataTypes.SMALLINT(),
        allowNull: false,
        defaultValue: 2,
      },

      taxes_amount_value: {
        type: new DataTypes.BIGINT(), // importante: evita problemas de precisión con valores grandes
        allowNull: false,
        defaultValue: 0,
      },

      taxes_amount_scale: {
        type: new DataTypes.SMALLINT(),
        allowNull: false,
        defaultValue: 2,
      },
    },
    {
      sequelize: database,
      tableName: "customer_invoice_taxes",

      underscored: true,

      indexes: [
        {
          name: "invoice_id_idx",
          fields: ["invoice_id"],
          unique: false,
        },
      ],

      whereMergeStrategy: "and", // <- cómo tratar el merge de un scope

      defaultScope: {},

      scopes: {},
    }
  );

  return CustomerInvoiceTaxModel;
};
