namespace TakeoutSaaS.TenantApi.Contracts.Finance;

/// <summary>
/// 保存发票设置请求。
/// </summary>
public sealed class FinanceInvoiceSettingSaveRequest
{
    /// <summary>
    /// 企业名称。
    /// </summary>
    public string CompanyName { get; set; } = string.Empty;

    /// <summary>
    /// 纳税人识别号。
    /// </summary>
    public string TaxpayerNumber { get; set; } = string.Empty;

    /// <summary>
    /// 注册地址。
    /// </summary>
    public string? RegisteredAddress { get; set; }

    /// <summary>
    /// 注册电话。
    /// </summary>
    public string? RegisteredPhone { get; set; }

    /// <summary>
    /// 开户银行。
    /// </summary>
    public string? BankName { get; set; }

    /// <summary>
    /// 银行账号。
    /// </summary>
    public string? BankAccount { get; set; }

    /// <summary>
    /// 是否启用电子普通发票。
    /// </summary>
    public bool EnableElectronicNormalInvoice { get; set; } = true;

    /// <summary>
    /// 是否启用电子专用发票。
    /// </summary>
    public bool EnableElectronicSpecialInvoice { get; set; }

    /// <summary>
    /// 是否启用自动开票。
    /// </summary>
    public bool EnableAutoIssue { get; set; }

    /// <summary>
    /// 自动开票单张最大金额。
    /// </summary>
    public decimal AutoIssueMaxAmount { get; set; } = 10_000m;
}

/// <summary>
/// 发票记录列表请求。
/// </summary>
public sealed class FinanceInvoiceRecordListRequest
{
    /// <summary>
    /// 开始日期（yyyy-MM-dd）。
    /// </summary>
    public string? StartDate { get; set; }

    /// <summary>
    /// 结束日期（yyyy-MM-dd）。
    /// </summary>
    public string? EndDate { get; set; }

    /// <summary>
    /// 状态（pending/issued/voided）。
    /// </summary>
    public string? Status { get; set; }

    /// <summary>
    /// 类型（normal/special）。
    /// </summary>
    public string? InvoiceType { get; set; }

    /// <summary>
    /// 关键词（发票号/公司名/申请人）。
    /// </summary>
    public string? Keyword { get; set; }

    /// <summary>
    /// 页码。
    /// </summary>
    public int Page { get; set; } = 1;

    /// <summary>
    /// 每页条数。
    /// </summary>
    public int PageSize { get; set; } = 10;
}

/// <summary>
/// 发票记录详情请求。
/// </summary>
public sealed class FinanceInvoiceRecordDetailRequest
{
    /// <summary>
    /// 发票记录 ID。
    /// </summary>
    public string RecordId { get; set; } = string.Empty;
}

/// <summary>
/// 发票开票请求。
/// </summary>
public sealed class FinanceInvoiceRecordIssueRequest
{
    /// <summary>
    /// 发票记录 ID。
    /// </summary>
    public string RecordId { get; set; } = string.Empty;

    /// <summary>
    /// 接收邮箱（可选）。
    /// </summary>
    public string? ContactEmail { get; set; }

    /// <summary>
    /// 开票备注。
    /// </summary>
    public string? IssueRemark { get; set; }
}

/// <summary>
/// 发票作废请求。
/// </summary>
public sealed class FinanceInvoiceRecordVoidRequest
{
    /// <summary>
    /// 发票记录 ID。
    /// </summary>
    public string RecordId { get; set; } = string.Empty;

    /// <summary>
    /// 作废原因。
    /// </summary>
    public string VoidReason { get; set; } = string.Empty;
}

/// <summary>
/// 发票申请请求。
/// </summary>
public sealed class FinanceInvoiceRecordApplyRequest
{
    /// <summary>
    /// 申请人。
    /// </summary>
    public string ApplicantName { get; set; } = string.Empty;

    /// <summary>
    /// 开票抬头（公司名）。
    /// </summary>
    public string CompanyName { get; set; } = string.Empty;

    /// <summary>
    /// 纳税人识别号。
    /// </summary>
    public string? TaxpayerNumber { get; set; }

    /// <summary>
    /// 发票类型（normal/special）。
    /// </summary>
    public string InvoiceType { get; set; } = "normal";

    /// <summary>
    /// 开票金额。
    /// </summary>
    public decimal Amount { get; set; }

    /// <summary>
    /// 关联订单号。
    /// </summary>
    public string OrderNo { get; set; } = string.Empty;

    /// <summary>
    /// 接收邮箱。
    /// </summary>
    public string? ContactEmail { get; set; }

    /// <summary>
    /// 联系电话。
    /// </summary>
    public string? ContactPhone { get; set; }

    /// <summary>
    /// 申请备注。
    /// </summary>
    public string? ApplyRemark { get; set; }

    /// <summary>
    /// 申请时间（可空）。
    /// </summary>
    public DateTime? AppliedAt { get; set; }
}

/// <summary>
/// 发票设置响应。
/// </summary>
public sealed class FinanceInvoiceSettingResponse
{
    /// <summary>
    /// 企业名称。
    /// </summary>
    public string CompanyName { get; set; } = string.Empty;

    /// <summary>
    /// 纳税人识别号。
    /// </summary>
    public string TaxpayerNumber { get; set; } = string.Empty;

    /// <summary>
    /// 注册地址。
    /// </summary>
    public string? RegisteredAddress { get; set; }

    /// <summary>
    /// 注册电话。
    /// </summary>
    public string? RegisteredPhone { get; set; }

    /// <summary>
    /// 开户银行。
    /// </summary>
    public string? BankName { get; set; }

    /// <summary>
    /// 银行账号。
    /// </summary>
    public string? BankAccount { get; set; }

    /// <summary>
    /// 是否启用电子普通发票。
    /// </summary>
    public bool EnableElectronicNormalInvoice { get; set; }

    /// <summary>
    /// 是否启用电子专用发票。
    /// </summary>
    public bool EnableElectronicSpecialInvoice { get; set; }

    /// <summary>
    /// 是否启用自动开票。
    /// </summary>
    public bool EnableAutoIssue { get; set; }

    /// <summary>
    /// 自动开票单张最大金额。
    /// </summary>
    public decimal AutoIssueMaxAmount { get; set; }
}

/// <summary>
/// 发票统计响应。
/// </summary>
public sealed class FinanceInvoiceStatsResponse
{
    /// <summary>
    /// 本月已开票金额。
    /// </summary>
    public decimal CurrentMonthIssuedAmount { get; set; }

    /// <summary>
    /// 本月已开票张数。
    /// </summary>
    public int CurrentMonthIssuedCount { get; set; }

    /// <summary>
    /// 待开票数量。
    /// </summary>
    public int PendingCount { get; set; }

    /// <summary>
    /// 已作废数量。
    /// </summary>
    public int VoidedCount { get; set; }
}

/// <summary>
/// 发票记录列表项响应。
/// </summary>
public sealed class FinanceInvoiceRecordResponse
{
    /// <summary>
    /// 记录 ID。
    /// </summary>
    public string RecordId { get; set; } = string.Empty;

    /// <summary>
    /// 发票号码。
    /// </summary>
    public string InvoiceNo { get; set; } = string.Empty;

    /// <summary>
    /// 申请人。
    /// </summary>
    public string ApplicantName { get; set; } = string.Empty;

    /// <summary>
    /// 开票抬头（公司名）。
    /// </summary>
    public string CompanyName { get; set; } = string.Empty;

    /// <summary>
    /// 发票类型编码。
    /// </summary>
    public string InvoiceType { get; set; } = string.Empty;

    /// <summary>
    /// 发票类型文案。
    /// </summary>
    public string InvoiceTypeText { get; set; } = string.Empty;

    /// <summary>
    /// 金额。
    /// </summary>
    public decimal Amount { get; set; }

    /// <summary>
    /// 关联订单号。
    /// </summary>
    public string OrderNo { get; set; } = string.Empty;

    /// <summary>
    /// 状态编码。
    /// </summary>
    public string Status { get; set; } = string.Empty;

    /// <summary>
    /// 状态文案。
    /// </summary>
    public string StatusText { get; set; } = string.Empty;

    /// <summary>
    /// 申请时间（本地显示字符串）。
    /// </summary>
    public string AppliedAt { get; set; } = string.Empty;
}

/// <summary>
/// 发票记录详情响应。
/// </summary>
public sealed class FinanceInvoiceRecordDetailResponse
{
    /// <summary>
    /// 记录 ID。
    /// </summary>
    public string RecordId { get; set; } = string.Empty;

    /// <summary>
    /// 发票号码。
    /// </summary>
    public string InvoiceNo { get; set; } = string.Empty;

    /// <summary>
    /// 申请人。
    /// </summary>
    public string ApplicantName { get; set; } = string.Empty;

    /// <summary>
    /// 开票抬头（公司名）。
    /// </summary>
    public string CompanyName { get; set; } = string.Empty;

    /// <summary>
    /// 纳税人识别号。
    /// </summary>
    public string? TaxpayerNumber { get; set; }

    /// <summary>
    /// 发票类型编码。
    /// </summary>
    public string InvoiceType { get; set; } = string.Empty;

    /// <summary>
    /// 发票类型文案。
    /// </summary>
    public string InvoiceTypeText { get; set; } = string.Empty;

    /// <summary>
    /// 金额。
    /// </summary>
    public decimal Amount { get; set; }

    /// <summary>
    /// 关联订单号。
    /// </summary>
    public string OrderNo { get; set; } = string.Empty;

    /// <summary>
    /// 接收邮箱。
    /// </summary>
    public string? ContactEmail { get; set; }

    /// <summary>
    /// 联系电话。
    /// </summary>
    public string? ContactPhone { get; set; }

    /// <summary>
    /// 申请备注。
    /// </summary>
    public string? ApplyRemark { get; set; }

    /// <summary>
    /// 状态编码。
    /// </summary>
    public string Status { get; set; } = string.Empty;

    /// <summary>
    /// 状态文案。
    /// </summary>
    public string StatusText { get; set; } = string.Empty;

    /// <summary>
    /// 申请时间（本地显示字符串）。
    /// </summary>
    public string AppliedAt { get; set; } = string.Empty;

    /// <summary>
    /// 开票时间（本地显示字符串）。
    /// </summary>
    public string? IssuedAt { get; set; }

    /// <summary>
    /// 开票人 ID。
    /// </summary>
    public string? IssuedByUserId { get; set; }

    /// <summary>
    /// 开票备注。
    /// </summary>
    public string? IssueRemark { get; set; }

    /// <summary>
    /// 作废时间（本地显示字符串）。
    /// </summary>
    public string? VoidedAt { get; set; }

    /// <summary>
    /// 作废人 ID。
    /// </summary>
    public string? VoidedByUserId { get; set; }

    /// <summary>
    /// 作废原因。
    /// </summary>
    public string? VoidReason { get; set; }
}

/// <summary>
/// 发票开票结果响应。
/// </summary>
public sealed class FinanceInvoiceIssueResultResponse
{
    /// <summary>
    /// 记录 ID。
    /// </summary>
    public string RecordId { get; set; } = string.Empty;

    /// <summary>
    /// 发票号码。
    /// </summary>
    public string InvoiceNo { get; set; } = string.Empty;

    /// <summary>
    /// 开票抬头。
    /// </summary>
    public string CompanyName { get; set; } = string.Empty;

    /// <summary>
    /// 金额。
    /// </summary>
    public decimal Amount { get; set; }

    /// <summary>
    /// 接收邮箱。
    /// </summary>
    public string? ContactEmail { get; set; }

    /// <summary>
    /// 开票时间（本地显示字符串）。
    /// </summary>
    public string IssuedAt { get; set; } = string.Empty;

    /// <summary>
    /// 状态编码。
    /// </summary>
    public string Status { get; set; } = string.Empty;

    /// <summary>
    /// 状态文案。
    /// </summary>
    public string StatusText { get; set; } = string.Empty;
}

/// <summary>
/// 发票记录分页响应。
/// </summary>
public sealed class FinanceInvoiceRecordListResultResponse
{
    /// <summary>
    /// 列表项。
    /// </summary>
    public List<FinanceInvoiceRecordResponse> Items { get; set; } = [];

    /// <summary>
    /// 页码。
    /// </summary>
    public int Page { get; set; }

    /// <summary>
    /// 每页条数。
    /// </summary>
    public int PageSize { get; set; }

    /// <summary>
    /// 总条数。
    /// </summary>
    public int TotalCount { get; set; }

    /// <summary>
    /// 统计。
    /// </summary>
    public FinanceInvoiceStatsResponse Stats { get; set; } = new();
}
